以前の記事「市場トレンドを売買ルールに入れる」の、ルールと売買の関数を独立させる方法の応用編として、今回は動的資金管理をProtraで実践してみます。
・本ブログの内容において、正当性を保証するものではありません。
・本ブログを利用して損失を被った場合でも一切の責任を負いません。
・最終的な決定は、ご自身の判断(自己責任)でお願い致します。
動的資金管理
これまでの記事で行った投資手法は、全て静的資金管理です。静的資金管理では、同ストラテジ内で1回あたりの購入資金を固定していました。
静的資金管理では、リスクを自分で制限できるメリットはあるものの、取引数が少ない期間中は資金を余らせてしまいます。
一方動的資金管理では、あるルールに則り 購入資金を変化させます。
- パラメータの値によって(例. RSIが〇〇を下回ったときは、購入資金を通常の倍にする)
- 市場の状況によって(例. 市場全体が下落傾向なら、購入資金を減らす)
- 残り資金によって
- 等….
今回は、最後の「残り資金によって購入資金を変化させる」動的資金管理を実装してみます。
残予算によって購入資金を変える
実装
動的資金管理の実施ルールは以下のようにします。
購入資金 = 残資金 / 買いシグナルが出た銘柄数
ただし購入資金が最小設定金額を下回った場合には、最小設定金額で購入
「買いシグナルが出た銘柄数」の情報が必要なので、ルールと売買の関数を独立させます。
また買いシグナルが多すぎると、購入資金が最小単位以下となる可能性があるため、最小購入金額を設定しています。
資金が限られるため、買い銘柄に優先順位をつける方法を採用します。
早速コードに書いてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#==== ソート買関数(動的資金管理)==== def SortBuy_d(i) if PricedataExistCheck(Close) return end if $budget/$buyCnt < $buyUnit b_unit = $buyUnit else b_unit = $budget/$buyCnt end $long = 0 $long = Num(b_unit,Close) Buying($order[(int)Code]) end |
1 2 3 4 5 |
#==== 株数 ==== def Num(buyUnit,price) unit = Unit2(price) return (buyUnit / (unit * price)) * unit end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 単元株数(Tllib.py 内の関数) def Unit2(price) unit = Unit if unit return unit end # 不明な場合は推測値を返す。 num = 1000000 / price if num >= 1000 return 1000 elsif num >= 100 return 100 end return 1 end |
$budget は、残り資金
$buyCnt は、買いシグナルが出た銘柄数
$buyUnit は、最小購入金額
$holdは、購入株数
です。
if文を一つ追加するだけですね。
効果を確認
初期予算を5,000万円, 最小購入金額を 100万円として、以下のストラテジを実行します。
◆買い:以下を満たしたとき、翌日の始値が買う
・終値と移動平均(5日)との乖離率が-7%以下
・終値が50円以上
・終値と移動平均(5日)との乖離率が、負の値に大きい順に購入
◆売り:以下のいずれかを満たしたとき、翌日の始値で売る
・終値と移動平均(5日)との乖離率が0%以上
・購入から10日経過
●対象銘柄:売上上位500銘柄
●総予算は5,000万円で固定(損益で変動しない)
はじめに、毎トレードの購入資金が100万円の静的資金管理。
続いて、動的資金管理の場合。
予算を無駄なく投資するため、利益が大幅にアップしています。
もちろん動的資金管理にもデメリットはあります。
- 予算をつぎ込むため、該当銘柄保有中に他の銘柄を購入できない。
- 高資金で購入した銘柄で負けると、損失が大きい。
- 成行注文を想定しているため、高資金購入/売却時、株価を上げて/下げてしまう。
最小購入金額と同じように最大購入資金を設定したり、注文を分割することで、抑制することは可能です。
また、優先的に購入する銘柄の選択でも結果は大きく異なってくるでしょう。
是非いろいろ試してください!