資金管理の実装
ちょっとコードを書いてみた。
my $self = shift ; my $TODAY = shift ; my $myNetRiskAmount ; my $myNetStockAssetAmount ; my $myRiskAmountRemaines ; my $myNewStockAsset ; my @myTradeCandidates ; my @myRemaindesStockAssets ; #今日の分の仮トレードを実行 foreach my $myPsudoTrader (@{$self->{PsudoTraderArray}}) { $myPsudoTrader->ProcessToday($TODAY) ; } #発生したシグナルを集める foreach my $myPsudoTrader (@{$self->{PsudoTraderArray}}) { if ($myPsudoTrader->ShowTomorrowsPlan() ne undef) { push(@myTradeCandidates,$myPsudoTrader) ; } } #今日現在保持している株式資産の出口判定 foreach my $myStockAsset (@{$self->{StockAssetArray}}) { $myStockAsset->ProcessToday($TODAY) ; if ($myStockAsset->ExitFromMarket() ne undef) { #ポジション解消していたら、開放された現金を余力に反映 $self->{CurrentCash} += $myStockAsset->ShowCashReleased() ; $myStockAsset->RecordResult() ; $myStockAsset->DESTROY() ; } elsif ($myStockAsset->EntryExpired()) { $self->{CurrentCash} += $myStockAsset->ShowCashReleased() ; $myStockAsset->DESTORY() ; } elsif ($myStockAsset->EntrySuccessed()) { $self->{CurrentCash} += $myStockAsset->ShowCashReleased() ; push (@myRemaindesStockAssets,$myStockAsset) ; } else { push (@myRemaindesStockAssets,$myStockAsset) ; } } @{$self->{StockAssetArray}} = @myRemaindesStockAssets ; #現在保持している株式資産のストップロスが発動した場合の総損失額と本日終値での総評価額を算出 $myNetRiskAmount = 0 ; $myNetStockAssetAmount = 0 ; foreach my $myStockAsset (@{$self->{StockAssetArray}}) { $myNetRiskAmount += $myStockAsset->ShowCurrentRiskAmount() ; $myNetStockAssetAmount += $myStockAsset->ShowCurrentAmount() ; } #残余リスク予算(現在の総資産(株式資産+保証金)に取るべきリスク(%)を乗じて、現在とっているポジションに必要なリスクを減じたもの)を算出 $myRiskAmountRemaines = int*1 { $myRiskAmountRemaines -= $myTradeCandidate->ShowRiskAmount() ; $myNewStockAsset = StockAsset->New($myTradeCandidate) ; $self->{CurrentCash} -= $myNewStockAsset->EntryBudget() ; push(@{$self->{StockAssetArray}},$myNewStockAsset) ; } }
保証金維持率の考慮が入っていなかったり、購入する株式の単位数調整が入っていなかったり、現在保有してる株式資産と相関の低い市場を優先するアルゴリズムがなかったり。ないない尽くしだけど、まあ、だいたいのフィーリングとしてはこんなもんかなあと。
完結した機能をクラスに閉じ込めて、バリエーション毎(具体的には銘柄毎)にインスタンス生成。個々のインスタンスは配列に入れてforeachループでやりたい事をやる。結構Perl使えるようになってきたかも。ま、PerlらしいCoolな使い方は、できませんが;;
*1:$self->{CurrentCash} + $myNetStockAssetAmount) * $self->{RISKPERCENT} / 100) - $myNetRiskAmount ; #発生したシグナルのうち、残余リスク予算で仕掛けられるものを選んで仕掛ける foreach my $myTradeCandidate (@myTradeCandidates) { if ($myRiskAmountRemaines > $myTradeCandidate->ShowRiskAmount(