ＡＩシステムトレード　PIX2PIX編

自分で進んでいる方向が分からない

http://1969681.blog66.fc2.com/blog-entry-637.html

https://qiita.com/EasyCording/items/d62662026acd5e5d5126

最近はボヤっと考えていたことが、寝起きになってハッとひらめくことが多い。
（まるで自分の脳が、夜中にディープラーニングしているようだ）

# 思い付き
 前の記事で、チャートを色付き画像に変換するところを考えたが、pix2pixというものを使うと、ＧＡＮが勝手にペアを覚えてくれるとのこと

https://ceblog.mediba.jp/post/157816928947/opencv%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%8B%95%E7%94%BB%E3%81%8B%E3%82%89pix2pix%E3%81%AE%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B

データの与え方は、下記のようにするらしい（画像は上記サイトのものを引用）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/8afb865d-b5ae-e860-08db-eb4453ce548b.png)

今回は下記のように、一つの画像に過去と未来が混在している訳だし、
Ａ過去→Ｂ未来をペアで学習させれば良いはずだ。
（下記画像の生成については、ソースを参照のこと）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/e362fae6-380d-79a4-0c11-1bb93ab4f92b.png)

```main.py
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画像フォルダにっつこんで、コマンドを実施した。
ソースを読むと、カラフルな画像を描く部分もあり、膨大な割には、核の部分はシンプルのように思える。
（しかし、こんな何にも特徴を見いだせない画像でさえ、なんらか学習していくなんて。
すごい学習能力だなと思う反面、ものすごくかわいそうな気がしてくる。。。）

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/5d6f6201-ba02-815c-987f-92cf3beb383c.png)

2点ほど、躓いたことがあったが、結構簡単なので驚いた。
デフォルトが200回なのであるが、800回までチャレンジ中

```pix2pix_data.py
#!/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

# 結果の振り返り

　結局、８００サイクルまで学習させて、どのような結果が得られたのかを検証する。
real_aを入力して、出てくるfake_bがreal_bに似ていれば、正解ということになる。

　とりあえず、なんか違うような気がしてきた・・・

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/a25e1cc6-9486-5277-f492-871202cc87c7.png)