#5/6
やっとRSI_BREAKOUTのインジケータをMQL4→jsに移植した。
https://chanmoto.github.io/index.html
JSでHTMLに絵を描くことを学んだ
https://developer.mozilla.org/ja/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes
#5/5
方針としては以下に決めた
- 為替予想チャートはGITHUBをWEBサーバーにすること http://1969681.blog66.fc2.com/blog-entry-606.html
- チャートはJSでHTMLファイルで描く → 参考:JavaScriptのローソク足のGUI
- ブレイクアウト計算もフロントエンドで実施する → 参考:サポート&レジスタンスのライン計算
#5/4
すこしだけ進展があり、記事を更新する。
ブレイクアウトの検出と、GUI出力の件でかなり悩んでいたが、ようやく一筋の光が見えてきた。
(その間に、渡り歩いたGITHUBリポジトリの数は、数百に及ぶ・・・)
その中から、キラリと輝いたものを二、三ここにあげておく
JavaScriptのローソク足のGUI
ライブラリを使わずHTMLソースが分かりやすかった。
JSのアレイの使い方とか、ソースを読むにも非常に参考になった。
https://github.com/amih/Candlestick.js
サポート&レジスタンスのライン計算
自分でも開発しているRSIブレイクアウト法とコンセプトは同じ。
感性のレベルで親近感を覚える(ただし中国人)
https://github.com/WestXu/support_resistance_line
各種機械学習による為替予想
FLASKで作られているミニアプリ
これぐらいのソースを読破するのが心地いい
https://github.com/repollo/stock-prediction
#3/17
ソースコードの置き換え → これまでインジケータの新部分をmql4で書いていた。これをまずpythonに書き換える必要がある。
https://github.com/chanmoto/rsi_breakout
根本的なソースは以下 → MQL4はCライクな言語である。
int counted_bars=IndicatorCounted();
for(i=0; i<1000; i++){
RSI[i]=iRSI(NULL,0,nPeriod_RSI,PRICE_CLOSE,i+1);
}
for(i=0; i<1000; i++){
mov_rsi[i]=iMAOnArray(RSI,0,nPeriod_MA,0,MA_Method,i)+offset;
}
for(i=0; i<Limit; i++){
Kairi_buffer[i] = (RSI[i]-mov_rsi[i])/mov_rsi[i];
}
j=0;
for(i=1; j<nLine*2+6; i++){
if (Kairi_buffer[i] * Kairi_buffer[i+1] <= 0){
ii[j] = i;
j++;
if(j>2){
if(ii[j-1]-ii[j-3]<min_gap){
j=j-2;
}
}
}
}
if(Kairi_buffer[ii[0]]<0)
{
for(ll=0; ll<nLine+6;ll++)
{
Hi_stack[ll] = ArrayMaximum(RSI, ii[1+ll*2]-ii[0+ll*2]+1, ii[0+ll*2]+1);
Lo_stack[ll] = ArrayMinimum(RSI, ii[2+ll*2]-ii[1+ll*2]+1, ii[1+ll*2]+1);
}
}
else
{
for(ll=0; ll<nLine+6;ll++)
{
Hi_stack[ll] = ArrayMaximum(RSI, ii[2+ll*2]-ii[1+ll*2], ii[1+ll*2]+1);
Lo_stack[ll] = ArrayMinimum(RSI, ii[1+ll*2]-ii[0+ll*2], ii[0+ll*2]+1);
}
}
for(ll=0;ll<nLine;ll++)
{
hp1=RSI[Hi_stack[ll]];
hp2=RSI[Hi_stack[ll+1]];
hp1n=Hi_stack[ll];
hp2n=Hi_stack[ll+1];
hp3n=Hi_stack[ll-1];
if(hp2n!=hp1n) { rh=((hp2-hp1)/(hp2n-hp1n));}
lp1=RSI[Lo_stack[ll]];
lp2=RSI[Lo_stack[ll+1]];
lp1n=Lo_stack[ll];
lp2n=Lo_stack[ll+1];
lp3n=Lo_stack[ll-1];
if(lp1n!=lp2n){ rl=((lp1-lp2)/(lp2n-lp1n));}
for(k=0;k<hp2n-hp1n;k++){ buf1[hp1n+k]=hp1+rh*k;}
for(k=0;k<lp2n-lp1n;k++){ buf2[lp1n+k]=lp1-rl*k;}
for(k=1;k<=hp1n-hp3n;k++){ buf3[hp1n-k]=hp1-rh*k;}
for(k=1;k<=lp1n-lp3n;k++){ buf4[lp1n-k]=lp1+rl*k;}
}
for(i=0; i<Limit; i++){
buf5[i]=EMPTY_VALUE;
buf6[i]=EMPTY_VALUE;
}
for(i=0; i<Limit; i++){
// SELL
if ( buf4[i]>=buf4[i+1] && MathAbs((buf4[i]-buf4[i+1])-(buf4[i-1]-buf4[i]))<0.001 && RSI[i] < buf4[i] && RSI[i+2] > buf4[i+2] && buf4[i+1] - RSI[i+1] > margin){
buf6[i]=RSI[i];
} else {
buf6[i]=EMPTY_VALUE;
}
// BUY
if ( buf3[i]<=buf3[i+1] && MathAbs((buf3[i]-buf3[i+1])-(buf3[i-1]-buf3[i]))<0.001 && RSI[i]>buf3[i] && RSI[i+2]<buf3[i+2] && RSI[i+1] - buf3[i+1] > margin){
buf5[i]=RSI[i];
} else {
buf5[i]=EMPTY_VALUE;
}
}
return(0);
}
#3/15 久しぶりの更新
最近、AIやらWEBやら、本当に技術の進歩がすさまじく、
この勢いの中で、自分の進化が遅いことに、
すっかりあきれてしまっている。
ここらで初心に戻らないと、本当に潰されそうな気がしてならない。
考えれば、10年ぐらい前の時代が、
すごく時間の流れが緩やかで、
過ごしやすかった気がする。
最近、特にリモートワークで家にいる時間が長くて、
時間はたくさんあるのに、頭の成長ができていないことに
我ながら嘆いている。
(逆を言えば、普段仕事に追われて、勉強する時間が
取れなかったころに比べて、今は真逆の悩み事を抱えている)
AIトレード
半年かけてAIを学んできたことであるが、やはり問題の複雑さをAIで解くことは
非常に苦手であって、逆に言えば、問題を極力簡単にしてあげることが、
やはりAI使いこなしのコツなのではないかと考えている。
前の検討では、PFチャートから何らかの予想を考えていたが、
これはある意味、問題の複雑化が災いして、いかに解かせるのか?
といった、妙なところが難しく、試行錯誤を強いられていたようだ。
参考記事
https://qiita.com/EasyCording/items/052fccd77d079e515764
http://1969681.blog66.fc2.com/blog-entry-592.html
http://1969681.blog66.fc2.com/blog-entry-596.html
http://1969681.blog66.fc2.com/blog-entry-597.html
MTブレイクラインへの適用
AIの得意分野としては、やはりパターン認識と、0/1判断のようなところから
再度、出直してみようかと思う。
以前にMT4のインジケータで、後出しじゃんけんのようなものがあった。
いわゆるデータにあわせて、つじつまを合わせをするものであって、
リアルタイムで出しているサインを、後になって消去してしまうようなものだ。
こういうのをウソ発見器とでもいうべきだろうか?
インジケータが出したサインを、そのあとに控えているAIが、
あたかも、ウソ?、ホント?を出してくれるようなものを
作ればいいのではないか?
幸いながらバックテストを実施すれば、サインが出た時の状況と、
その後、サインが消灯したのかは再現でき、これは大量に学習データを用意することができる。
少なくとも、自分が開発したMTブレイクラインも、少なからず
そういうタイプのインジケータであった。
今回はやはり初心に戻って、当初のインジケータ開発で遭遇していた
つじつま合わせに対して、AIで判定をすることを考えてみたいと思う。
MTブレイクアウトの過去記事はこちら
https://qiita.com/EasyCording/items/1fa5780d55424306d1de
http://1969681.blog66.fc2.com/blog-entry-25.html
http://1969681.blog66.fc2.com/blog-entry-363.html
#2/15
- 書籍購入 → ファイナンス機械学習―金融市場分析を変える機械学習アルゴリズムの理論と実践 (日本語)
奥が深すぎて、完全に消化不良・・・( ^ω^)・・・
1)トリプルバリア戦略について
これまでボックストレードと言うものがあることを漠然と知っていましたが、
これを機械学習でフィッティングすれば、けっこう面白そうと思いました。
2)定常性とメモリーについて
価格変動には2つの要因がありうる。
- メモリー 移動平均のような過去の価格を基準とした要因
- 定常性 モメンタムのようなその時点での需給バランス要因
どっちが支配的と言うのは、相場によって性格が変わる。
再現性の得やすいのは、やはり定常性だとか・・・
つまりレンジ相場における、RSIなんかがトレード予想に向いている。
#12/24
-
既出かもしれないが、チャートを画像処理でAI判定させるというもの
https://arxiv.org/pdf/1903.12258.pdf
→ 画像判定で二値化判断する部分は、CNNを使うのが常套手段になるとは思われる。 -
今回、P&Fを使っているが、これを新値足でやっているものも発見(世の中、まだまだ上を行く人がいる・・・)
https://randomwalkjapan.blogspot.com/2020/01/ai-stock-price-ai-forecast-three-line.html -
コロナ禍ですが、仕事帰りにヨドバシへ行き、書籍を発見
https://amzn.to/3pkOnDP
→ NUMPYで数値データをベクトル化するところが参考になった。
-
AI予測は連続データではなくて、離散化してラベル分類タスクに読み替えるところがミソ
→ np.digitize の使い方はこちら https://panda-clip.com/binning2/
#12/20
EURUSDでの予想をやっているが、やはり気づいた点としては
-
時系列情報に引っ張られやすい → つまり大きなトレンドの特徴を捕まえてしまい、
小さい変動が無視されてしまう -
次の作戦としては、直接的に為替価格を見るのではなく、
移動平均線等を使って、そこからの乖離率を使ってみようと思う。
価格(上)
乖離率(下)
乖離率の定義 : 乖離率=((当日の終値-移動平均値)÷移動平均値)×100
手順
ENCODE : 価格 → 乖離率の計算 → P&F → 入力ベクトル
DECODE : 出力ベクトル → P&F → 乖離率の逆変換 → 価格
これをすることで、より小さい特徴を捉えられるようになるのではないか?
#12/19
今日の本題であるが、やはりAIというのは、
学習データの与え方や、ネットワークの組み方など
いわゆる、調教の部分に難しさを感じている。
自分の手足以上に、ペットを飼いならすかのごとく
どんな餌を与えて、どんな環境で飼育したら、
言うことを聞いてくれるのか、なかなか難しいように思う。
本屋に行って、それこそPythonを使ってAIの本は
山ほど見つかるのであるが、どのような構成でモデリングしたらよいのか
その部分については、あまり開示されていないように思う。
とりあえず、この週末に検討したこととしては
##1)教師データを増やすこと
これまで日足で5000データほど与えていたが、PFデータでは時間圧縮がされるため、これを15分足にしてみた。
データはOANDAのメタトレードのものをCSV保存して使っている。
##2)ハイパーパラメータの工夫
BATCHサイズや、時間軸のステップ長さなど、まだまだ調整する必要がある。
これらの変更と調整の部分で、ソースコードを関数式に変更した。
パラメータ調整自体が、最適化問題になるため、この部分は別途でループを回す必要がある。
MT4であれば、遺伝的最適化法があるが、AIの場合は外付けで最適化問題を解く必要がある。
##3)最適化法
大学院時代にやっていた共役勾配方法が、こんな時に役に立ってくるとは・・・
「ハイパーサーミアの加温条件最適化の研究」という、修士論文であるが、25年も前に
AIがまだ無名な時代に学んだことがある。
会社に入ってからは、実験計画法という形で、条件最適化をやっていて、この知識も融合すれば
鬼に金棒の気がする。
結局AIの知識って、プログラミングだけの話と思っていたが、
統計解析や品質工学やモデル解析など、いろんなことが絡んでくるねえ・・・
会社に入って、熱解析シミュレーションや構造最適化をやっていたので、
そういう知識を生かせるのかもしれない。