少しブログの方で取引を進めていて、今のやり方に対する疑問が出てきた。
http://1969681.blog66.fc2.com/
現状
いまのところは、為替データを2つに分けて、ペアで学習させている。
wsizeがサンプリング期間で前半64、後半64のデータとなる。
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個を予想するのである。
いま単純に右側を与えて、左側を出したところで、そもそもこの不連続点と言うものは、
何を意味しているのであろうか?
さらに、そもそも右側のデータがかなり低い部分に分布しているが、
これより下がるという予想は、存在しないということだろうか?
(つまり教師データは、右と左を同じスケーリングで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画像に共通領域を使って、重複させることを思いついた。
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別々に正規化)
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して重ねた方がいいでしょう。