プログラムに用いる言語は何が最適?
- MetaTraderなどの独自言語
単純なプログラムの場合はこれが一番効率的だが、いちいち覚えなきゃいけないのがめんどくさい。あと今回扱うデータは30万×6通貨と大量なんで、速度や安定性も心配。 - C or C++
速度から見れば一番最適なんだけど、コードの行数が単純に多くなる。ポインタ関係のバグとかで手間取るのは勘弁。 - Rとかの統計言語
データ解析で非常に活躍するが、バックテストを行うのには不向き?(本来の分野とはかけ離れている) - C# , VB.net などの .net 言語
一番最適なような気がする。システム部分をいちいち製作しなきゃいけないけれど、その分柔軟性があり、なによりC# 3.0からLinqとラムダ式という超強力な武器が手に入る。速度の問題も気になるところはunsafe or 外部dllという手段があるし。 - Haskell or Ocaml
関数型言語で実装したほうがコード数が少なくなる場合が多々あるし、なにしろこのタイプの言語は数学系統に強い。現在は見送るが、将来的に学びたい言語。
といろいろ検討した結果、C#となりました。
始めに作ったプログラム
始めに作った売買プログラムは非常に簡単で、以下の手順だけでシステムを組みました。
なお今回取引する金融商品はFX,売買する通貨はオーストラリアドル、スイスフラン、ユーロ、英ポンド、ニュージーランドドル、アメリカドル / 円の6つで、実際の取引に生じるスプレッド、スワップポイントは今回無視しました。
- 過去10分前までのデータから収益率r、その標準偏差σを計算し、評価関数
を用いてランク付けする。 - 一番上のランクになった通貨を売買。期待収益率が正ならば対象通貨を買い、負ならば対象通貨を売る。
- その10分後に対象銘柄を売却か、購入する。
これを1年間に渡って繰り返した場合、100万円の元出がいくらかになったかを計算します。評価に用いた為替レートの1分足データはForexiteから取得しました。
で、作ったプログラムが以下。正直適当です。
問題発生
ところがこのようなシステムを実際に稼動してみると、どうも収益が逆に-20,30万くらい少なくなっている傾向があるようです。これでは良いシステムとは言えません。
そこでそれなら逆転の発想で、単純に売買ルールを逆にしてみればプラスになるんじゃ!ということでシステムを稼動してみると、思惑通りプラスとなりました。今回のバックテストで得られた結果のグラフがこちらです。
カーブの大小はありますが、どれも上方向を向いており、マイナスの結果になっているグラフはありません(ただし月単位で見た場合、負の収益を出している月もある点に注意)。また収益もスプレッドを無視しているとはいえ、含み益が150万~380万。年利換算で150% ~ 380%。平均の月利は約8.0~11.8%という結果になりました。これは明らかに今回の取引が「劣マルチンゲール(有利な取引)」であることを表しています。
なぜそんなことが起こるのか
もし微小時間の値動きがブラウン運動のような完全にランダムな値動きをするならば、このように4年連続で、しかも比較的綺麗な損益曲線を描くことにはならないはずです。このことから以下のように結論付けることにしました。
「少なくとも過去4年間、外国為替市場における為替のレートは微小時間で正または負の方向に値が進んでいる場合、後にその動きとは逆の値動きになる傾向がある。」
なぜこのような値動きになるのか。これはあくまで仮定ですが、自分は以下のように考えました。
- 外国為替市場では売りの圧力と買いの圧力がせめぎあって、その理想均衡点が価値を決定する。
- その理想均衡点の動きは緩やかに推移していくため、微小時間では無視することができる。
- もし価値が理想均衡点から明らかに乖離した値をとる場合、市場は価値が理想均衡点となるように逆方向の圧力がかかり、補正される。
これならば上の結論の説明がつきそうです。そして2007年の収益が最も少なかった理由として、
「2007年はサブプライム問題などにより売り買いの圧力が大きく変動したため、理想均衡点自体が大幅に変動し、予測がしにくかったのではないか」
と推論しました。
次回はこの仮定を検証してみますが、それよりもまずは金融工学をもっと勉強しなきゃ・・・(まだ300ページしか読み終わってない)自分が知らないことはまだまだたくさんある。
追記(03/23)
年利換算が間違っていたので修正しました。資産額じゃなくて純利益だったのを忘れてました。だめだこりゃ。
0 件のコメント:
コメントを投稿