ブログ My Life as a Mock Quant(2011-03-29) およびその中で紹介されている FOSS Trading: How to backtest a strategy in R を参考にして、バックテストを作ってみました。
ステップ1:データを取得する。
ステップ2:指標作成。
ステップ3:トレーディング戦略を作る。
ステップ4:トレーディングルール。
ステップ5:戦略のパフォーマンス評価
となっています。FOSSでの戦略はロングアンドショートというものらしいです。買うか空売りするかという選択をしているようです。ちょっと敷居が高いので、買うか売るかだけの戦略にしてみました。パフォーマンス評価の部分はまだ未学習ですが、その前のところについては、大方理解が進んだのではないかと考えています。
問題を次のように整理しました。
1:1株を、持つか、持たないかの2つの状態のうち1つである。
2:それを判断するために指標を作る。この指標が1なら「持つ」。すなわち、買うまたは既に買ってあればそのまま。指標が0なら「持たない」売るかまたは既に売ってあればそのまま。
3:指標は、今回は簡単のため、前日が陽線なら当日「持つ」(1)、それ以外なら「持たない」(0)とした。
4:買い、売りは当日の寄成とした。すなわち、始値で売り買いする。
5:現金は0円スタートとし、買えばマイナス、売ればプラスとなる。
省略しましたが、quantmodパッケージを利用しています。
1行め:zはxts型の変数です。約1年分の特定銘柄(極洋)のデータです。
2行め:指標です。前日が陽線(終値>始値)なら、1、それ以外なら0をとります。前日のデータを見るのでlagです。OpClは(終値-始値)/始値の値を計算する関数です。騰落率という言い方でよいでしょうか?符号だけ利用しています。Cl(z)-Op(z)でもよいですね。Clは終値(Close)、Opは始値(Open)をとる関数です。quantmodの関数です。
3行め:lagをとっているのでsig[1]がNAになります。うまくないので0にしました。
4行め:現金の出し入れについては、前日と当日の株の保有状態によって4つのケースがあります。
① 前日保有・当日保有・・・現金の出し入れはありません
② 前日保有・当日なし・・・当日売るので、現金が入ります。
③ 前日なし・当日保有・・・当日買うので現金が出ます。
④ 前日なし・当日なし・・・現金の出し入れはありません
現金の出入りがあるのは②と③の場合だけです。lag(sig)-sigによって②の時は1、③の時は-1、①④の時は0となります。売り買いする値段は始値ですからOp(z)です。
5行め:4行めでやはり初日はNAになるのでその修正です。
6行め:累積和をとればそれぞれの日の現金の状態がわかります。lastで最後の現金を変数genkinに代入します。
7行め:最後に株を持って終わるか売って終わるかの違いがあります。終値でその株を評価します。
8行め:手持ち現金、株資産、合計最終損益を表示します。
最終
という状況でした。現金-265円、持ち株評価額259円で最終損益-6円です。
動作を確認するため、zとsigとmoneyを並べて示しました。OpCl.zはsigのことです。しばらく買いサインが出ず(OpCl.z0が5日続いた)3月23日に、終値>始値となって3月24日に買いサインが出ました。3月24日の始値303円で買うので、現金-303円となります。この日は始値≧終値なので、3月25日は買いサインがでませんから、始値301円で売ります。・・・とこのような調子です。
このルールで、手持ちの東証1部1956銘柄に適用してみたところ、平均-78円、最大6765円、最小-25498円。利益が出た銘柄845銘柄、損失1096銘柄、±0が5銘柄、データ不足で計算不能10銘柄でした。
記事には、バックテスト後のパフォーマンス評価が大事だと書かれています。今後学んで報告できれば良いですが、本日の記事でアップアップなので、いつになりますか。
0 件のコメント:
コメントを投稿