AIシステムトレード開発


5/6

やっとRSI_BREAKOUTのインジケータをMQL4→jsに移植した。
https://chanmoto.github.io/index.html

RSI_BREAKOUT 取扱説明書

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の知識って、プログラミングだけの話と思っていたが、
統計解析や品質工学やモデル解析など、いろんなことが絡んでくるねえ・・・
 会社に入って、熱解析シミュレーションや構造最適化をやっていたので、
そういう知識を生かせるのかもしれない。