BTCの過去１０足分データの陽線の占める割合が50%以上で、上昇確率に有意な差があるかt検定してみた

#何をしたのか
ビットコインの１時間足、過去１年半分のデータを使い、現在足tより１０足前のt-10までの中で陽線の数が陰線の数を上回ったかどうかでグループ分けをし、各グループ間で、現在足tから10足後のt+10の終値がtの終値を上回る確率に有意な差があるかをt検定で検証しました。

#コード

##データ前処理
1. １０足前までの陽線の数と陰線の数を比較して真偽値1, 0を割り振ります。

```python
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()

```

<img width="556" alt="スクリーンショット 2019-09-14 22.27.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252596/736d5e9d-8776-74f8-c915-b67ec521aa8e.png">


```python
for index, row in trainDf.iterrows():
    if index > 9 and index < len(trainDf.index) - 11:
# 過去１０足と未来１０足がある区間のデータに対してのみ実行
        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

```

```python
#         １０日後, 10日前のデータがない１時間足をinputDataから排除
trainDf2 = trainDf[(trainDf["10SmaUp"] != -999) & (trainDf["whiteMany"] > -1)]
```

##ランダムサンプリング
時系列データなので、大きなトレンドが発生してる場合、説明変数（過去１０足における陽線の数が陰線を上回るか）　がアウトカム（１０足後に今より上昇してるかの確率）へ与える影響を歪めてしまうでしょう。

そのためランダムサンプリングを行ったが、データ前処理の段階で例えば12時間ごとにイテレーションを回し、その中から毎回ランダムに１時間幅を選択し、それを基準として説明変数とアウトカムを用意しても良いと考えます。

```python
df1 = trainDf2[trainDf2["whiteMany"] == 1]
ra_df1 = df1.sample(n=500, random_state=1)
```

```python
ra_df1.head()
```



<img width="597" alt="スクリーンショット 2019-09-14 22.36.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252596/70809359-822b-b269-e886-a5ef2c19f94d.png">



```python
df2 = trainDf2[trainDf2["whiteMany"] == 0]
ra_df2 = df2.sample(n=500, random_state=1)
ra_df2.head()
```



<img width="612" alt="スクリーンショット 2019-09-14 22.37.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252596/6c934ec6-ac25-b3c4-0962-97e1451e052f.png">




#グループごとの代表値

<img width="315" alt="スクリーンショット 2019-09-14 22.37.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252596/166cb9f5-786a-13ad-6f25-0515d524ad60.png">

#アウトカム
陽線の数が陰線の数を上回ったグループに関しては、１０足後に今より上昇する確率は54.8%
陰線の数が陽線の数を上回ったグループに関しては、58%です。

この3.2%の差がたまたまかどうかを検証するため、
t検定ライブラリstatsをimportします。

```python
from scipy import stats
# 各グループのアウトカムのSeriesをA, Bにそれぞれ代入
A = ra_df1["10SmaUp"]
B = ra_df2["10SmaUp"]
```

各グループの分散が等しいか分からないので、それを前提とするパラメータequal_varを偽とします。

```python
stats.ttest_ind(A,B, equal_var = False)
# Ttest_indResult(statistic=-1.0198320046890317, pvalue=0.3080553112075828)
```

結果、p値が３０％ということで、有意水準５％を考慮すると、両グループに上昇確率における差がない帰無仮説であっても、たまたま3.2%という差異が起こり得るということになり、

これ即ち、両者に上昇確率の差異があるとは認めらないという結論です。

#何が言えるか
グループ間で有意な差異は見えなかったものの、どちらのグループであっても10足後に今より価格が上昇してる確率が50%以上となり、上昇下降時のボラティリティの違いを考慮しないのであれば、常にロングポジションを取れば、長期的に見ると勝ち残れる可能性が高いということになります。

しかし残念ながらこれは３年前〜１年前のビットコインデータをインプットデータに使用したものです。
チャートで言えば赤線に囲まれた区間です。

<img width="1131" alt="スクリーンショット 2019-09-14 22.51.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252596/ecc5404a-f359-9a41-f719-e9db6e54cf05.png">


絶賛バブル真っ只中なので、ロングポジションの方が勝率が高いのは当然と言えば当然という落ちでした。

3年前のボラティリティ変動が安定してる為替データでも試してみようと思います。