ＡＩシステムトレード　PIX2PIX反省点


https://qiita.com/EasyCording/items/02f6e54d8c133810f097

少しブログの方で取引を進めていて、今のやり方に対する疑問が出てきた。
http://1969681.blog66.fc2.com/

# 現状
いまのところは、為替データを2つに分けて、ペアで学習させている。
wsizeがサンプリング期間で前半64、後半64のデータとなる。
```main.py
wsize=128 #サンプル期間

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(dfspan1,dfspan2):
    a = np.array([x for x in dfspan1['df']['close']])
    b = np.array([x for x in dfspan1['df']['high']])
    c = np.array([x for x in dfspan1['df']['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[0,64:128,64:128]
    te25 = np.stack([te2,te2,te2], axis=0)
    te3=np.concatenate([te1,te25], 2)
    te4=np.kron(te3, np.ones((2,2)))
    tmp = torch.from_numpy(te4).clone()
    return  transforms.ToPILImage(mode='RGB')(tmp)   
```
これはあくまで、教師データなので、事前に分かっているデータであるが、
実際に使う場合は、後半の64のみを使って、次の64個を予想するのである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/45b05a13-6577-f59d-447b-a766ab7b978f.png)

いま単純に右側を与えて、左側を出したところで、そもそもこの不連続点と言うものは、
何を意味しているのであろうか？

さらに、そもそも右側のデータがかなり低い部分に分布しているが、
これより下がるという予想は、存在しないということだろうか？
（つまり教師データは、右と左を同じスケーリングでMAX-MIN処理をしているから、
右側のデータだけを取り出しても、それが0-1の範囲になることを保証しているわけではない）

もう一方で、教師データの前半64と後半64を分けて、それぞれ0-1に正規化すると、
その時点で連続性が無視されることになる。

つまり、PIX2PIXを使った相場の予想では、Ａ→Ｂに移行する際の、
連続性をどうやって担保するのかと言うのが、課題になってくる。
（そもそも連続でないとすると、Ａ→Ｂにおいて上昇トレンドなのか、下降トレンドなのかが
判断できない結果となってしまう。もちろん、Ａも上昇、Ｂも上昇などの同じ傾向なら、
大体の想像はつくのであるが。。。）

いったん、ここは64個+64個をそれぞれでMAX-MIN（0-1）ではトライしてみるが、
ここは何か抜本的な対策が必要だといえる。

# 変更点

テンソルをＡ，Ｂに分けるところ

    te1 = te[:,0:64,0:64]
    te2 = te[0,64:128,64:128]

それぞれのmax、minはこんな感じ

```
ipdb> te2.max()
0.59875214
ipdb> te2.min()
0.0
ipdb> te1.max()
1.0
ipdb> te1.min()
0.0
```

変更後

```
ipdb> te2=min_max(te2)
ipdb> te2.max()
1.0
ipdb> te2.min()
0.0
```

# ミスった～
　たまに学習中に、画像が反転しているものがあった。
　なんでかと思ったら、Flipするのがデフォルトになっていたようだ　→　https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix/issues/55

正しいトレーニングのコマンド
```
python train.py --dataroot ./datasets/facades --name facades_pix2pix --model pix2pix --direction AtoB --batch_size 32 --gpu_ids 0,1 --no_flip
```


# 最終的にどうしたか
　結局はＡ，Ｂ画像に共通領域を使って、重複させることを思いついた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/f93d4e92-1f5f-506b-715c-1f1ffdcb21da.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/7e7ee5de-4d21-1638-39e2-7310c02f29d8.png)
#### Trainデータの作成

* 解析期間　WSIZE　96日　-->　a(n=32)+b(n=32)+c(n=32)　　TRAIN時に　Aはa,b、Bはb,cを使う　　
* テンソル　０：終値　１：高値－終値　２：終値－安値
* 正規化　MAX-MIN　（A,B別々に正規化）　

```main.py
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(dfspan1):
    a = np.array([x for x in dfspan1['df']['close']])
    b = np.array([x for x in dfspan1['df']['high']])
    c = np.array([x for x in dfspan1['df']['low']])
    
    m = np.outer(a,a).astype(np.float32)
    n = np.outer(b-a,b-a).astype(np.float32)
    o = np.outer(a-c,a-c).astype(np.float32)
    
    m1 = min_max(m[0:64,0:64])
    m2 = min_max(m[32:96,32:96])
    n1 = min_max(n[0:64,0:64])
    n2 = min_max(n[32:96,32:96])
    o1 = min_max(o[0:64,0:64])
    o2 = min_max(o[32:96,32:96])
    
    te1 = np.stack([m1,n1,o1])
    te2 = np.stack([m2,n2,o2])
    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)   

for item in alldata:
    img=imagemake(item)
    fn = item['date'].index.astype(str).values.tolist()
    fname = "datasets/facades/train/" + fn[0] + ".png"
    img.save(fname)
```

# 結果
　データの前半２／３がREAL、後半２／３がFAKEのイメージですが、これを単に重ねてもだめですね。
要するに真ん中のイメージが橋渡しの部分なので、平均値とかでOFFSETして重ねた方がいいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/6406aefd-92e0-2f2f-68c2-6c7243124fca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/b7072eff-fc8a-e967-d77f-213c452fc75a.png)