SwiftModifiedDietz

一个使用修正的迪茨方法计算投资组合表现的工具。

作为一个开源 Swift 库提供,可以集成到其他应用程序中。

SwiftModifiedDietzOpenAlloc 开源 Swift 软件工具家族的一部分。

修正的迪茨方法 (ModifiedDietz)

有关该方法的详细信息,请查阅维基百科上的 修正的迪茨方法 页面。

一个例子:一个投资组合在一个月初的市场价值为 $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 属性检测此类值。

类型

MarketValueDeltaCashFlowMap 类型在 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>

初始化

提供了两个初始化器,一个比另一个更明确,但功能上等效

如果提供了无效的参数(例如,持续时间为零的期间),初始化将失败并返回 nil

初始化值也作为属性提供

实例属性和方法

计算属性是惰性的,这意味着它们仅在首次需要时才被计算。

另请参阅

此库是 OpenAlloc 项目 的成员。

许可证

版权所有 2021, 2022 OpenAlloc LLC

根据 Apache License, Version 2.0(“许可证”)获得许可;除非遵守许可证,否则您不得使用此文件。您可以在以下网址获得许可证副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则根据许可证分发的软件按“AS IS”基础分发,不附带任何形式的明示或暗示的保证或条件。有关管理权限和限制的特定语言,请参阅许可证。

贡献

欢迎贡献。我们鼓励您提交拉取请求以修复错误、改进文档或提供新功能。

拉取请求不必是生产就绪的功能或修复。它可以是拟议更改的草案,或者仅仅是一个测试,以表明预期的行为存在错误。关于拉取请求的讨论可以从那里开始。

贡献最终应具有足够的测试覆盖率。请参阅当前实体的测试,以了解预期的覆盖率。