HFTを作りたい

間違ってたらごめんなさい教えてください。なおします。
HFT(High frequency Trading)が少額ではかなりのスペックを出しているそう。

参考にさせていただいたもの。
天下一BOT会 
2週間で利回り4000%超を達成したトレーディングbot構築の考え方
マーケットメイク戦略の理論

すごいー。「2週間で利回り4000%超を達成したトレーディングbot構築の考え方」は根拠も書いてくれているので安心します。でも理解するのに時間かかった。こちらを読んで頂いてからこの記事を見るといいかもです。

とりあえずしたこと

「High-Frequency Trading in a Limit Order Book」 (Avellaneda, Stoikov、2008年)を見てみた。素人ながらブラウン運動と全然動き違うしと思ってやめた。「マーケットメイク戦略の理論」でもなんか式が違う気がするし、EXPで近似したらそんな形にならないんだけどと思った。僕数学よくわかんない。

そんなんで「2週間で利回り4000%超を達成したトレーディングbot構築の考え方」を参考にさせていただくことにしました。4時間で+20%のしょぼいのはできたけど動きがわけわかんなすぎて4時間動かして没にしました。そこまでの理解を記載します。指標の探し方の部分の補填と思ってください。

必要なもの

5秒、1秒足など細かいヒストリカルデータ。

板のリアルタイムのデータか約定のリアルタイムのデータから作るしかない。nodejsで作ったの消してもうた。gitのログにあるかもだけどもっかいちゃんと作ります。めんどいけどがんばれば誰でもできるはず。

探すもの

優秀な指標

情報係数(IC)というもので評価するそうです。参考記事のものは0.17、僕のは0.1程度ずいぶん差があります。現在も探査中です。

情報係数(IC)の計算の仕方 MACD IC0.07の例

なんでもよいので5秒足とかを用意してください。
相変わらずデータはmongodbに入れてます。

from pymongo import MongoClient,DESCENDING
import datetime
import pandas as pd
mongoClient =  MongoClient("mongodb://test_user:test_password@127.0.0.1:27017/bitflyer")
cursor = mongoClient["bitflyer"].candle_s5.find(projection={'_id': False,'__v': False})

df = pd.DataFrame(list(cursor))
df.set_index('time',inplace = True)
df.head()

diffにいくら値段が動いたかを計算します。またnextに次(5秒後)にいくら値段が動いたかを入れていきます。

import talib

real = [float(x) for x in df.close.values]
real = np.array(real)
df["diff"] = df["close"] - df["close"].shift()
df["next"] = df["diff"].shift(-1)
df.head()


nextと投資指標の値の相関を計算します。これがICになります。コードはMACDのヒストグラムとの相関を見ています。

import numpy as np
results = pd.DataFrame(columns=["fast","slow","signal","IC"])
for short in range(2,4):
    for long in range(3,8):
        for signal in range(2,5):
            matrix = pd.DataFrame(df.next)
            _,_,matrix["histgram"] = talib.MACD(real, fastperiod=short, slowperiod=long, signalperiod=signal)
            matrix = matrix.dropna()
            y = matrix["next"]
            x = (matrix["histgram"] - matrix["histgram"].mean())/matrix["histgram"].std(ddof=0)
            y = y[1:]
            x = x[1:]
            correlation = np.corrcoef(x, y)[0,1]
            result = pd.DataFrame([[short,long,signal,correlation]], columns=["fast","slow","signal","IC"])
            results = results.append(result, ignore_index=True)

print(results)

参考記事に記載のある「短期のリバーサル指標が効果的である気がします。」とはたぶんこのインジケータのパラメータのperiodが短いほうがICが高いという意味だと理解しています。

次にMACD(2,3,2)の散布図を見ます。

scatter = pd.DataFrame(df.next)
_,_,scatter["histgram"] = talib.MACD(real, fastperiod=2, slowperiod=3, signalperiod=2)
scatter = scatter.dropna()
y = scatter["next"]
#y = (scatter["next"] - scatter["next"].mean())/scatter["next"].std(ddof=0)
x = (scatter["histgram"] - scatter["histgram"].mean())/scatter["histgram"].std(ddof=0)
y = y[1:]
x = x[1:]
a,b = np.polyfit(x,y,1)
correlation = np.corrcoef(x, y)[0,1]
determination = correlation**2

y2 = a * x + b

fig=plt.figure(figsize=(10, 10))
ax=fig.add_subplot(111)
ax.scatter(x,y,alpha=0.5,color="Blue",linewidths="1")
ax.plot(x, y2,color='black')
ax.text(0.1,0, 'y='+ str(round(a,4)) +'x+'+str(round(b,4)),position=(4,0))
ax.text(0.1,0, 'IC='+str(round(correlation,4)),position=(4,40))
ax.text(0.1,0, 'R2='+str(round(determination,4)),position=(4,80))
plt.show()

デキマシター。
まあIC出した後に散布図見ても僕には「なるほど。わからん。」ってなるだけです。

ICの値について

Information Coefficient - IC によるとIC 0.1で55%の確立で次の時間に値段があがるか下がるか(nextが)当てられるという事らしいです。IC 0.17だと58%位の正答率なんですね。そしてIC 0.1でも非常に優秀だそうです。

パラメータいっぱいになるとどう判断していいかよくわかんないしパーセプトロンとか機械学習任せにしてみようかしら、、。

その他 高利益率を可能にしているもの

僕のにわか認識なので参考程度にしてください。

1. bitflyerでやる
売買手数料無料。
しらんかった

1円毎にオーダーがいれられる。
best bid,askを自分のオーダーだけで作れたりする。
bitmexだとスプレッドが全然開かないし約定待ちに結構なるはずです。

2. 少ない資金でやる
単純にマーケットが小さくて全部約定しなくなってくるみたい。

今のところこんな理解です。

この記事が気に入ったらサポートをしてみませんか?