株価 - バックテスト(RCI版)!
Updated:
Ruby + MySQL で自作した株価取得のシステム。 全市場(東京・大阪・名古屋・札幌・福岡)の全銘柄の1983年からの全取引データを取得しています。
以前は、売買サイン発生後の株価の挙動を集計しました。
今回は、「RCI(順位相関指数)」での計算で発生した売買サインデータを基に、取引をしていた場合にどのような結果(損益)になるのかを検証していました。 通常、このようなテストのことをバックテストと言います。
全体的にどんな傾向があるのかを把握するのと、Ruby (+ MySQL) の学習が目的です。 ※興味が無ければスルーしてください。
以下に、前提条件・検証結果を掲載します。
1.前提条件等
1.売買サインの定義
-
DEF-1 ( RCIを使った順張り戦略 ) 買いサイン : RCI が 0% を下から上抜けた時 売りサイン : RCI が 0% を上から下抜けた時
-
DEF-2 ( RCIを使った逆張り戦略 ) 買いサイン : RCI -80% を上から下抜けた時 売りサイン : RCI +80% を下から上抜けた時 ※70%, 75% とする場合もあり。
としました。 RCI を計算する日数は [ 9, 26, 52 ] の3種類としました。 また、調整後終値(株式分割があった場合の調整値)を考慮していません。
2.検証銘柄と検証期間
2012年3月31日現在上場している全市場の3,592銘柄を対象に、2000年1月1日から2011年12月31日の株価データを使用して検証しました。 また、複数の市場に上場している銘柄については、優先市場のみで検証しました。 ※全取引件数は 7,926,658 件
3.注文条件
- 資金は 5,000,000 円に設定
- 無ポジション中に買いサイン発生で、買いエントリ
- 買いポジション中にストップロス発生で、エグジット
- 買いポジション中に売りサイン発生で、エグジット
- 無ポジション中に売りサイン発生で、売りエントリ
- 売りポジション中にストップロス発生で、エグジット
- 売りポジション中に売りサイン発生で、エグジット
- エントリ・エグジットは翌営業日の始値で行う
- 手数料は、SBI証券の手数料(スタンダードプラン)を使用する。
- リスク率は 0.05 に設定
- ストップロス率は 0.4 に設定
- スリッページは 1 に設定
- 呼び値も考慮
- エントリ時は、毎回資金残高中で投資可能な最高額を投資
- エントリ時に資金残高が不足する場合はエントリしない。
各種用語については、各自でお調べください。 検証アルゴリズムは以下の書籍(エクセルでの検証)も参考にしています。
4.検証方法
- 各銘柄について、対象の期間内のデータで売買サインの発生を検証する。
- 各銘柄について、上記3の「注文条件」にしたがって、バックテストを行う。 算出項目:売買単位、手数料、損益、総損益、資金残高、最大ドローダウン
- 全銘柄のバックテスト結果を集計する。 検証項目:総損益、利益、損益、プロフィットファクター、トレード回数、 勝率、勝ちトレード数、負けトレード数、最大利益額、最大損失額、 総手数料額、最大ドローダウン、 平均損益額、平均利益額、平均損失額
2.検証結果
以下は、9日で検証した結果です。
1.バックテスト結果
買い・売り両方のエントリを想定して検証しています。 全銘柄のトータルなので、莫大な数値となっています。 今回の売買条件ではこの検証でも総損益がマイナスになりますが、順張り戦略より逆張り戦略の方が利益が出るようです。 また、売りからエントリーした場合の方が利益が出るようです。 ちなみに、順張り・逆張りとも、9日、26日、52日で集計した結果のうち、逆張り・52日で集計した場合が一番効果があり、総損益は -966,559,597 円でした。
[ DEF-1 ( 順張り ) ]
−−−−−−−−−−− [ TRADE(ALL) ][ TRADE(LONG) ][ TRADE(SHORT) ]
総損益 -6,121,162,159 -4,661,390,506 -1,459,771,653
利益 23,726,594,890 11,335,844,557 12,390,750,333
損益 -29,847,757,049 -15,997,235,063 -13,850,521,986
プロフィットファクター 79.49 70.86 89.46
トレード回数 716,403 350,517 365,886
勝率 10.99% 9.77% 12.16%
勝ちトレード数 78,754 34,253 44,501
負けトレード数 637,649 316,264 321,385
最大利益額 1,322,432 1,120,766 870,166
最大損失額 -259,396 -221,850 -211,315
総手数料額 1,538,142,902 752,354,326 785,788,576
最大ドローダウン -304,007 -243,478 -247,464
[ DEF-2 ( 逆張り ) ]
−−−−−−−−−−− [ TRADE(ALL) ][ TRADE(LONG) ][ TRADE(SHORT) ]
総損益 -1,417,740,235 -2,035,547,744 617,807,509
利益 19,635,472,479 10,333,613,008 9,891,215,862
損益 -21,642,569,105 -12,369,160,752 -9,273,408,353
プロフィットファクター 90.72 83.54 106.66
トレード回数 400,292 229,550 170,742
勝率 17.47% 20.41% 13.52%
勝ちトレード数 69,958 46,861 23,097
負けトレード数 330,334 182,689 147,645
最大利益額 1,200,383 979,273 747,356
最大損失額 -251,987 -229,495 -189,138
総手数料額 935,956,093 537,040,121 398,915,972
最大ドローダウン -280,191 -258,166 -194,080
2.平均損益・利益・損失額集計
各銘柄でバックテスト(算出)した平均損益額・平均利益額・平均損失額の平均値・最大値・最小値を算出。 通常、各銘柄で算出した場合、平均損益額=平均利益額+平均損失額となりますが、全銘柄を集計した場合には数値の性質上イコールにはなりません。 イメージをつかむために全銘柄の平均値・最大値・最小値を算出してみました。 逆張り戦略の売りからエントリーした場合が一番利益が出るようです。
[ DEF-1 ( 順張り ) ]
[ 全トレード ]
AVG ( MAX MIN )
[P/L ] -7,106 ( 673,798 -158,998 )
[PROFIT] 294,771 ( 6,236,949 0 )
[LOST ] -52,000 ( 0 -902,027 )
[ 買いトレード ]
AVG ( MAX MIN )
[P/L ] -12,743 ( 1,054,677 -178,385 )
[PROFIT] 320,993 ( 11,729,207 0 )
[LOST ] -55,692 ( 0 -864,447 )
[ 売りトレード ]
AVG ( MAX MIN )
[P/L ] -2,405 ( 435,316 -227,623 )
[PROFIT] 270,422 ( 3,997,575 0 )
[LOST ] -48,262 ( 0 -945,454 )
[ DEF-2 ( 逆張り ) ]
[ 全トレード ]
AVG ( MAX MIN )
[P/L ] -2,372 ( 8,395,966 -218,618 )
[PROFIT] 274,855 ( 109,473,602 0 )
[LOST ] -65,001 ( 0 -9,915,200 )
[ 買いトレード ]
AVG ( MAX MIN )
[P/L ] -8,403 ( 11,164,848 -269,118 )
[PROFIT] 215,810 ( 113,163,820 0 )
[LOST ] -67,217 ( 0 -9,758,019 )
[ 売りトレード ]
AVG ( MAX MIN )
[P/L ] 3,971 ( 4,623,866 -271,218 )
[PROFIT] 370,459 ( 102,913,213 0 )
[LOST ] -61,716 ( 0 -10,119,536 )
3.平均損益件数集計
こちらも、イメージをつかむため、平均損益がプラスの銘柄・マイナスの銘柄の件数を集計。 やはり、逆張り戦略の方が利益が出そうです。
[ DEF-1 ( 順張り ) ]
[TRADE] [+ COUNT] [- COUNT]
[ALL ] 650 2,917
[LONG ] 564 3,000
[SHORT] 925 2,638
[ DEF-2 ( 逆張り ) ]
[TRADE] [+ COUNT] [- COUNT]
[ALL ] 1,074 2,490
[LONG ] 847 2,712
[SHORT] 1,408 2,148
今回のRCIでも機械的に売買すると損失が出る結果となりました。
また、バックテストと称していながら、手数料・リスク率・ストップロス・スリッページ・呼び値等を考慮していないものが多数あります。 今回はこれらも考慮しているのでより実際に近いシミュレーションが出来ているのではないでしょうか。 計算間違いしていなければの話ですが・・・ ※計算間違いが発覚すれば、その都度再検証してみるつもりです。
もちろん、実際は場合によってエントリ方法を調整する必要があることは言うまでもありませんが。。。 特にエグジットの条件を変更する(利益のあるうちにエグジットするようにする)ともっと利益に繋がるでしょう。
Ruby 学習の延長で検証作業を行ってみましたが、こうして実際に実用的な何かを作成してみることで知識も深まっていきます。
以上。
Comments