前の続きです。
STEP1
ここまでのコードです。
!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(長期)
フォルダ
ラベル毎にデータが保存されています。
main.py
└─train
├─+ 変化小 >+2%
├─++ 変化大 >+4%
├─- 変化小 <-2%
├─-- 変化大 <-4%
└─0 変化無し ±2%以下
STEP2
ここからはPytorchを使ってみます 参考記事→https://reafnex.net/ai/pytorch-use-imagefolder/
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
Dataset ImageFolder
Number of datapoints: 2520
Root location: ./train/
StandardTransform
Transform: <__main__.ImageTransform object at 0x00000138D82F0040>
はぁっ? 何が起こったん? コピペしただけやで。。。
まさか、前処理、これで終わったん?
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())
そもそも、わいの存在意義って、あるんかいな???
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/
とりあえず、写経を進める。
# 学習データ、検証データに 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
あっさり、していますね。