ML 為替予測の為のデータ分析-月毎のボラリティ比較分析-

# 前提
本件は、為替による通貨変動を機械学習にて予測する為の事前準備として収集したデータの分析を実施する。
私自身は学歴として高卒ではあるが、数学は中学程度しか理解していない。
その為、分析方法・数式の書き方に不備が有るが了承頂きたい。

# 資料その他
本件にて利用する為替データは、Tickstoryより取得したGBPUSDの日足データを利用する。
分析環境は、google　Colaboratoryを利用する。

# 趣旨
為替において月毎にボラリティに特色があると仮定している。
仮定が真であるならば、今後作成するMLに予測系数として導入する想定である。
その為本件において月毎の特色を分析する。

# 仮説
私は年間を通し、月毎にボラリティに特色があると仮設する。
仮設の意図としては、各月に置いて特有のイベントが有りイベントの影響により
ボラリティに変動があると想定する為である。

# ①ボラリティ
## 計算式
月毎のボラリティを比較する際、各月における差分として下記が想定される。
　・取引可能日数
　・取引量

上記項目が影響し純粋なボラリティの比較が出来ない可能性がある為、
当項目を除外した際のボラリティを導く。
その為、各項目を下記と置き
  ・日足の最大値：y
  ・日足の最小値：z
  ・Tick数：cnt
  ・月の日数：n
  ・月毎のボラリティ：A

下記の通り計算する。

```math
A=\frac{\sum_{k=1}^{n}(\frac{|x_k-y_k|}{cnt})}{n}
```

月のボラリティを計測し、年間における各月のボラリティの比率は下記にて表す。

```math
年間の各月のボラリティ比率=\frac{A_i}{\sum_{i=1}^{12}{A_i}}
```

上記をpython3にて分析する為のソースは下記となる。

## ソース
### ①事前準備
#### ライブラリのインポート
```
import pandas as pd #表を用いた統計学的計算を実施する為のライブラリ
import matplotlib.pyplot as plt #グラフ描写の為に定義
```

#### 日足データを格納しているgoogle　driveをマウント

```
from google.colab import drive
drive.mount('/content/drive')
```
※ とうコマンドを実行し、google　driveの認証処理を実行する。

#### 日足データを取得し、dateカラムをインデックスに登録

```
csvT = pd.read_csv('/content/drive/My Drive/1day/GBPUSD2004_2018_1day.csv'  )
csvT.date = pd.to_datetime(csvT.date)
csvT.set_index('date',inplace=True)
```
#### 読み込んだデータから必要情報を計算し、カラムとして追加

```
csvT['days'] = csvT.index.day # [days]カラムに対象レコードの日付を格納
csvT['month'] = (csvT.index.month) # [month]カラムに対象レコードの月を格納
csvT['absv'] = pd.DataFrame.abs(csvT.hight - csvT.low) # [absv]カラムに対象レコードの最大値と最小値の絶対値を格納
```
#### グラフ表示の為の準備

```
fig = plt.figure(figsize=(30, 10), dpi=70)
ax = fig.add_subplot(1,1,1)
year_ary = set(csvT.index.year) # csvデータから収集されている年次情報を取得
```

表を下記の通り作成

```
df = pd.DataFrame(columns=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],index=year_ary)
```

###②計算
#### 年次毎にテーブルを作成

```
for year_int,year_str in enumerate(year_ary):
  tmpstr = []
```

#### 月毎に1日に於けるボラリティ平均値を計算し一時変数へ配列として格納

```
  for moths in range(1,13):
    csvT_test = csvT[str(year_str) + '-' + str(moths)]
    cnt_CSV=len(csvT_test)
    tmpstr.append(csvT_test.absv.sum()/cnt_CSV)
```

#### 年間のボラリティを変数へ格納

```
  arry_total = sum(tmpstr)
```

#### 年次における各月のボラリティの変動比率を計算し一時変数へ格納

```
  tmp_arry = []
  for cnt,i in enumerate(tmpstr):
    tmp_arry.append(i / arry_total)
```

#### グラフ表示用の表の各年次に紐づくレコードへ格納する

```
  df.loc[year_str] = tmp_arry
```

### ③表へ出力
#### 年次毎に繰り返しグラフへ格納

```
year_ary = set(df.index)
for year_int,year_str in enumerate(year_ary):
  ax.plot(df.loc[year_str], label=str(year_str) )
plt.legend()
plt.show()
```
<img width="1108" alt="スクリーンショット 2019-10-14 15.36.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141926/22529d4b-d8f4-b9ce-7c58-9f69970b7650.png">


## ソースまとめ
今回利用したソースを下記へ記載する。

```
import pandas as pd
import matplotlib.pyplot as plt

from google.colab import drive
drive.mount('/content/drive')

csvT = pd.read_csv('/content/drive/My Drive/1day/GBPUSD2004_2018_1day.csv'  )
csvT.date = pd.to_datetime(csvT.date)
csvT.set_index('date',inplace=True)

csvT['days'] = csvT.index.day
csvT['month'] = (csvT.index.month)
csvT['absv'] = pd.DataFrame.abs(csvT.hight - csvT.low)
csvT['avg'] = csvT.absv / csvT.tickCount

fig = plt.figure(figsize=(30, 10), dpi=70)
ax = fig.add_subplot(1,1,1)
year_ary = set(csvT.index.year)

for year_int,year_str in enumerate(year_ary):
  tmpstr = []
  for moths in range(1,13):
    csvT_test = csvT[str(year_str) + '-' + str(moths)]
    cnt_CSV=len(csvT_test)
    tmpstr.append(csvT_test.absv.sum() / cnt_CSV)
  
  arry_total = sum(tmpstr)
  tmp_arry = []
  for cnt,i in enumerate(tmpstr):
    tmp_arry.append(i / arry_total)
  df.loc[year_str] = tmp_arry

fig = plt.figure(figsize=(25, 10), dpi=50)
ax = fig.add_subplot(1,1,1)

year_ary = set(df.index)
for year_int,year_str in enumerate(year_ary):
  ax.plot(df.loc[year_str], label=str(year_str) )
plt.legend()
plt.show()
```