FC2ブログ

記事一覧

実践Protra (第14回) 「予算上限をシミュレーションする」

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で実行してみることにしましょう!

gyaku10.png

PtSimで実行すると、このようになります。
(銘柄リスト「売買代金上位500位」、2018年3月29日までの株価データでシミュレーションした結果)

Protraのストラテジは通常、銘柄ごとにシミュレーションを行います。
しかし今回のストラテジでは銘柄ごとではなく、日付順にシミュレーションされているのがわかりますでしょうか。

上記のような仕組みの違いを提供してくれるのが、ストラテジの1行目に書いた「# loop-type: date-only」なのです。

gyaku11.png

2008年のリーマンショックの頃を見てみましょう。
「gyaku3.pt」はその名の通り逆張りストラテジなので、多数の株価が暴落したときには、多数の「買い指示」が出ます。
よって、大幅に資金が足りなくなっていることがわかります。

2008年以外でも、大きな暴落時には資金不足になっているので、一通り眺めてみてください。

gyaku12.png

成績です。
2018年3月29日現在、プロフィットファクターは2.12でした。


gyaku13.png

利益曲線のグラフです。
シミュレーション上、買い指示が出た銘柄を全て買えていなくても、暴落時には強烈なドローダウンを記録しています。

では、資金管理の仕組みを入れていない、元の「gyaku3.pt」と比べてみましょう。


gyaku14.png

成績です。
2018年3月29日現在、プロフィットファクターは2.96でした。

gyaku15.png

利益曲線のグラフです。
リーマンショックの暴落時に出た買い指示を、すべて買っておけば利益もものすごく大きくなっています。
(2008年当時、現在の「売買代金上位500位」の銘柄が500位までに全て入っているわけではないので、あくまでシミュレーション結果ですが)
しかし、現実的にはこれだけたくさんの銘柄を買う資金はありません。


予算上限の仕組みを取り入れると、そのストラテジのより現実的な成績が見えることがわかりました。


次回は、このストラテジ内容を説明する予定です。

(第15回に続く)




にほんブログ村 投資ブログ 投資でセミリタイア生活へ
にほんブログ村

にほんブログ村 株ブログ 投資信託へ
にほんブログ村

にほんブログ村 株ブログ 株 自動売買へ
にほんブログ村


スポンサーサイト



コメント

No title

おはようございます。
いつも丁寧なプログラム作成をされているので、読んでいてもわかりやすく、大変勉強になります。
今回の資金管理は以前から私も悩んでいたところです。たくさん出たシグナルの中から、どの銘柄を選ぶかに裁量が入ってしまうと、実際は損失になってしまうのではないかと。
ところで、今回のプログラムは、同日にシグナルの出た銘柄を若い順に予算の許す範囲でエントリーする、ということですね?

Re: No title

> おはようございます。
> いつも丁寧なプログラム作成をされているので、読んでいてもわかりやすく、大変勉強になります。

若いころ会社で先輩に「プログラムの書き方は下手でもいいから、他の人が読みやすいように書け」と何度も何度も厳しく注意されたの今でも思い出しながら書いてます。

> 今回の資金管理は以前から私も悩んでいたところです。たくさん出たシグナルの中から、どの銘柄を選ぶかに裁量が入ってしまうと、実際は損失になってしまうのではないかと。
> ところで、今回のプログラムは、同日にシグナルの出た銘柄を若い順に予算の許す範囲でエントリーする、ということですね?

はい、おっしゃる通りです。

判断材料を増やすには、どの銘柄を選ぶかの指標となる「何か」を新しく $set[i] のように銘柄ごとに用意して計算し、その値を比べてどの銘柄を買うか決める、という作り方になると思います。

実は3月後半は、上記にチャレンジしていたためブログの更新が止まっていました。
まだ形になっていないので、完成したらブログで公開するかもしれません。

コメントの投稿

非公開コメント

プロフィール

なるぞう

Author:なるぞう
予定より4年早く、40代半ばでリタイアした者です。果たして、働かずに生きていくことができるのか? 鍵を握るのは投資信託と株式自動売買です。

成績

2015年  -82,112
2016年 +118,531
2017年 +792,678
2018年 -1,142,201
2019年 +1,105,654
2020年 +176,814

フリーエリア

にほんブログ村 投資ブログ 投資でセミリタイア生活へ

にほんブログ村 株ブログ 投資信託へ

にほんブログ村 株ブログ 株 自動売買へ