Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@EasyCording

AIシステムトレード開発

5/6

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

RSI_BREAKOUT 取扱説明書
無題.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

すこしだけ進展があり、記事を更新する。

ブレイクアウトの検出と、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での予想をやっているが、やはり気づいた点としては

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

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

価格(上)
乖離率(下)

無題.png

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

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
EasyCording
昔、PC8001でゲームプログラミングやってました。最近はFXのシステムトレード開発や、趣味の語学学習と、ブログ書いたりしています。NASを使って自宅でWEBアプリなんかも作っています。めんどくさがりなので、QIITAでも偉そうな記事は書けません。究極のアナログ人間です。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?