0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2022-02-01

前の続きです。

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

フォルダ

ラベル毎にデータが保存されています。
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

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

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?