自分で進んでいる方向が分からない
最近はボヤっと考えていたことが、寝起きになってハッとひらめくことが多い。
(まるで自分の脳が、夜中にディープラーニングしているようだ)
思い付き
前の記事で、チャートを色付き画像に変換するところを考えたが、pix2pixというものを使うと、GANが勝手にペアを覚えてくれるとのこと
データの与え方は、下記のようにするらしい(画像は上記サイトのものを引用)
今回は下記のように、一つの画像に過去と未来が混在している訳だし、
A過去→B未来をペアで学習させれば良いはずだ。
(下記画像の生成については、ソースを参照のこと)
dfspan
open high low close volume
2021-10-13 1.1530 1.1599 1.1527 1.1597 0
2021-10-14 1.1597 1.1624 1.1582 1.1598 0
2021-10-15 1.1597 1.1619 1.1586 1.1600 0
2021-10-18 1.1599 1.1622 1.1570 1.1609 0
2021-10-19 1.1609 1.1669 1.1607 1.1629 0
... ... ... ... ... ...
2022-01-26 1.1299 1.1311 1.1234 1.1241 0
2022-01-27 1.1241 1.1243 1.1130 1.1142 0
2022-01-28 1.1143 1.1174 1.1120 1.1146 0
2022-01-31 1.1141 1.1248 1.1137 1.1233 0
2022-02-01 1.1235 1.1279 1.1219 1.1270 0
from PIL import Image
def min_max(x, axis=None):
min = x.min(axis=axis, keepdims=True)
max = x.max(axis=axis, keepdims=True)
result = (x-min)/(max-min)
return result
a = np.array([x for x in dfspan['close']])
b = np.array([x for x in dfspan['high']])
c = np.array([x for x in dfspan['low']])
m = min_max(np.outer(a,a).astype(np.float32))
n = min_max(np.outer(a-b,a-b).astype(np.float32))
o = min_max(np.outer(a-c,a-c).astype(np.float32))
te = np.stack([m,n,o])
tmp = torch.from_numpy(te).clone()
img_pil = transforms.ToPILImage(mode='RGB')(tmp)
plt.imshow(img_pil)
plt.show()
評価結果
昨日は、簡単な処理を書いて、trains画像フォルダにっつこんで、コマンドを実施した。
ソースを読むと、カラフルな画像を描く部分もあり、膨大な割には、核の部分はシンプルのように思える。
(しかし、こんな何にも特徴を見いだせない画像でさえ、なんらか学習していくなんて。
すごい学習能力だなと思う反面、ものすごくかわいそうな気がしてくる。。。)
2点ほど、躓いたことがあったが、結構簡単なので驚いた。
デフォルトが200回なのであるが、800回までチャレンジ中
# !/usr/bin/env python
# coding: utf-8
# In[1]:
get_ipython().system('pip install pandas_datareader')
get_ipython().system('pip install --upgrade pandas')
get_ipython().system('pip install mplfinance')
# In[82]:
import pandas as pd
import datetime as dt
from pandas_datareader import data
import mplfinance as mpf
import torch
from torchvision.datasets import ImageFolder
from torchvision import models, transforms
import torch.nn as nn
import numpy as np
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
# apikey = '取得したAPIキー'
symbol = 'EURUSD'
start = dt.date(2000,1,1)
end = dt.date(2022,2,3)
df = data.DataReader(symbol,'av-daily',start,end, api_key=apikey)
# In[83]:
wsize=128 #サンプル期間
df.index = pd.DatetimeIndex(df.index)
alldata =[]
for time in range(len(df)-wsize):
try:
dfspan = df[time:time+wsize]
alldata.append({"df":dfspan,"date":dfspan.tail(1)})
except:
pass
# In[84]:
from PIL import Image
import matplotlib.pyplot as plt
def min_max(x, axis=None):
min = x.min(axis=axis, keepdims=True)
max = x.max(axis=axis, keepdims=True)
result = (x-min)/(max-min)
return result
def imagemake(dfspan):
a = np.array([x for x in dfspan['close']])
b = np.array([x for x in dfspan['high']])
c = np.array([x for x in dfspan['low']])
m = min_max(np.outer(a,a).astype(np.float32))
n = min_max(np.outer(b-a,b-a).astype(np.float32))
o = min_max(np.outer(a-c,a-c).astype(np.float32))
te = np.stack([m,n,o])
te1 = te[:,0:64,0:64]
te2 = te[:,64:128,64:128]
te3=np.concatenate([te1,te2], 2)
te4=np.kron(te3, np.ones((2,2)))
tmp = torch.from_numpy(te4).clone()
return transforms.ToPILImage(mode='RGB')(tmp)
# In[85]:
for i,item in enumerate(alldata):
img=imagemake(item['df'])
fname = "train/" + str(i) + ".png"
img.save(fname)
参考サイト
https://farml1.com/pix2pix_2/
https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
結果の振り返り
結局、800サイクルまで学習させて、どのような結果が得られたのかを検証する。
real_aを入力して、出てくるfake_bがreal_bに似ていれば、正解ということになる。
とりあえず、なんか違うような気がしてきた・・・