0
2

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-02-18

少しブログの方で取引を進めていて、今のやり方に対する疑問が出てきた。
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

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

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

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

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

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

変更点

テンソルをA,Bに分けるところ

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

最終的にどうしたか

 結局はA,B画像に共通領域を使って、重複させることを思いついた。

image.png
image.png

Trainデータの作成

  • 解析期間 WSIZE 96日 --> a(n=32)+b(n=32)+c(n=32)  TRAIN時に Aはa,b、Bはb,cを使う  
  • テンソル 0:終値 1:高値-終値 2:終値-安値
  • 正規化 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)

結果

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

image.png
image.png

0
2
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
2