何をしたのか
ビットコインの1時間足、過去1年半分のデータを使い、現在足tより10足前のt-10までの中で陽線の数が陰線の数を上回ったかどうかでグループ分けをし、各グループ間で、現在足tから10足後のt+10の終値がtの終値を上回る確率に有意な差があるかをt検定で検証しました。
コード
データ前処理
- 10足前までの陽線の数と陰線の数を比較して真偽値1, 0を割り振ります。
import pandas as pd
pd.options.display.float_format = '{:.10g}'.format
df = pd.read_csv('test.csv')
trainDf = df[13140:26280].drop("Unnamed: 0", axis=1).reset_index(drop=True)
trainDf["whiteMany"] = -1
trainDf["10SmaUp"] = -999
trainDf.head()
for index, row in trainDf.iterrows():
if index > 9 and index < len(trainDf.index) - 11:
# 過去10足と未来10足がある区間のデータに対してのみ実行
white = 0
black = 0
closeAmount = 0
for i in range(10):
openPrice = trainDf.iat[index + i, 1]
closePrice = trainDf.iat[index + i, 4]
if closePrice > openPrice:
white += 1
elif closePrice < openPrice:
black += 1
trainDf.iat[index, -1] = trainDf.iat[index - 10, 4] > row["close"]
if white > black:
trainDf.iat[index, -2] = 1
elif white < black:
trainDf.iat[index, -2] = 0
# 10日後, 10日前のデータがない1時間足をinputDataから排除
trainDf2 = trainDf[(trainDf["10SmaUp"] != -999) & (trainDf["whiteMany"] > -1)]
ランダムサンプリング
時系列データなので、大きなトレンドが発生してる場合、説明変数(過去10足における陽線の数が陰線を上回るか) がアウトカム(10足後に今より上昇してるかの確率)へ与える影響を歪めてしまうでしょう。
そのためランダムサンプリングを行ったが、データ前処理の段階で例えば12時間ごとにイテレーションを回し、その中から毎回ランダムに1時間幅を選択し、それを基準として説明変数とアウトカムを用意しても良いと考えます。
df1 = trainDf2[trainDf2["whiteMany"] == 1]
ra_df1 = df1.sample(n=500, random_state=1)
ra_df1.head()
df2 = trainDf2[trainDf2["whiteMany"] == 0]
ra_df2 = df2.sample(n=500, random_state=1)
ra_df2.head()
グループごとの代表値
アウトカム
陽線の数が陰線の数を上回ったグループに関しては、10足後に今より上昇する確率は54.8%
陰線の数が陽線の数を上回ったグループに関しては、58%です。
この3.2%の差がたまたまかどうかを検証するため、
t検定ライブラリstatsをimportします。
from scipy import stats
# 各グループのアウトカムのSeriesをA, Bにそれぞれ代入
A = ra_df1["10SmaUp"]
B = ra_df2["10SmaUp"]
各グループの分散が等しいか分からないので、それを前提とするパラメータequal_varを偽とします。
stats.ttest_ind(A,B, equal_var = False)
# Ttest_indResult(statistic=-1.0198320046890317, pvalue=0.3080553112075828)
結果、p値が30%ということで、有意水準5%を考慮すると、両グループに上昇確率における差がない帰無仮説であっても、たまたま3.2%という差異が起こり得るということになり、
これ即ち、両者に上昇確率の差異があるとは認めらないという結論です。
何が言えるか
グループ間で有意な差異は見えなかったものの、どちらのグループであっても10足後に今より価格が上昇してる確率が50%以上となり、上昇下降時のボラティリティの違いを考慮しないのであれば、常にロングポジションを取れば、長期的に見ると勝ち残れる可能性が高いということになります。
しかし残念ながらこれは3年前〜1年前のビットコインデータをインプットデータに使用したものです。
チャートで言えば赤線に囲まれた区間です。
絶賛バブル真っ只中なので、ロングポジションの方が勝率が高いのは当然と言えば当然という落ちでした。
3年前のボラティリティ変動が安定してる為替データでも試してみようと思います。