【シストレ開発#15】「テクニカル分析」チャート表示機能追加!

「テクニカル分析」アプリケーションに機能を追加しました! たっきん(Twitter)です!

前回の記事では第3のアプリケーションとして「テクニカル分析」の開発に着手し、単純移動平均線(SMA)の算出とチャートへの表示まで作成しました。

今回は単純移動平均(SMA)に加えて、以下のトレンド系とオシレータ系の指標を追加し、チャートへ表示できることろまで作成してみました。

  • トレンド系
    • 単純移動平均(SMA)
    • 指数平滑移動平均(EMA) ← 今回追加
    • 加重移動平均(WMA) ← 今回追加
    • 一目均衡表 ← 今回追加
    • ボリンジャーバンド ← 今回追加
  • オシレーター系
    • RSI ← 今回追加
    • MACD ← 今回追加
    • ストキャスティクス ← 今回追加

上記以外にもテクニカル指標はたくさんありますが、まずはメジャーどころである上記の指標に絞ってみました。

それでは、今回作成したテクニカル指標のチャート表示機能を1つ1つ紹介していきます!(^^)

※各テクニカル指標の算出ソースコードも載せていますが、前提として事前にローソク足情報を下記のようなPandasデータフレーム形式で保持しているものとします。

print(self.df)
           OHLC_open  OHLC_high  OHLC_low  OHLC_close
Date
2021/04/01       ...        ...       ...         ...
2021/04/02       ...        ...       ...         ...
2021/04/03       ...        ...       ...         ...
2021/04/04       ...        ...       ...         ...
2021/04/05       ...        ...       ...         ...
       ...       ...        ...       ...         ...
Sponsored Link

トレンド系

トレンド系は以下5つの指標になります。

  • 単純移動平均(SMA)
  • 指数平滑移動平均(EMA)
  • 加重移動平均(WMA)
  • 一目均衡表
  • ボリンジャーバンド

単純移動平均(SMA)

単純移動平均(SMA)は前回の記事でも軽く紹介しましたが算出方法を含め、改めて紹介していきますね!

単純移動平均(SMA)はPandasライブラリを使用することで簡単に算出することができます。

sma = self.df["OHLC_close"].rolling(window=SPAN).mean()
  • SPAN:期間

チャート表示の方には短期、中期、長期の3本のSMA線を表示する機能を追加しました。

指数平滑移動平均(EMA)

指数平滑移動平均(EMA)の算出もPandasライブラリに標準で実装されています。

ema = self.df["OHLC_close"].ewm(span=SPAN).mean()
  • SPAN:期間

チャート表示の方には短期、中期、長期の3本のEMA線を表示する機能を追加しました。

加重移動平均(WMA)

加重移動平均(WMA)の算出はPandasライブラリに標準で実装されていないので少し小細工が必要になります。

WMAの算出ロジックだけをメソッドで定義しておき、apply関数にて自作したメソッドを呼び出す必要があります。

wma = self.df["OHLC_close"].rolling(window=SPAN).apply(self._calc_wma)

def _calc_wma(self, prices: pd.Series) -> float:
    weights = np.arange(len(prices)) + 1
    wma = np.sum(weights * prices) / weights.sum()
    return wma
  • SPAN:期間

チャート表示の方には短期、中期、長期の3本のWMA線を表示する機能を追加しました。

一目均衡表

一目均衡表は基準線転換線先行スパン線A先行スパン線B遅行線の5本の線で構成されていますが、どの線も算出は難しくなく、Pandasライブラリを使うことで容易に算出できます。

# ---------- 基準線 ----------
max = self.df["OHLC_high"].rolling(window=SPAN_BASE).max()
min = self.df["OHLC_low"].rolling(window=SPAN_BASE).min()
base = (max + min) / 2

# ---------- 転換線 ----------
max = self.df["OHLC_high"].rolling(window=SPAN_CONV).max()
min = self.df["OHLC_low"].rolling(window=SPAN_CONV).min()
conv = (max + min) / 2

# ---------- 先行スパン線A ----------
series = (base + conv) / 2
span_a = series.shift(ICHMK_SPN_OFS)

# ---------- 先行スパン線B ----------
max = self.df["OHLC_high"].rolling(window=SPAN_SPAN_B).max()
min = self.df["OHLC_low"].rolling(window=SPAN_SPAN_B).min()
series = (max + min) / 2
span_b = series.shift(ICHMK_SPN_OFS)

# ---------- 遅行線 ----------
lag = self.df["OHLC_close"].shift(-ICHMK_LAG)
  • SPAN_BASE:基準線の期間
  • SPAN_CONV:転換線の期間
  • ICHMK_SPN_OFS:先行スパン期間のオフセット
  • SPAN_SPAN_B:先行スパン線Bの期間
  • ICHMK_LAG:オフセット

チャート表示すると下記のようになります。

ボリンジャーバンド

ボリンジャーバンドは1本の平均値複数からなる標準偏差線で構成されていますが、標準偏差σさえ算出できてしまえば、標準偏差線の算出は難しくありません。

# ---------- 平均値 ----------
base = self.df["OHLC_close"].rolling(window=SPAN).mean()

# ---------- 標準偏差線 ----------
sigma = self.df["OHLC_close"].rolling(window=SPAN).std(ddof=0)

sigma_plus1 = base + sigma       # +1σ
sigma_minus1 = base - sigma      # -1σ
sigma_plus2 = base + sigma * 2   # +2σ
sigma_minus2 = base - sigma * 2  # -2σ
sigma_plus3 = base + sigma * 3   # +3σ
sigma_minus3 = base - sigma * 3  # -3σ
  • SPAN:期間

チャート表示の方には1本の平均線と、6本の標準偏差線(+1σ、+2σ、+3σ、-1σ、-2σ、-3σ)を表示する機能を追加しました。

オシレーター系

オシレーター系は以下3つの指標になります。

  • RSI
  • MACD
  • ストキャスティクス

RSI

RSIの算出方法は、カトラー式、ワイルダー式の2通りの算出方法があります。

それぞれの詳しい算出方法はググればすぐ出てくるので本記事では割愛しますが、今回は算出方法が容易な単純移動平均線(SMA)を用いたカトラー式を実装しました。

カトラー式のRSI算出はPandasライブラリに標準で実装されておらず、算出メソッドを定義した上でapply関数にて呼び出す必要があります。

rsi_sma = self.df["OHLC_close"].rolling(window=SPAN).apply(self._calc_rsi_by_sma)

def _calc_rsi_by_sma(self, prices: pd.Series) -> float:
    sumofup = prices[prices > 0].sum()
    sumofdown = -prices[prices < 0].sum()
    return sumofup / (sumofup + sumofdown) * 100
  • SPAN:期間

チャート表示すると下記のようになります。

MACD

MACDの算出はPandasライブラリを駆使することで算出することができます。

独自メソッドの定義は特に必要ありません。

# ---------- MACD線 ----------
ema_s = self.df["OHLC_close"].ewm(span=MACD_EMA_S).mean()
ema_l = self.df["OHLC_close"].ewm(span=MACD_EMA_L).mean()
macd = ema_s - ema_l

# ---------- シグナル線 ----------
sig = macd.ewm(span=MACD_EMA_SIG).mean()
  • MACD_EMA_S:EMA期間(短)
  • MACD_EMA_L:EMA期間(長)
  • MACD_EMA_SIG:平滑シグナル期間

チャート表示すると下記のようになります。

ストキャスティクス

ストキャスティクスも%K線、%D線は算出メソッドを独自に定義する必要があり、Panasライブラリのapply関数にて呼び出す必要があります。

sr = self.df["OHLC_close"]

# --------------- %K ---------------
per_k = sr.rolling(window=STCHA_K).apply(self._calc_stochastics_k)

# --------------- %D ---------------
self.df["numer"] = sr.rolling(window=STCHA_D).apply(self._calc_stochastics_d_numer)
self.df["denom"] = sr.rolling(window=STCHA_D).apply(self._calc_stochastics_k_denom)
per_d = sr.rolling(window=STCHA_D).apply(self._calc_stochastics_d)

# --------------- %Slow D ---------------
per_sd = per_d.rolling(window=STCHA_SD).mean()

def _calc_stochastics_k(self, sr: pd.Series) -> float:
  df = self.df.loc[sr.index]
  latest_close = df["OHLC_close"][-1]
  max_high = df["OHLC_high"].max()
  min_low = df["OHLC_low"].min()
  k = (latest_close - min_low) / (max_high - min_low)
  return k * 100

def _calc_stochastics_d_numer(self, sr: pd.Series) -> float:
  df = self.df.loc[sr.index]
  latest_close = df["OHLC_close"][-1]
  min_low = df["OHLC_low"].min()
  return latest_close - min_low

def _calc_stochastics_k_denom(self, sr: pd.Series) -> float:
  df = self.df.loc[sr.index]
  max_high = df["OHLC_high"].max()
  min_low = df["OHLC_low"].min()
  return max_high - min_low

def _calc_stochastics_d(self, sr: pd.Series) -> float:
  df = self.df.loc[sr.index]
  numer = df["numer"].sum()
  denom = df["denom"].sum()
  return (numer / denom) * 100
  • STCHA_K:%K期間
  • STCHA_D:%D期間
  • STCHA_SD:%Slow D期間

チャート表示すると下記のようになります。

動画にて操作感を紹介

上記で作成してきたテクニカル指標の表示について、GUIでの操作感を動画にしてみました。

動画の操作感は開発段階のものになるため、今後開発していくうえで変更になる可能性もあります。

「テクニカル分析」ツール②(テクニカル指標のチャート表示)

さいごに

今回はメジャーどころのテクニカル指標の算出からチャート表示機能までの作り込みを行いました。

テクニカル指標の算出については基本的にPandasライブラリを使えば容易に算出することができました。

一部のテクニカル指標では独自にメソッドの定義が必要になりますが、計算式さえ理解できていればPandasのapply関数に適用させるだけで計算できますので、さほど難易度は高くない感じでしたね。

さて、現状はまだ「チャートの表示だけ」しかできませんが、今後の追加機能として、

  • 過去チャートを使った売買シグナル発生箇所の全抽出とリスト化
  • 各テクニカル指標の相関性や関連性の見える化

あたりを実装していきたいと思います。

前回の記事でも書きましたが、テクニカル指標を使ったシステムトレードは試行回数が大きく増やせる可能性があるため、なるべく早めに解析を終えて、「窓埋め」、「仲値&ゴトー日」に続いて実践投入していこうと思います。

Sponsored Link

コメント

  1. マッキー より:

    たっきんさん、はじめまして。
    たっきんさんが作成されている"oanda API"を使ってorder bookを可視化させた記事を見させていただき自分も使用させていただこうと思ったのですが、bokelibのダウンロード方法などがイマイチ分からなくなってしまい完全に手詰まりになってしまいました(;^ω^)
    エディターはVScodeを使用してますが、プログラミングは初心者級です。。。
    たっきんさんがGithubに公開されているコードを使用すれば、ローソク足やオーダーブック、ポジション可視化しているチャートを作成できるのでしょうか?自分としては是非使用させていただきたいです!!
    長文失礼いたしました。お手数をかけてしまい申し訳ないのですが、どうかお力添えをよろしくお願いいたします!!

    • たっきん より:

      >bokelibのダウンロード方法などがイマイチ分からなくなってしまい完全に手詰まりになってしまいました(;^ω^)
      bokelibは自作ライブラリになります。
      下記URLのGitHubで公開しているので、ここからクローンしてください。
      https://github.com/takkin-takilog/python-eclipse-sample/tree/master/bokehlib

      >たっきんさんがGithubに公開されているコードを使用すれば、ローソク足やオーダーブック、ポジション可視化しているチャートを作成できるのでしょうか?自分としては是非使用させていただきたいです!!
      GitHubで公開しているコードに加えてoandapyV20、Bokehなどのpythonパッケージのインストールが必要になります。(パッケージインストールにはAnacondaを使うと便利です。)
      このとき注意してほしいのがBokehのバージョンで、現時点での最新バージョンは2.3.2となります。
      当時僕が使用していたバージョンは確か1.0.4だったはずなので、最新バージョンだとうまく実行できない可能性があります。
      その場合はバージョン1.0.4にダウングレードすると動くはずです。

      • マッキー より:

        解答返信ありがとうございます。アドバイスを参考に再度挑戦してみます!!ありがというございました(*'ω'*)

このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。