為替秒足データへのOne pass algorithmの適用

概要

・HFTでのベーシックな考え(らしい)One pass algorithmを為替秒足データへと適用
・今回は指数ウェイト平均、分散、単回帰係数を見てみる

データなど

拙ポストで恐縮ですが、
One pass algorithmについては http://nekopuni.holy.jp/?p=1005
秒足チャートについては http://nekopuni.holy.jp/?p=1285
を参照ということで。
秒足チャートに関しては、今回はUSDJPYの2014年8月4日のデータを対象として進めます。

指数ウェイト単回帰について

簡単に言うと、単回帰係数を推定する際に、指数ウェイト付された誤差項を最小化するというもの(っぽい)
まずRで通常(誤差項が等ウェイト)の単回帰と、指数ウェイト単回帰の違いを見てみる。
非説明変数がt期のリターン、説明変数がt-1期までのリターン(ウィンドウは1000期)として、ローリングで回帰していきます。AR(1)過程の係数を推定しているイメージですね。
参考文献だとペアトレーディングを想定して異なる資産の価格をそれぞれ説明変数と非説明変数にしているように見えるのですが、価格同士の相関は何となく具合が悪そうなのでリターン同士を使っています。

等ウェイト単回帰

元のcsvには3行目にbid quote, 4行目にask quoteが入っています。
とりあえずbid quoteに対して分析。

変数outの1列目に回帰係数、2列目にt値を格納しています。それぞれプロットすると、回帰係数が
141011_1
となり、t値が
141011_2
となります。赤破線は+2/-2。

指数ウェイト単回帰

指数減衰パラメータ(参考文献中でのalpha)はalpha
誤差項のウェイトはlm内のweightsで指定できます。

プロット結果は回帰係数が
141011_3
t値が
141011_4
大まかな有意になるタイミングは等ウェイトと同じような感じですが、こちらのほうが直近の値に対するウェイトが大きい(過去の値に対するウェイトが小さい)ためか、相対的に激しく変動しています。
直近のプライスアクションを重要視するという考え自体には同意できるので、まあこっちの方がトレーディングへと適用する際には良いんですかね。

Pythonでの実装 + 指数ウェイト平均と分散の計測

Rだと簡単に計算できているようですが、Pythonだとちょいとめんどくさい。。
ベクトルxの初期化で適当な値を入れるべきなのですが、0を入れると逆行列が計算出来ないので適当に 0.001を代入しています。本当は平均値でも入れておけば良いのですがまあそんなに問題ないでしょうということで。
あとは減衰パラメータalphaの比較静学も簡単に行なっています。

ちなみに秒足の様子としては以下
141011_5

指数ウェイト平均は以下。
パラメータはあまり1に近づけすぎるとある程度のレベルに収斂するまでに時間がかかるので0.99くらいが丁度良さそう。0.9だと暴れすぎな気も。
141011_6

指数ウェイト分散は以下。
こちらも同様に0.999だと収斂に時間がかかるので 0.99くらいが具合が良いか。
141011_7

指数ウェイト単回帰の切片。まあこれはほぼゼロだろうし適当に。
141011_8

指数ウェイト単回帰の回帰係数。
141011_9

ちなみにalpha = 0.99だけ取り出すと以下。Rでの出力結果と大体マッチしてそうですね。
141011_10

メモ + 今後の方針

・強化学習への適用
なんでこんなことやってるかと言えば、この回帰係数を強化学習の状態として用いれば良いんじゃねと思ったのでその前段階の分析。高頻度リターン同士の回帰だと回帰係数が有意になるタイミングがあるのが意外なところ

・この回帰係数をそのままインディケータに
というか強化学習とか小賢しいことしなくてもこの回帰係数がある一定の絶対値を持っている時にロングなりショートなりして、回帰係数がまた小さくなってきたらポジションをクローズするというだけでもいけんじゃないかという気がしなくもないですが、誰かお願いします。

・回帰係数にある程度の自己相関が必要か
とは言いつつもt期の自己相関を見てからトレードするとなるとある程度その相関が持続する必要がありますねと。

参考

Online Algorithms in High-frequency Trading – ACM Queue
http://queue.acm.org/detail.cfm?id=2534976

メモ: numpyアクセス高速化

概要

・Cythonを用いてnumpyのarrayへのアクセスを高速化する
・numpy使用時に陥りがちな罠(様々なサイトで書かれているが)をまとめておく

準備(setup.py)

とりあえずsetup.pyを用いたコンパイル方法を使うにあたって、numpyのarrayを使う際に微妙に書き換える場所があるのでそれをメモ
include_dirsの設定を行う必要がある

方法その1

引数にnumpy arrayを取る関数を高速化する方法
今回のデモ関数は、引数にnumpy arrayを取り、その全要素の総和を返す関数
まず下記をcythonTest.pyxとする

これを

でコンパイルする。
次に下記にあるように適当にparent.pyなどとしたファイルにて、上記でコンパイルしたものをモジュールとして読み込む

実行は普通に

という感じで実行。結果は

という感じで234倍くらい早くなっていることが分かります。

方法その2

クラスのアトリビュートにnumpy arrayがあるときに高速にアクセスする方法。
まずpyxファイルはこんな感じ。
classTestクラスがピュアpythonで書いたクラス。addArray関数で配列の全要素の総和を返します。
classTest_cがそれをCython用に書き換えたもの。拡張型クラスと呼ぶらしい。numpy arrayにアクセスする際にはこうやって書くと早くなるらしい。

次にparent.pyはこんな感じ。呼ぶ側(python側)に関しては特に書き方を変える必要はないようです。

実行結果

ということでこちらは247倍ほど早くなりました。

参考

拡張型 — Cython 0.17.1 documentation
http://omake.accense.com/static/doc-ja/cython/src/userguide/extension_types.html

Fast numerical computations with Cython
https://groups.google.com/forum/#!topic/cython-users/nnHXMcR0LU0