AIシステムトレード開発　データ前処理編

#続編
https://qiita.com/EasyCording/items/75383638f8bd8f3c329a

#参考記事
https://note.com/inoichan/n/n97d0944d4e7d

#STEP1　チャートデータの読み込み
* まずはチャートの教師データ作成から進める。
* Inputサイズを128×128×3ということで、これは恐らく赤、緑、青の線をチャネルにしたものと思われる。
* チャートのセットについては、前にまとめたものを転用する　→　http://1969681.blog66.fc2.com/blog-entry-613.html

```shell
!pip install pandas_datareader
!pip install --upgrade pandas
!mkdir data
```

```main.py
import pandas as pd
import datetime as dt
from pandas_datareader import data

api_key = '取得したAPIキー'　　#https://www.alphavantage.co/documentation/
symbol = 'EURUSD'

start = dt.date(2019,1,1)
end = dt.date(2020,1,1)

df = data.DataReader(symbol,'av-daily',start,end, api_key=apikey)
df.head(5)
```
```main.py
	open	high	low	close	volume
2019-01-01	1.1465	1.1545	1.1446	1.1461	0
2019-01-02	1.1461	1.1497	1.1311	1.1337	0
2019-01-03	1.1333	1.1411	1.1308	1.1393	0
2019-01-04	1.1393	1.1419	1.1344	1.1394	0
2019-01-07	1.1405	1.1483	1.1402	1.1475	0
```

#STEP2　チャートを書く
* ＳＭＡ（Ｓ）、ＳＭＡ（Ｍ）を設定
* ライブラリ mplfinanceを使用してチャートを書く　→　https://chimesness.com/post-397/

```main.py
import mplfinance as mpf

sma_s= 20
sma_m= 50
length=　20

df.index = pd.DatetimeIndex(df.index)　#これ入れないとエラーになる
mpf.plot(df.tail(length),title='eurusd_daily.csv', figsize=(3,3),type='line', mav=(sma_s, sma_m), volume_panel=1)
```

![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/0ced5069-fde4-0360-69d1-906506a6745d.png)
#STEP3　教師データを作る
ここからは、タイムシフトをさせながら、バンバンと画像を生成する

* チャンネル毎にフォルダを作って、BPMを放り込む
* ラベルについては、ピンニングをして、階級を作る
* マルチタイムフレームになるように、ステップ数を設ける
* データ期間および、予想すべき経時期間をパラメータで指定する

とりあえず、軸を消したり、ラインを消したりして、３チャネルの画像を作成。

```main.py
import mplfinance as mpf
df.index = pd.DatetimeIndex(df.index)
cs  = mpf.make_mpf_style(gridcolor="white")
mpf.plot(df.tail(100),figsize=(4,3), type='line', figratio=(12,4),style=cs,axisoff=True)
mpf.plot(df.tail(100),figsize=(4,3), mav=(sma_s), type='line', figratio=(12,4),style=cs,axisoff=True,linecolor='#ffffff')
mpf.plot(df.tail(100),figsize=(4,3), mav=(sma_m), type='line', figratio=(12,4),style=cs,axisoff=True,linecolor='#ffffff')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/ac33b37c-3559-8a2e-aab3-f9fc24296d81.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/bbf42f4a-61b5-86ae-ec7b-0acc2a52c69d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/6e83c7e5-0074-723b-2dc0-60e5c6762251.png)

ここでハタと気づいたが、SMAの線が尻切れになるんですよねえ・・・
（ここ可変長でトリミングすると、後々の画像サイズが変わるし、固定にすべきかなあ）

ようわからんので、ISSUEを投げて先に行きます。
https://github.com/matplotlib/mplfinance/issues/499

# STEP4　ラベル作成
教師データの作成。
ここからは、かなり恥ずかしいコードです。
（何せ私、生まれてこの方、まともに人から学んだことがないので）

```main.py
wsize=100 #サンプル期間
after=10 #最終レコード＋α
change_small = 2 #変化小　2%
change_large = 4 #変化大　4%

df.index = pd.DatetimeIndex(df.index)

alldata =[]
cs  = mpf.make_mpf_style(gridcolor="white")

for time in range(len(df)-wsize-1):
    try:
        dfspan = df[time:time+wsize]
        dflast = df.at[df.index[time+wsize], 'close']
        dfafter = df.at[df.index[time+wsize+after], 'close']
        changerate=(dfafter-dflast)/dflast*100 #変化率
    
        if changerate>0:
            if changerate>change_large:
                dflabel="++"
            elif changerate>change_small:
                dflabel="+"
            else:
                dflabel="0"
        else:
            if changerate*-1>change_large:
                dflabel="--"
            elif changerate*-1>change_small:
                dflabel="-"
            else:
                dflabel="0"
        alldata.append({"df":dfspan,"label":dflabel})
    except:
        pass
```

```main.py
len(alldata)
2520
```

あれ？　こんなに数少ないの？
ひょっとして教師データって、同一データで水増しするものなんでしょうか？

一応、こんな感じでラベル付けをしています。

```main.py
[alldata[0:10][x]['label'] for x in range(10)]
['+', '++', '+', '+', '0', '0', '0', '0', '0', '-']
```

画像はこちらで生成します。

```main.py
for i in range(len(alldata)):
    mpf.plot(alldata[i]['df'],title='close',figsize=(4,3), type='line', figratio=(12,4),style=cs,axisoff=True)
    mpf.plot(alldata[i]['df'],title='sma_s',figsize=(4,3), mav=(sma_s), type='line', figratio=(12,4),style=cs,axisoff=True,linecolor='#ffffff')
    mpf.plot(alldata[i]['df'],title='sma_m',figsize=(4,3), mav=(sma_m), type='line', figratio=(12,4),style=cs,axisoff=True,linecolor='#ffffff')
```

# STEP5　データセットの作成
この先は未開の地に踏み込んでいく
まずはイメージのデータ化　https://qiita.com/croquette0212/items/9bb41c698d65282e5bb2
どうやらKERASを使うみたいだなあ・・・
ファイルをラベル付けしたファルダに入れると自動だって。。。（こりゃ、やはりMINSTとかで練習したほうがよさそうな気がする）

と言うわけで、ここまでで一旦このトピックを終えます。

#STEP6 ヒストグラム
少しデータの分布をチェックしてみる

```main.py
df['volume']=0.1 
df.hist()
```

やはり、少々歪みがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/f6a98ca4-703e-2f2e-13de-a7568da51694.png)

```main.py
import numpy
df2 = df.apply(numpy.log)
```

少しだけ正規分布に近くなったのかも

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/733231bf-e647-06f7-2795-0ee11b9d1bc3.png)