私は、初日の持ち株と新しい取引と価格ティックのフィードに基づいて、一連の持ち株のさまざまなメトリックを計算するように設計されたシステムを設計しています。初期情報は、新しい取引と価格更新のイベントを含むWCFサービスから取得されます。
必要なメトリックには、さまざまな方法で階層に集約する必要がある市場価値(MV)が含まれます。
初期ロード時に、次のようなオブジェクトのセットを取得します。
ポジション[数量:ダブル、セキュリティ:セキュリティ、アカウント:アカウント、戦略:戦略]
セキュリティ[価格:お金、国:国、通貨:CCY]
アカウント[名前:文字列、ファンド:ファンド、マネージャー:マネージャー、通貨:CCY]
戦略[名前:文字列]
ファンド[名前:文字列]
マネージャー[名前:文字列]
多重度は次のようになります。
- マネージャー(1)-manages->(1 .. *)アカウント
- ファンド(1)-で構成されています->(1 .. *)アカウント
- アカウント(1)-含む->(1 .. *)位置
- セキュリティ(1)-中にある可能性があります->(1 .. *)位置
- 戦略(1)-含む->(1 .. *)位置
- 戦略(1)-存在することができます->(1 .. *)アカウント
日中に起こることもたくさんあります:
- セキュリティ価格の変更-セキュリティの価格がa->bから変更されます
- 新しいポジション-トレードがありました
- ポジションの削除-取引がキャンセルされました
フロントエンドから-マネージャー/ファンドレベルでデータを表示できる必要があります。
- マネージャー1
- 合計MV=$ 4800
- 最大の国のエクスポージャー=43%英国
- 合計%MV = 100%
- コンポーネント:リスト>
- 国:リスト>
- マネージャー2
- 合計MV=$ 1200
- 最大の国の曝露=90%米国
- 合計%MV = 100%
- コンポーネント:リスト>
- 国:リスト>
- Fund2
- 合計MV=$ 1200
- 最大の国の曝露=90%米国
- 合計%MV = 100%
- コンポーネント:リスト>
- 国:リスト>
またはセキュリティレベルで
- Sec 1
- MV = $ 1000
- マネージャー1の%= 67%
- ファンド1の%= 48%
- Sec 2
- MV = $ 2000
- マネージャー3の%= 12%
- ファンド2の%= 4%..。
エンティティは、システムに1回だけ存在するように、IDマップに読み込まれるため、証券の価格の変更は、関連するポジションに反映されます。
私はこれを表すためにさまざまな方法を検討しましたが、概念的にはイベントソーシング(http://martinfowler.com/eaaDev/EventSourcing.html)は有望に見えましたが、現在の状態を確認するだけでよいので、おそらくやり過ぎです。
私の現在の考え方は、マネージャー、ファンド、アカウントをポートフォリオオブジェクトとして表すことです。
また、複合パターン(ポートフォリオ:コンポーネント、位置:コンポーネント)+ビジターパターンを使用して、階層+計算ロジックをそれぞれカプセル化します。
ポートフォリオ[オブジェクト:表現、コンポーネント:ListOfComponents、Accept(Visitor v):状態]
コンポーネントにはMV($)もあります(これらは訪問者を使用して計算できます)
MV [position] = * Qty *Security.Price*とします。
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の何パーセントを表現できる必要がありますか?
ポジション5MV/アカウントCMV= 200/600 = 33%
ポジション5MV/ファンドBMV= 200/1600 = 12.5%
値は訪問者を使用して計算できますが、計算結果はどこに保存されますか?
次のような位置5の辞書の場合:辞書percentMV = {[ファンドB、12.5%]、[アカウントC、33%]}
または、関連するポートフォリオでは、個々のポジションのすべてがファンドBによって参照される必要がありますか?また、それを管理するマネージャーの観点から、ポジション5が必要になります。
私が苦労しているもう1つの概念は、国のエクスポージャーの指標です。各証券は、国に関連する一定量のリスクを表しています。したがって、2つのポジションのポートフォリオでは、次のようになります。-100ドルのMV、セキュリティ国=英国-300ドルのMV、国=米国
ポートフォリオのカントリーエクスポージャーは、-100/400 = 25%英国、300/400 = 75%米国です。
この概念を設計に一般化するための最良の方法は何ですか?つまり、データを保存するのに最適な場所はどこですか?