我正在设计一个系统,旨在根据最初一天的持有量以及新交易和价格变动的馈送来计算一组持有量的各种指标。初始信息来自 WCF 服务,其中包含新交易和价格更新事件。
所需的指标包括市场价值 (MV),也需要以各种方式汇总到层次结构中。
在初始加载时,我们得到一组对象,如下所示:
职位[数量:双倍,安全:安全,帐户:帐户,策略:策略]
安全性[价格:货币,国家:国家,货币:CCY]
账户[名称:字符串,基金:基金,经理:经理,货币:CCY]
策略[名称:字符串]
基金[名称:字符串]
经理[名称:字符串]
多重性看起来像这样:
- 经理 (1) -manages-> (1..*) 帐户
- 基金 (1) - 由 -> (1..*) 账户组成
- 账户 (1) -contains-> (1..*) 头寸
- 安全性 (1) - 可以在-> (1..*) 位置
- 策略 (1) -contains-> (1..*) 位置
- 策略 (1) - 可以存在于-> (1..*) 帐户中
白天还会发生很多事情:
- 证券价格变化 - 证券价格从 a -> b 变化
- 新仓位 - 有一笔交易
- 删除头寸 - 交易已被取消
从前端 - 我们需要能够查看经理/基金级别的数据,即
- 经理 1
- 总价值 = 4800 美元
- 最大的国家曝光 = 43% 英国
- 总 % MV = 100%
- 组件:列表>
- 国家:列表>
- 经理 2
- 总价值 = 1200 美元
- 最大的国家暴露 = 90% 美国
- 总 % MV = 100%
- 组件:列表>
- 国家:列表>
- 基金2
- 总价值 = 1200 美元
- 最大的国家暴露 = 90% 美国
- 总 % MV = 100%
- 组件:列表>
- 国家:列表>
或者在安全级别
- 第 1 节
- MV = 1000 美元
- 经理 1 的百分比 = 67%
- 基金 1 的百分比 = 48%
- 第二节
- MV = 2000 美元
- 经理 3 的百分比 = 12%
- 基金 2 的百分比 = 4% ...
实体将加载到身份映射中,以确保它们在系统中仅存在一次,因此证券价格的变化将反映在相关头寸中。
我已经研究了各种方式来表示这一点,从概念上讲,事件采购 (http://martinfowler.com/eaaDev/EventSourcing.html) 看起来很有希望,尽管我们只需要查看当前状态,因此可能是矫枉过正。
我目前的思路是将Manager、Fund和Account表示为Portfolio对象:
并使用复合模式(组合:组件,职位:组件)+访问者模式分别封装层次结构+计算逻辑。
投资组合[对象:表示,组件:ListOfComponents,Accept(Visitor v):状态]
组件也有 MV(以 $ 为单位)(这些可以使用访问者计算)
设 MV [位置] = *数量 * 安全性.价格*
设 MV [投资组合] = 以下所有仓位 MV 的总和。
所以我们有以下复合结构:
- 投资组合(代表:基金A,MV:500)
- 投资组合(代表:账户 A,MV:500)
- 位置 1 (MV: 300)
- 位置 2 (MV: 200)
- 投资组合(代表:账户 A,MV:500)
- 投资组合(代表:基金 B,MV 1600)
- 投资组合(代表:账户 B,MV:1000)
- 位置 3 (MV: 800)
- 位置 4 (MV: 200)
- 投资组合(代表:账户 C,MV:600)
- 位置5(MV:200)
- 位置6(MV:400)
- 投资组合(代表:账户 B,MV:1000)
我的第一个问题是表示不同级别的百分比 - 系统需要能够表示第 5 位构成的资金 B 和账户 C 的百分比?
仓位 5 MV / 账户 C MV = 200 / 600 = 33%
头寸 5 MV / 基金 B MV = 200 / 1600 = 12.5%
可以使用访问者计算值,但我们将计算结果存储在哪里?
在位置 5的字典中,如下所示: Dictionary percentMV = {[Fund B, 12.5%], [Account C, 33%]}
或者在相关的投资组合中,在这种情况下,所有的单个头寸都需要被基金 B 参考?就管理它的经理而言,我们还需要位置 5。
我遇到困难的另一个概念是国家风险指标——每一种证券都代表了与一个国家相关的一定风险。因此,有两个职位的投资组合: - MV 100 美元,安全国家 = 英国 - MV 300 美元,国家 = 美国
该投资组合的国家风险敞口为 - 100/400 = 25% 英国和 300/400 = 75% 美国。
将这个概念推广到设计中的最佳方式是什么,即存储数据的最佳位置在哪里?