Protraを使って、実践で役立ちそうなストラテジや技を研究する連載「実践Protra」です。
初心者向けの「Protra入門」を全て読んだ方向けに書いています。
今回は、限られた資金の中でシミュレーションする方法について説明します。
これまで、連載の中で様々なコメントをいただきました。
その中で「資金管理はシミュレーションしていないのですか?」という内容のコメントが何度かありました。
もちろん、私も気にはなっていました。
しかし、資金管理をPtSimでシミュレーションするには、
Protraのマニュアルに書いてある通り 、ストラテジの大幅な作り替えが必要になります。
よってそれなりに時間がかかるため、後回しにしていました。
今回、形になったので報告させていただきます。
仕組みを理解すれば、
銘柄を横断して情報を共有するストラテジを作ることができるようになります。 題材ですが、
「Protra入門」(第9回:最終回) で作った「gyaku3.pt」を使うことにします。
「gyaku3.pt」に予算上限の仕組みを追加してみましょう。
ストラテジ全体を作り直します。
参考にするのは、Protraをインストールした時に付属していたストラテジ「MA Cross with Cap.pt」です。
このストラテジは予算上限の仕組みが入っています。
真似をして作ってみました。
注意) 今回記載したストラテジは、私(なるぞう)が実際に使っているストラテジではありません。 資金管理を説明するために作ったストラテジであり、このストラテジを使って実際の日本株売買は行っていません。 記載したストラテジを使って、あなたが実際に株式売買を行った場合の結果について当ブログおよび私は一切の責任を負いませんので、あらかじめご了承ください。 上記了解いただいた方のみ、ご覧ください。 投資は自己責任でお願いいたします。 # loop-type: date-only //============================== // gyaku3_money.pt //------------------------------ // このシステムのルール // // 1. 保有株がない状態のとき // ・5日間移動平均との乖離率が-15%を下回った。 // ・終値が150円以上である。 // ・出来高が10万以上である。 // 以上が満たされた場合約100万円分を終値で買う。 // // 2. 保有株がある状態のとき // ・購入してから5日までに、終値が買値の1.05倍になった。(5%の利益) // ・購入してから6日から9日までに、終値が買値の1.02倍になった。(2%の利益) // ・購入してから10日経過した。 // 以上のうち1つでも満たされた場合保有株をすべて売る。 //------------------------------ // written by naruzou, 2018/03/30 // daraiさん作のLDS2.ptをベースに作成 // panacoranさん作MA Cross with CAP.ptの予算上限の仕組みを使用 //=============================== //==================== // 準備 //==================== #include <TIlib> // 銘柄の数だけグローバル変数を用意するために現在の銘柄数を調べる codes = CodeList # 銘柄数が違う場合には銘柄リストが異なっているのでエラーにする。 if $code_num && $code_num != Length(codes) Print("前回と異なる銘柄リストでは実行できません。") Dummy end $code_num = Length(codes) if !$__INIT__ $budget = 10000000 # 投資総額 (1000万円) // loop-type: date-only でPtSimを動かすときは // 使うグローバル変数を銘柄数分用意する必要があるため // 配列を使って用意する。 $BB = [$code_num] $set = [$code_num] $buy = [$code_num] $hold = [$code_num] $__INIT__ = 1 end //==================== // 株数 //==================== def Num(price) unit = Unit2(price) return (1000000 / (unit * price)) * unit end # 文字列型のat作用素を全体に反映させるためにシステムを関数にする。 def Main(i) //==================== // 条件(条件1、条件2共通部分) //==================== # まだ上場していない銘柄は株価データがないためnullが返る。 if Index == null #まだ上場していない場合 return end if ! $BB[i] # TIlibのオブジェクトを生成する。 $BB[i] = BB_new(5) # 銘柄ごとのグローバル変数を初期化する。 $hold[i] = 0 return end # 指標の計算を一日進める。 BB_next($BB[i]) ma = BB_value($BB[i]) # 指標の計算に必要な日数を経過していない場合は何もしない。 if ! ma return end // 終値と移動平均の乖離率を計算する r = 100*(Close - ma)/ma //==================== // 条件1 //==================== # entryの条件を判定する。 if (! $hold[i] && r < -15 && Close >= 150 && Volume >= 100) //==================== // 売買(買い) //==================== if ! Close return end long = Num(Close) # 100万円で買えないなら何もしない。 if long == 0 return end # 予算を超えない場合だけ買う。 if long * Close <= $budget $budget = $budget - long * Close $hold[i] = long $buy[i] = Close Buy(Close, $hold[i]) // Print("B 予算残り = "+ $budget) $set[i] = 0 else PrintLog("予算を超過しています。") end //==================== // 条件2 //==================== elsif $hold[i] if ! Close return end sell = 0 $set[i] = $set[i] + 1 // 購入してから5日までに5%上昇したら売り if $set[i] < 6 && Close > 1.05 * $buy[i] sell = 1 end // 購入してから6日以降に2%上昇したら売り if $set[i] > 5 && Close > 1.02 * $buy[i] sell = 1 end // 10日経過したら売り if $set[i] > 9 sell = 1 end //==================== // 売買(売り) //==================== // sell の値が0以外なら売り指示 if sell != 0 # exitの条件を満たしている場合。 Sell(Close, $hold[i]) $budget = $budget + Close * $hold[i] $hold[i] = 0 // Print("S 予算残り = "+ $budget) end end end //==================== // 銘柄コードを変えながらMain関数を実行 //==================== i = -1 while i + 1 < $code_num i = i + 1 {codes[i]}Main(i) // 文字列型at作用素を与えて実行する。 endなんだか、ずいぶん難しくなりました。
このストラテジの仕組み、内容の説明は次回以降に行います。
ポイントは、最初の方にある「$budget」に予算の総額を入れておくことです。
この例では1000万円としています。
「$budget」の値は銘柄を横断して共有しており、これによって予算上限をシミュレーションできます。
今回は、まずPtSimで実行してみることにしましょう!
PtSimで実行すると、このようになります。
(銘柄リスト「売買代金上位500位」、2018年3月29日までの株価データでシミュレーションした結果)
Protraのストラテジは通常、銘柄ごとにシミュレーションを行います。
しかし今回のストラテジでは
銘柄ごとではなく、日付順にシミュレーションされている のがわかりますでしょうか。
上記のような仕組みの違いを提供してくれるのが、ストラテジの1行目に書いた「# loop-type: date-only」なのです。
2008年のリーマンショックの頃を見てみましょう。
「gyaku3.pt」はその名の通り逆張りストラテジなので、多数の株価が暴落したときには、多数の「買い指示」が出ます。
よって、大幅に資金が足りなくなっていることがわかります。
2008年以外でも、大きな暴落時には資金不足になっているので、一通り眺めてみてください。
成績です。
2018年3月29日現在、プロフィットファクターは2.12でした。
利益曲線のグラフです。
シミュレーション上、買い指示が出た銘柄を全て買えていなくても、暴落時には強烈なドローダウンを記録しています。
では、資金管理の仕組みを入れていない、元の「gyaku3.pt」と比べてみましょう。
成績です。
2018年3月29日現在、プロフィットファクターは2.96でした。
利益曲線のグラフです。
リーマンショックの暴落時に出た買い指示を、すべて買っておけば利益もものすごく大きくなっています。
(2008年当時、現在の「売買代金上位500位」の銘柄が500位までに全て入っているわけではないので、あくまでシミュレーション結果ですが)
しかし、現実的にはこれだけたくさんの銘柄を買う資金はありません。
予算上限の仕組みを取り入れると、そのストラテジのより現実的な成績が見えることがわかりました。
次回は、このストラテジ内容を説明する予定です。
(
第15回 に続く)
にほんブログ村 にほんブログ村 にほんブログ村
スポンサーサイト