ＡＩシステムトレード　教師データ作成編

https://qiita.com/EasyCording/items/486ad3608ef142d56f4b

前の続きです。

#STEP1
ここまでのコードです。

```main.py
!pip install pandas_datareader
!pip install --upgrade pandas

import pandas as pd
import datetime as dt
from pandas_datareader import data
import mplfinance as mpf

#apikey = '取得したAPIキー'
apikey = ''
symbol = 'EURUSD'

start = dt.date(2011,1,1)
end = dt.date(2021,1,30)

sma_s= 20
sma_m= 50

df = data.DataReader(symbol,'av-daily',start,end, api_key=apikey)

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

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

alldata =[]

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

import os
# Path to the train folder
new_dir_path = './train'
for i in ['--','-','0','+','++']:
    os.mkdir(new_dir_path+"/"+i)

cs  = mpf.make_mpf_style(gridcolor="white",mavcolors=['#00ff00','#0000ff'])

for i in range(len(alldata)):
    mpf.plot(alldata[i]['df'],savefig= new_dir_path + alldata[i]['label']+ '/'\
             + str(i) +'test.png',mav=(sma_s,sma_m),figsize=(1,1), type='line',\
             figratio=(12,4),style=cs,axisoff=True,\
             linecolor='#ff0000',tight_layout=True)
```
##画像データ
画像はRGBに分離できるので1枚にしました。サイズは106×106です。
赤→終値、緑→SMA（短期）、青→SMA(長期)
![4test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/3be76746-034b-0313-5fb4-ec51148f6201.png)
##フォルダ
ラベル毎にデータが保存されています。
main.py
└─train
　├─+　　　変化小　>+2%
　├─++　　変化大　>+4%
　├─-　　　変化小　<-2%
　├─--　　変化大　<-4%　
　└─0　　　変化無し　±2%以下

#STEP2
ここからはPytorchを使ってみます　参考記事→https://reafnex.net/ai/pytorch-use-imagefolder/

```main.py
class ImageTransform():
  def __init__(self, mean, std):
    self.data_transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean, std)
    ])

  def __call__(self, img):
    return self.data_transform(img)

import torch
from torchvision import transforms
from torchvision.datasets import ImageFolder

#画像データをImageFolderを使って取込みする
mean = (0.5,)
std = (0.5,)
images = ImageFolder( new_dir_path, transform = ImageTransform(mean, std))
```

さあ～　SHIFT+RETURN

```main.py
Dataset ImageFolder
    Number of datapoints: 2520
    Root location: ./train/
    StandardTransform
Transform: <__main__.ImageTransform object at 0x00000138D82F0040>
```

はぁっ？　何が起こったん？　コピペしただけやで。。。
まさか、前処理、これで終わったん？

```main.py
import torch.utils.data as data

#1バッチに含む画像の枚数を指定する
batch_size = 64

#ImageFolderで取り込んだ画像からデータローダーを作成する
train_dataloader = data.DataLoader(images, batch_size = batch_size, shuffle = True)

#データローダから、画像とラベルのテンソルを取り出す。
imgs, labels = iter(train_dataloader).next()

import matplotlib.pyplot as plt
%matplotlib inline

#バッチから取り出した画像のイメージとラベルを表示する
pic = transforms.ToPILImage(mode='RGB')(imgs[0])
plt.imshow(pic)
print("Label is ",labels[0].numpy())

```

わい、なんもしてへん・・・
```Label is  4```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/154edd98-47fe-c9d0-bc54-886da3aee355.png)

そもそも、わいの存在意義って、あるんかいな？？？

#STEP3　データ分離
　とりあえず、ここまでで、いわゆるテンソル化というのが終了したらしい。ここから先であるが、本来KERASだと、trainとvalidationに、データを分けて、同じフォルダ体系にもっていけば良いらしい。今回で言えば、下記のようなフォルダ体系となる。→　https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

```
main.py
└─train
　├─+　　　変化小　>+2%
　├─++　　変化大　>+4%
　├─-　　　変化小　<-2%
　├─--　　変化大　<-4%　
　└─0　　　変化無し　±2%以下
└─validation
　├─+　　　変化小　>+2%
　├─++　　変化大　>+4%
　├─-　　　変化小　<-2%
　├─--　　変化大　<-4%　
　└─0　　　変化無し　±2%以下
```

今回はPytorchであり、このプロセスは終わっているみたいだ。
pytorch　→　https://pystyle.info/pytorch-split-dataset/

とりあえず、写経を進める。

```main.py
# 学習データ、検証データに 8:2 の割合で分割する。
train_size = int(0.8 * len(images))
val_size = len(images) - train_size
train_dataset, val_dataset = torch.utils.data.random_split(
    images, [train_size, val_size]
)

len(train_dataset)
2016

len(val_dataset)
504
```

あっさり、していますね。