mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

株価 - バックテスト(ボリンジャーバンド版)!

[ プログラミング, 株式 ] [ MySQL, Ruby ]

こんばんは。

Ruby + MySQL で自作した株価取得のシステム。 全市場(東京・大阪・名古屋・札幌・福岡)の全銘柄の1983年からの全取引データを取得しています。

以前は、売買サイン発生後の株価の挙動を集計しました。

今回は、「ボリンジャーバンド」での計算で発生した売買サインデータを基に、仮に取引をしていた場合にどのような結果(損益)になるのかを検証していました。 (ボリンジャーバンドについては上記の過去記事をご参照ください。) 通常、このようなテストのことをバックテストと言います。

全体的にどんな傾向があるのかを把握するのと、Ruby (+ MySQL) の学習が目的です。 ※興味が無ければスルーしてください。

以下に、前提条件・検証結果を掲載します。

1.前提条件等

1.売買サインの定義

  • DEF-1 ( 順張り戦略 ) 買いサイン : 終値がボリンジャーバンド +kσを上抜けた時 売りサイン : 終値がボリンジャーバンド -kσを下抜けた時

  • DEF-2 ( 逆張り戦略 ) 買いサイン : 終値がボリンジャーバンド -kσを下抜けた時 売りサイン : 終値がボリンジャーバンド +kσを上抜けた時

としました。 ※今回はσを計算する日数は 25 日とし、係数 k は 2 としました。 また、調整後終値(株式分割があった場合の調整値)を考慮していません。

2.検証銘柄と検証期間

2012年3月31日現在上場している全市場の 3,579 銘柄を対象に、2000年1月1日から2011年12月31日の株価データを使用して検証しました。 また、複数の市場に上場している銘柄については、優先市場のみで検証しました。 ※全取引件数は 7,901,550 件

3.注文条件

  • 資金は 5,000,000 円に設定
  • 無ポジション中に買いサイン発生で、買いエントリ
  • 買いポジション中にストップロス発生で、エグジット
  • 買いポジション中に売りサイン発生で、エグジット
  • 無ポジション中に売りサイン発生で、売りエントリ
  • 売りポジション中にストップロス発生で、エグジット
  • 売りポジション中に売りサイン発生で、エグジット
  • エントリ・エグジットは翌営業日の始値で行う
  • 手数料は、SBI証券の手数料(スタンダードプラン)を使用する。
  • リスク率は 0.05 に設定
  • ストップロス率は 0.4 に設定
  • スリッページは 1 に設定
  • 呼び値も考慮
  • エントリ時は、毎回資金残高中で投資可能な最高額を投資
  • エントリ時に資金残高が不足する場合はエントリしない。

各種用語については、各自でお調べください。 検証アルゴリズムは以下の書籍(エクセルでの検証)も参考にしています。

4.検証方法

  • 各銘柄について、対象の期間内のデータで売買サインの発生を検証する。
  • 各銘柄について、上記3の「注文条件」にしたがって、バックテストを行う。 算出項目:売買単位、手数料、損益、総損益、資金残高、最大ドローダウン
  • 全銘柄のバックテスト結果を集計する。 検証項目:総損益、利益、損益、プロフィットファクター、トレード回数、      勝率、勝ちトレード数、負けトレード数、最大利益額、最大損失額、      総手数料額、最大ドローダウン、      平均損益額、平均利益額、平均損失額

2.検証結果

以下は、σを計算する日数を 25 日、係数 k を 2 として検証した結果です。

1.バックテスト結果

買い・売り両方のエントリを想定して検証しています。 全銘柄のトータルなので、莫大な数値となっています。 やはり、総損益もマイナスとなってしまいます。 また、買いエントリだけ、売りエントリだけを想定して検証した結果は、金額に差が出るものの比率は同じような結果になりました。 ちなみに、逆張りを9日で計算した場合は、わずかながら利益が出る結果となりました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[ DEF-1 (順張り戦略) ]
−−−−−−−−−−− [ TRADE(ALL)   ][ TRADE(LONG)  ][ TRADE(SHORT) ]
総損益           -4,156,286,929  -2,424,986,220  -1,731,300,709
利益            12,796,243,829   7,210,826,362   5,585,417,467
損益           -16,952,530,758  -9,635,812,582  -7,316,718,176
プロフィットファクター            75.48           74.83           76.33
トレード回数               285,012         147,810         137,202
勝率                     5.22%           4.76%            5.7%
勝ちトレード数               14,879           7,046           7,833
負けトレード数              270,133         140,764         129,369
最大利益額              1,664,045       1,372,142         908,772
最大損失額               -252,348        -221,522        -196,612
総手数料額            648,026,898     335,517,753     312,509,145
最大ドローダウン            -274,107        -238,641        -203,676

[ DEF-2 (逆張り戦略) ]
−−−−−−−−−−− [ TRADE(ALL)   ][ TRADE(LONG)  ][ TRADE(SHORT) ]
総損益           -1,955,703,805  -1,588,526,047    -367,177,758
利益            18,553,237,970   9,054,537,917   9,498,700,053
損益           -20,508,941,775 -10,643,063,964  -9,865,877,811
プロフィットファクター            90.46           85.07           96.27
トレード回数               303,638         148,967         154,671
勝率                     8.37%           7.11%           9.59%
勝ちトレード数               25,431          10,596          14,835
負けトレード数              278,207         138,371         139,836
最大利益額              1,636,270       1,377,979         957,714
最大損失額               -257,505        -222,562        -216,668
総手数料額            715,355,027     351,067,107     364,287,920
最大ドローダウン            -257,554        -222,526        -216,113

2.平均損益・利益・損失額集計

各銘柄でバックテスト(算出)した平均損益額・平均利益額・平均損失額の平均値・最大値・最小値を算出。 通常、各銘柄で算出した場合、平均損益額=平均利益額+平均損失額となりますが、全銘柄を集計した場合には数値の性質上イコールにはなりません。 イメージをつかむために全銘柄の平均値・最大値・最小値を算出してみました。 ちなみに、逆張りを9日で計算した場合は、わずかながら利益が出る結果となりました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[ DEF-1 (順張り戦略) ]
[ 全トレード ]
                 AVG  (         MAX          MIN  )
[P/L   ]       -9,438 (    2,374,649     -288,018 )
[PROFIT]      779,357 (  138,848,710            0 )
[LOST  ]      -68,902 (         -194   -2,413,914 )

[ 買いトレード ]
                 AVG  (         MAX          MIN  )
[P/L   ]       -8,960 (    7,871,146     -308,959 )
[PROFIT]      850,599 (  138,848,710            0 )
[LOST  ]      -75,535 (            0   -3,043,651 )

[ 売りトレード ]
                 AVG  (         MAX          MIN  )
[P/L   ]       -5,757 (      757,755   -1,955,924 )
[PROFIT]      579,253 (   10,646,871            0 )
[LOST  ]      -61,037 (            0   -1,955,924 )

[ DEF-2 (逆張り戦略) ]
[ 全トレード ]
                 AVG  (         MAX          MIN  )
[P/L   ]       -2,288 (    6,964,968     -290,118 )
[PROFIT]      795,914 (  565,509,514            0 )
[LOST  ]      -76,308 (         -145  -10,489,549 )

[ 買いトレード ]
                 AVG  (         MAX          MIN  )
[P/L   ]       -8,243 (   15,817,493     -269,218 )
[PROFIT]    1,068,084 ( 1,547,560,963            0 )
[LOST  ]      -76,610 (            0  -12,032,388 )

[ 売りトレード ]
                 AVG  (         MAX          MIN  )
[P/L   ]        4,177 (    1,549,362   -4,563,902 )
[PROFIT]      595,630 (   74,483,790            0 )
[LOST  ]      -75,802 (            0   -8,419,887 )

3.平均損益件数集計

こちらも、イメージをつかむため、平均損益がプラスの銘柄・マイナスの銘柄の件数を集計。 やはり、トータル的に観るとマイナスになる銘柄が多いようですが、今までのバックテストと比べるとプラスとなる銘柄も多くなっています。

1
2
3
4
5
6
7
8
9
10
11
[ DEF-1 (順張り戦略) ]
[TRADE]  [+ COUNT]  [- COUNT]
[ALL  ]        748      2,795
[LONG ]        766      2,758
[SHORT]        934      2,596

[ DEF-2 (逆張り戦略) ]
[TRADE]  [+ COUNT]  [- COUNT]
[ALL  ]      1,030      2,513
[LONG ]        912      2,619
[SHORT]      1,354      2,173

今回の検証でも一部利益が出るものの全体的には損失が出る結果となりました。 また、ボリンジャーバンドの場合、順張りより逆張りの方が利益が出やすそうです。

また、バックテストと称していながら、手数料・リスク率・ストップロス・スリッページ・呼び値等を考慮していないものが多数あります。 今回はこれらも考慮しているのでより実際に近いシミュレーションが出来ているのではないでしょうか。 計算間違いしていなければの話ですが・・・ ※計算間違いが発覚すれば、その都度再検証してみるつもりです。

もちろん、実際は場合によってエントリ方法を調整する必要があることは言うまでもありませんが。。。 特にエグジットの条件を変更する(利益のあるうちにエグジットするようにする)ともっと利益に繋がるでしょう。

Ruby 学習の延長で検証作業を行ってみましたが、こうして実際に実用的な何かを作成してみることで知識も深まっていきます。

以上。

Comments