一个使用修正的迪茨方法计算投资组合表现的工具。
作为一个开源 Swift 库提供,可以集成到其他应用程序中。
SwiftModifiedDietz 是 OpenAlloc 开源 Swift 软件工具家族的一部分。
有关该方法的详细信息,请查阅维基百科上的 修正的迪茨方法 页面。
一个例子:一个投资组合在一个月初的市场价值为 $105
,到月末降至 $100
。中途提取了 $10
。净表现为 +5.0%
。
typealias MD = ModifiedDietz<Double>
let df = ISO8601DateFormatter()
let beg = df.date(from: "2020-06-01T12:00:00Z")!
let mid = df.date(from: "2020-06-16T00:00:00Z")!
let end = df.date(from: "2020-06-30T12:00:00Z")!
let period = DateInterval(start: beg, end: end)
let mv = MD.MarketValueDelta(105, 100)
let cf: MD.CashflowMap = [mid: -10.0]
let md = MD(period, mv, cf)!
print("\(md.performance * 100)%")
=> 5.0%
请注意,如果起始市场价值和调整后的净现金流之和为 0,则 performance
可能会返回 NaN。可以使用返回值的 .isNaN
属性检测此类值。
MarketValueDelta
和 CashFlowMap
类型在 ModifiedDietz
中声明,其中 T
是您的 BinaryFloatingPoint
数据类型
MarketValueDelta
指定了期间的期初和期末市场价值。请注意,end
值可能小于 start
值。
public struct MarketValueDelta {
public let start, end: T
public init(start: T, end: T) {
self.start = start
self.end = end
}
}
CashFlowMap
指定了特定日期的现金流入(正数)或流出(负数)。(期间之外的日期将被忽略。)
typealias CashflowMap = [Date: T]
通常可以方便地声明您自己的派生类型
typealias MD = ModifiedDietz<Float>
提供了两个初始化器,一个比另一个更明确,但功能上等效
init?(period: DateInterval, startValue: T, endValue: T, cashflowMap: [Date: T], epsilon: T)
- 方便地使用显式参数初始化 ModifiedDietz。
init?(DateInterval, ModifiedDietz<T>.MarketValueDelta, ModifiedDietz<T>.CashflowMap, epsilon: T)
- 使用指定的参数初始化 ModifiedDietz。
如果提供了无效的参数(例如,持续时间为零的期间),初始化将失败并返回 nil
。
初始化值也作为属性提供
let period: DateInterval
- 将计算表现的期间。注意:start < x <= end
;不包含开始;包含结束。
let marketValue: ModifiedDietz<T>.MarketValueDelta
- 期初和期末市场价值。
let rawCashflowMap: ModifiedDietz<T>.CashflowMap
- 期间内日期的可选现金流映射
let epsilon: T
- 用于比较非常接近的值的可选精度。
计算属性是惰性的,这意味着它们仅在首次需要时才被计算。
var adjustedNetCashflow: T
- 调整后的净现金流是每个现金流 Fi
乘以其权重 Wi
的总和。也称为总时间加权现金流 (ttwcf)
var adjustedPeriod: DateInterval
- 净期间排除了 (1) 用户注资之前的时间,以及 (2) 用户撤资之后的时间。
var averageCapital: T
- 期间内的平均资本。
var gainOrLoss: T
- 期间内的总收益(或损失),独立于现金流。
var netCashflowMap: ModifiedDietz<T>.CashflowMap
- 期间的有效现金流映射。包括 period.start < $0 <= period.end
范围内的非零现金流
var netCashflowTotal: T
- 期间的净外部流入 (F)。也称为总净现金流 (tncf)。对投资组合的贡献被视为正向现金流,而提款则为负向现金流。
var orderedCashflowDates: [Date]
- 有序的有效现金流日期列表。
var performance: T
- 计算的收益率 (R)。注意:如果起始市场价值和调整后的净现金流之和为 0
,则可能返回 NaN/Inf
。
此库是 OpenAlloc 项目 的成员。
版权所有 2021, 2022 OpenAlloc LLC
根据 Apache License, Version 2.0(“许可证”)获得许可;除非遵守许可证,否则您不得使用此文件。您可以在以下网址获得许可证副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则根据许可证分发的软件按“AS IS”基础分发,不附带任何形式的明示或暗示的保证或条件。有关管理权限和限制的特定语言,请参阅许可证。
欢迎贡献。我们鼓励您提交拉取请求以修复错误、改进文档或提供新功能。
拉取请求不必是生产就绪的功能或修复。它可以是拟议更改的草案,或者仅仅是一个测试,以表明预期的行为存在错误。关于拉取请求的讨论可以从那里开始。
贡献最终应具有足够的测试覆盖率。请参阅当前实体的测试,以了解预期的覆盖率。