ＡＩシステムトレード開発  

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

[RSI_BREAKOUT 取扱説明書](https://qiita.com/EasyCording/items/1fa5780d55424306d1de)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/787e577d-c5a3-0d42-3cd7-caff91446846.png)


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 
すこしだけ進展があり、記事を更新する。

ブレイクアウトの検出と、ＧＵＩ出力の件でかなり悩んでいたが、ようやく一筋の光が見えてきた。
（その間に、渡り歩いたＧＩＴＨＵＢリポジトリの数は、数百に及ぶ・・・）

その中から、キラリと輝いたものを二、三ここにあげておく

#### 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はＣライクな言語である。

```mql

    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 久しぶりの更新

最近、ＡＩやらWEBやら、本当に技術の進歩がすさまじく、
この勢いの中で、自分の進化が遅いことに、
すっかりあきれてしまっている。

ここらで初心に戻らないと、本当に潰されそうな気がしてならない。

考えれば、１０年ぐらい前の時代が、
すごく時間の流れが緩やかで、
過ごしやすかった気がする。

最近、特にリモートワークで家にいる時間が長くて、
時間はたくさんあるのに、頭の成長ができていないことに
我ながら嘆いている。
（逆を言えば、普段仕事に追われて、勉強する時間が
取れなかったころに比べて、今は真逆の悩み事を抱えている）


# ＡＩトレード
　半年かけてＡＩを学んできたことであるが、やはり問題の複雑さをＡＩで解くことは
非常に苦手であって、逆に言えば、問題を極力簡単にしてあげることが、
やはりＡＩ使いこなしのコツなのではないかと考えている。

　前の検討では、ＰＦチャートから何らかの予想を考えていたが、
これはある意味、問題の複雑化が災いして、いかに解かせるのか？
といった、妙なところが難しく、試行錯誤を強いられていたようだ。

参考記事
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

# ＭＴブレイクラインへの適用

　ＡＩの得意分野としては、やはりパターン認識と、０／１判断のようなところから
再度、出直してみようかと思う。
　以前にＭＴ４のインジケータで、後出しじゃんけんのようなものがあった。
いわゆるデータにあわせて、つじつまを合わせをするものであって、
リアルタイムで出しているサインを、後になって消去してしまうようなものだ。

　こういうのをウソ発見器とでもいうべきだろうか？

　インジケータが出したサインを、そのあとに控えているＡＩが、
あたかも、ウソ？、ホント？を出してくれるようなものを
作ればいいのではないか？

　幸いながらバックテストを実施すれば、サインが出た時の状況と、
その後、サインが消灯したのかは再現でき、これは大量に学習データを用意することができる。
　
　少なくとも、自分が開発したＭＴブレイクラインも、少なからず
そういうタイプのインジケータであった。
　
　今回はやはり初心に戻って、当初のインジケータ開発で遭遇していた
つじつま合わせに対して、ＡＩで判定をすることを考えてみたいと思う。

# ＭＴブレイクアウトの過去記事はこちら
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
* 書籍購入　→　ファイナンス機械学習―金融市場分析を変える機械学習アルゴリズムの理論と実践 (日本語)
奥が深すぎて、完全に消化不良・・・（　＾ω＾）・・・

### １）トリプルバリア戦略について
　これまでボックストレードと言うものがあることを漠然と知っていましたが、
これを機械学習でフィッティングすれば、けっこう面白そうと思いました。

### ２）定常性とメモリーについて　
　価格変動には２つの要因がありうる。

* メモリー　　　移動平均のような過去の価格を基準とした要因
* 定常性　　　モメンタムのようなその時点での需給バランス要因

　どっちが支配的と言うのは、相場によって性格が変わる。
　再現性の得やすいのは、やはり定常性だとか・・・
　つまりレンジ相場における、ＲＳＩなんかがトレード予想に向いている。　

#12/24
* 既出かもしれないが、チャートを画像処理でＡＩ判定させるというもの
　https://arxiv.org/pdf/1903.12258.pdf
→　画像判定で二値化判断する部分は、ＣＮＮを使うのが常套手段になるとは思われる。

* 今回、Ｐ＆Ｆを使っているが、これを新値足でやっているものも発見（世の中、まだまだ上を行く人がいる・・・）
 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での予想をやっているが、やはり気づいた点としては

* 時系列情報に引っ張られやすい　→　つまり大きなトレンドの特徴を捕まえてしまい、
小さい変動が無視されてしまう

* 次の作戦としては、直接的に為替価格を見るのではなく、
移動平均線等を使って、そこからの乖離率を使ってみようと思う。

価格（上）
乖離率（下）

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/cbe1a792-5b49-6113-317c-fdded4f368c9.png)

乖離率の定義　　：　　　乖離率＝（(当日の終値-移動平均値)÷移動平均値）×100

手順
ENCODE　：　　価格　→　乖離率の計算　→　P&F　→　入力ベクトル
DECODE　：　　出力ベクトル　→　P&F　→　乖離率の逆変換　→　価格

これをすることで、より小さい特徴を捉えられるようになるのではないか？


#12/19

今日の本題であるが、やはりＡＩというのは、
学習データの与え方や、ネットワークの組み方など
いわゆる、調教の部分に難しさを感じている。

自分の手足以上に、ペットを飼いならすかのごとく
どんな餌を与えて、どんな環境で飼育したら、
言うことを聞いてくれるのか、なかなか難しいように思う。

本屋に行って、それこそPythonを使ってＡＩの本は
山ほど見つかるのであるが、どのような構成でモデリングしたらよいのか
その部分については、あまり開示されていないように思う。

とりあえず、この週末に検討したこととしては
##１）教師データを増やすこと
　これまで日足で５０００データほど与えていたが、ＰＦデータでは時間圧縮がされるため、これを１５分足にしてみた。

　データはOANDAのメタトレードのものをＣＳＶ保存して使っている。

##２）ハイパーパラメータの工夫
　BATCHサイズや、時間軸のステップ長さなど、まだまだ調整する必要がある。
　これらの変更と調整の部分で、ソースコードを関数式に変更した。
　パラメータ調整自体が、最適化問題になるため、この部分は別途でループを回す必要がある。
　ＭＴ４であれば、遺伝的最適化法があるが、ＡＩの場合は外付けで最適化問題を解く必要がある。

##３）最適化法
　大学院時代にやっていた共役勾配方法が、こんな時に役に立ってくるとは・・・
　「ハイパーサーミアの加温条件最適化の研究」という、修士論文であるが、25年も前に
ＡＩがまだ無名な時代に学んだことがある。
　会社に入ってからは、実験計画法という形で、条件最適化をやっていて、この知識も融合すれば
鬼に金棒の気がする。
　結局ＡＩの知識って、プログラミングだけの話と思っていたが、
統計解析や品質工学やモデル解析など、いろんなことが絡んでくるねえ・・・
　会社に入って、熱解析シミュレーションや構造最適化をやっていたので、
そういう知識を生かせるのかもしれない。