MACDによるアルゴリズムトレーディング

# はじめに

株を売買する際に参考にするテクニカル指標がいくつかあるがMACDはその中でもよく利用されているものの一つだ。
単にチャートを表示するだけならYahooファイナンスで十分なのだが売買シグナルまで表示したい場合以下の記事が非常によくまとまっている。

https://medium.com/codex/algorithmic-trading-with-macd-in-python-1c2769a6ad1b

[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を使えばもっとお手軽にできるのでチャートの日本語対応を含めて移植してみた。

https://github.com/higebobo/my-colab/blob/main/Algorithmic_Trading_with_MACD_in_Python.ipynb

# 使い方

Google Colaboratory自体の使い方は他に譲るとしてスクリプトの取り込みは上部にある「Open in Colab」というバッジをクリックすればよいと思う。

銘柄と期間は自由にカスタマイズしてもらえればよい。
今回、商船三井(9104)を選んだ。

```python
# ここに対象となる銘柄コードを設定する(米国株の場合はティッカー、東証の場合は銘柄コードの末尾に.Tを付加)
# これはプロバイダとしてyahooを使う場合で他のプロバイダではそこのコード指定に従う
symbol = '9104.T'

# 算出期間を週で指定
weeks = 52
```
設定が終わればGoogle Colaboratoryの上部メニューの「ランタイム>すべてのセルの実行」を行えば良い。

![FireShot Capture 018 - Algorithmic_Trading_with_MACD_in_Python.ipynb - Colaboratory_ - colab.research.google.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/0ca5697a-4f0f-49ae-69be-c64f0a368865.png)

実行結果(最後のチャートのみ抜粋)

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/022e9184-cef9-6e4b-e425-5e974c4aa8a7.png)

緑の三角が買い、赤の三角が手仕舞い(売り)となりこれを1取引とする。
わかりやすくするために取引ごとに丸で囲んでみる(黒丸がプラス、赤丸がマイナス)。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3639313439342f30323265393138342d636566392d366534622d653432352d3565393734633461613861372e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/b760892d-ca06-d158-9543-ed4f9548426c.png)

現物取引をベースにするため買いから入るとして①の取引では緑が3400円付近で次の赤が4000円くらいなので600円の利益となり、最小単位の100株で買った場合6万円ほどの利益となる。

> 信用取引なら売りからでも始められる(いわゆる空売り)

②の取引は微額だけどマイナス取引となっている。
それ以降もマイナス取引は散見されるが全体的には勝ちトレードの回数が多く特に⑨取引はビッグムーブメントとなっている。
⑦での買いサインが遅すぎて利益の半分ほど損しているように見えるが、逆に⑥での手仕舞いポイントがドンピシャである。
機械的にトレードする場合はこんなもんだ。

いくらつぎこんだらどのくらいの収益が出るかはもちろん計算できるけども(いわゆるバックテスト)今回は視覚的なイメージをつかんでもらうために割愛する。

⑫番目となりうる最後のところ(本日2022/3/2現在)で買いシグナルが出ているけれども天井付近なので私は怖くて買えない(という以前に資金がない)。
今現在でいうとウクライナ情勢にも左右されるため余計に怖い。
ここできっちり損切ポイント決めて売買できるのが勝組トレーダーなんだろう。

# まとめ

MACDを使った戦略が有効であるといった解釈は当然可能だけども、商船系が上昇トレンドなので(プラスの値幅に比較してマイナスの値幅が小さい)よい結果が出ているだけという見方もできるので、実際の取引は各個人の判断による。

# 補足

Pythonを用いたテクニカル分析の情報はネット上に多いが、いずれも時系列データの取得から始まっている。
元記事ではこんな感じでやっているが

```python
def get_historical_data(symbol, start_date = None):
    api_key = open(r'api_key.txt')
    api_url = f'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol={symbol}&apikey={api_key}&outputsize=full'
    raw_df = requests.get(api_url).json()
    df = pd.DataFrame(raw_df[f'Time Series (Daily)']).T
    df = df.rename(columns = {'1. open': 'open', '2. high': 'high', '3. low': 'low', '4. close': 'close', '5. adjusted close': 'adj close', '6. volume': 'volume'})
    for i in df.columns:
        df[i] = df[i].astype(float)
    df.index = pd.to_datetime(df.index)
    df = df.iloc[::-1].drop(['7. dividend amount', '8. split coefficient'], axis = 1)
    if start_date:
        df = df[df.index >= start_date]
    return df
```

pandas_datareaderを使えばワンライナーで取得できる。

```shell
df = web.DataReader(symbol, 'yahoo', start, end)
```

またcolaboratoryは多くのデータ解析に必要なライブラリを標準で備えているが足りないものは以下のようにpipでインストールできるので便利だ。

```shell
!pip install japanize_matplotlib requests_cache urllib3
```

# 参考

* [Algorithmic Trading with MACD in Python \| by Nikhil Adithyan \| CodeX \| Medium](https://medium.com/codex/algorithmic-trading-with-macd-in-python-1c2769a6ad1b)
* [【matplotlib】日本語を表示しよう\(Google Colaboratory編\)](https://www.teamxeppet.com/matplotlib_in_japanize-colabo/)