混合仪器组合的最优OO设计

时间:2012-05-07 12:57:59

标签: oop design-patterns finance

我正在设计一个系统,该系统旨在根据初始日期持有以及新交易和价格记录的馈送来计算一组持有的各种指标。 初始信息来自WCF服务,其中包含新交易和价格更新的事件。

所需的指标包括市场价值(MV),也需要以各种方式聚合到层次结构中。

在初始加载时,我们得到一组看起来像的对象:

职位 [数量:双倍,安全:安全,账户:账户,策略:策略]

安全性 [价格:货币,国家:国家,货币:CCY]

帐户 [姓名:字符串,基金:基金,经理:经理,货币:CCY]

策略 [姓名:字符串]

基金 [姓名:字符串]

经理 [姓名:字符串]

多样性如下所示:

  • 经理(1) - 管理 - > (1 .. *)帐户
  • 基金(1) - 由 - >组成。 (1 .. *)帐户
  • 帐户(1) - 包含 - > (1 .. *)职位
  • 安全性(1) - 可以在> (1 .. *)职位
  • 策略(1) - 包含 - > (1 .. *)职位
  • 策略(1) - 可以存在于> (1 .. *)帐户

白天还会发生许多事情:

  • 安全价格变动 - 安全价格变化来自 - > B'/ LI>
  • 新职位 - 已有交易
  • 取消仓位 - 交易已取消

从前端 - 我们需要能够查看经理/基金级别的数据,即

  • 经理1
    • 总MV = $ 4800
    • 最大的国家曝光率= 43%英国
    • 总%MV = 100%
    • 组件:列表>
    • 国家/地区:列表>
  • 经理2
    • 总MV = $ 1200
    • 最大的国家曝光率= 90%美国
    • 总%MV = 100%
    • 组件:列表>
    • 国家/地区:列表>
  • Fund2
    • 总MV = $ 1200
    • 最大的国家曝光率= 90%美国
    • 总%MV = 100%
    • 组件:列表>
    • 国家/地区:列表>

或在安全级别

  • 第1节
    • MV = $ 1000
    • %1经理1 = 67%
    • 基金1%= 48%
  • 第2节
    • MV = $ 2000
    • %3经理3 = 12%
    • 基金2%= 4% ...

实体将加载到身份图中,以确保它们仅在系统中存在一次,因此对安全性价格的更改将反映在相关位置。

我已经通过各种方式来代表这一点,从概念上讲,事件采购(http://martinfowler.com/eaaDev/EventSourcing.html)看起来很有前景,尽管我们只需要查看当前状态所以可能有点矫枉过正。

我目前的想法是将经理基金帐户表示为投资组合对象:

使用复合模式(Portfolio:Component,Position:Component)+访客模式分别封装层次结构+计算逻辑。

投资组合 [对象:代表,组件:ListOfComponents,接受(访客v):状态]

组件也有MV(以$计)(这些可以使用访客计算)

让MV [position] = * Qty * Security.Price *

让MV [投资组合] =以下所有头寸MV的总和。

所以我们有以下复合结构:

  • 投资组合(代表:基金A,MV: 500
    • 投资组合(代表:账户A,MV: 500
      • 位置1(MV:300)
      • Position2(MV:200)
  • 投资组合(代表:基金B,MV 1600
    • 投资组合(代表:账户B,MV: 1000
      • Position3(MV:800)
      • Position4(MV:200)
    • 投资组合(代表:账户C,MV: 600
      • Position5(MV:200)
      • Position6(MV:400)

我的第一个问题是各种百分比水平的表示 - 系统需要能够代表资金B和账户C在职位5中占多少百分比?

位置5 MV /账户C MV = 200/600 = 33%

职位5 MV /基金B MV = 200/1600 = 12.5%

可以使用访客计算值,但我们在哪里存储计算结果?

位置5 的字典中,如下所示: 字典percentMV = {[基金B,12.5%],[账户C,33%]}

或者在相关投资组合中,所有个别头寸都需要由基金B引用? 我们还需要管理它的管理员的第5位。

我遇到困难的另一个概念是国家/地区曝光度量标准 - 每个安全性代表与某个国家/地区相关的一定数量的风险。 所以有两个职位组合:   - MV为100美元,安全国家=英国   - MV 300美元,国家=美国

投资组合的国家风险为 - 100/400 = 25%英国,300/400 = 75%美国。

将这个概念概括为设计的最佳方法是什么,即哪里有最佳存储数据的地方?

1 个答案:

答案 0 :(得分:1)

投资组合是一个好主意,可以表示一组头寸的任意分段;请务必查看Specification pattern (pdf)以获取指定投资组合的包含条件的通用方法。事实上, Analysis Patterns (Martin Fowler)中描述的组合模式与 域驱动设计(Eric Evans)中描述的规范模式。

现在,投资组合只代表职位的纳入标准。要以不同方式实际汇总头寸,请查看企业分部模式(在分析模式中描述)。 企业细分是构成您的域(在您的情况下:安全性,经理和基金)的不同维度元素的一部分,其中有趣的度量可以汇总,计算和存储(如市场价值和国家风险)。

另外,请务必查看更多基本模式,例如 Money 数量范围;并始终使用小数整数来存储货币价值或货币计算费率。