投資におけるプログラミングの優位性について

開発部所属の福地です。
今回は、投資におけるプログラミングの優位性についてお話をしたいと思います。 テクニカル分析の中で重要視される「マルチタイムフレーム分析」、「トレンドライン」、「相関分析」を題材にチャート分析ツール「TradingView」(トレーディングビュー)を使ってお伝えします 。

「TradingView」(トレーディングビュー)とは
EAやインジケータの開発ができるチャート分析ツールといえばMetaTrader 4(MT4)を思い浮かべますが、最近になって「TradingView」(トレーディングビュー)という名前をよく耳にします。同じチャート分析ツールの一つですが、機能が豊富でTradingViewを使い始めるトレーダーが増えております。
また、TradingViewでは「Pineスクリプト」という オリジナルの言語を用いてインジーケーターを作成することができます。

マルチタイムフレーム分析とは
同時に複数の時間足を見ることにより大きな流れを捉えエントリータイミングを計っていくことを言います。複数のPCモニターを用意したり画面分割できるチャート分析ツールを選択して実現されている方が多いかと思います。
f:id:fukuchin0522kun:20201217124145p:plain

トレンドラインとは
価格の動きを分かりやすくするためにチャート上に補助線を引き現在のトレンドの方向性や売買ポイント確認するために利用します 。

f:id:fukuchin0522kun:20201217123737p:plain

相関分析とは
相関(逆相関)は一方が変われば他方も変わるような関係性のことです。各銘柄や通貨ペアに対して連動性を確認したりスクリーニングのサポートに利用したりします。
こちらもマルチタイムフレーム分析同様に複数のチャートを同時に確認し分析されている方が多いかと思います。 f:id:fukuchin0522kun:20201217145958p:plain

TradingViewを使ってプログラムを作成してみる
チャート下部のPineエディタ タブから自分でプログラムを記述することができます。 f:id:fukuchin0522kun:20201217150358p:plain

  @version=4                                    
 study(title="マイスクリプト", overlay=true) 
 val=input(title="短期MA", type=input.integer, defval=20)
 d=sma(security(syminfo.tickerid ,"60" ,close), val)
 plot(d,color=color.green,linewidth=5)

チャートに反映する。移動平均線ぐらいであれば数行のコードで完結することができます。 f:id:fukuchin0522kun:20201217152353p:plain

ここまで基本的なお話をさせて頂きました。 それでは優位性を高めるためプログラミングを使った「マルチタイムフレーム分析」、「トレンドライン」、「相関分析」に関するアイディアをご紹介します。

アイディア① ローソク足のマルチタイムフレーム分析
 5分足のチャートに上位足を表示し大きな流れを把握する。

f:id:fukuchin0522kun:20201217152431p:plain

treading viewではサーバーの過剰な使用を防ぐ為、数十本とライン数に制限をかけているようです。 1時間足1本分のサンプルコードを記載しておきます。

  //1時間足の陽線・陰線判定
 if security(syminfo.tickerid ,"60" ,close[1]) > security(syminfo.tickerid ,"60" ,open[1])
  m60_1_ue := security(syminfo.tickerid ,"60" ,close[1])
  m60_1_shita := security(syminfo.tickerid ,"60" ,open[1])
 else
  m60_1_ue := security(syminfo.tickerid ,"60" ,open[1])
  m60_1_shita :=security(syminfo.tickerid ,"60" ,close[1])

 //1時間足横線1
 yoko_1_1 = line.new( bar_index[12],m60_1_ue, bar_index[24], m60_1_ue, width = 2,color=security(syminfo.tickerid ,"60" ,close[1]) > security(syminfo.tickerid ,"60" ,open[1]) ? color.red : color.blue)
 line.delete(yoko_1_1[1])
 //1時間足横線2
 yoko_2_1 =  line.new( bar_index[12],m60_1_shita, bar_index[24], m60_1_shita, width = 2,color=security(syminfo.tickerid ,"60" ,close[1]) > security(syminfo.tickerid ,"60" ,open[1]) ? color.red : color.blue)
 line.delete(yoko_2_1[1])
 //1時間足縦線1
 tate_1_1 = line.new( bar_index[12],m60_1_ue, bar_index[12], m60_1_shita, width = 2,color=security(syminfo.tickerid ,"60" ,close[1]) > security(syminfo.tickerid ,"60" ,open[1]) ? color.red : color.blue)
 line.delete(tate_1_1[1])
//1時間足縦線2
 tate_2_1 = line.new( bar_index[24],m60_1_ue, bar_index[24], m60_1_shita, width = 2,color=security(syminfo.tickerid ,"60" ,close[1]) > security(syminfo.tickerid ,"60" ,open[1]) ? color.red : color.blue)
 line.delete(tate_2_1[1])
//1時間足上髭
 hige_1_1 = line.new( bar_index[18],security(syminfo.tickerid ,"60" ,low[1]), bar_index[18],m60_1_shita, width = 4,color=security(syminfo.tickerid ,"60" ,close[1]) > security(syminfo.tickerid ,"60" ,open[1]) ? color.red : color.blue)
 line.delete(hige_1_1[1])
//1時間足下髭
 hige_2_1 = line.new( bar_index[18],security(syminfo.tickerid ,"60" ,high[1]), bar_index[18],m60_1_ue, width = 4,color=security(syminfo.tickerid ,"60" ,close[1]) > security(syminfo.tickerid ,"60" ,open[1]) ? color.red : color.blue)
 line.delete(hige_2_1[1])

アイディア② トレンドラインの自動描画
上位足(1時間)の過去高値、安値の各2点を選択し直線を自動描画
f:id:fukuchin0522kun:20201217150214p:plain

 //ライン1(上)
h1_line1 = line.new( bar_index[6],security(syminfo.tickerid ,"60" ,low[0]), bar_index[18],security(syminfo.tickerid ,"60" ,low[1]), width = 1,color=color.black,extend=extend.left)
line.delete(h1_line1[1])

 //ライン2(下)
h1_line2 = line.new( bar_index[6],security(syminfo.tickerid ,"60" ,high[0]), bar_index[18],security(syminfo.tickerid ,"60" ,high[1]),  width = 1,color=color.black,extend=extend.left)
line.delete(h1_line2[1])

アイディア③ 通貨インデックスを利用した通貨単位での強弱(相関)
通貨ペアの各通貨単位にインデックスを算出し強弱を把握します。
f:id:fukuchin0522kun:20201217150230p:plain ※通貨インデックスとは、各通貨の強さを示した指数です。取引所やFRBが算出計算式を公開しております。

//GBPインデックス
d1=50.1*pow(security("GBPUSD" ,"5" ,close),0.32)*pow(security("GBPJPY" ,"5" ,close),0.136)*pow(security("EURGBP" ,"5" ,close),-0.32)
//JPYインデックス
d2=50.1*pow(security("USDJPY" ,"5" ,close),-0.576)*pow(security("EURJPY" ,"5" ,close),-0.136)*pow(security("GBPJPY" ,"5" ,close),-0.136)*100+20
//描画
plot(d1,color=color.green)
plot(d2,color=color.black)

終わりに
今回は、プログラミングを使ってテクニカル分析力を高めるというお話でしたが
その他にも投資の中で重要といわれる 「ルール作り」、「資金管理」にも役立つことができるので別の機会に共有したいと思います。 また、外部のAPIを利用することで自身オリジナルの多角的分析が出来さらに優位性が高まるのでないでしょうか。
今まで未経験の方でもこのような「投資」を題材にプログラミングを習得いただけると幸いです。