MACDというオシレーター指標を使ってみたよ[改訂版]（＾＾）

#自己紹介
専攻が化学の大学二年生でPythonでWeb関係の事を独学で勉強しています。しかし最近はVue.Jsなどを触っています。
投資の勉強期間は２週間になります。
PCの中身がいつもどこかしら壊れています。

#QuantX Factory
QuantX FactoryとはPythonでのアルゴリズム開発環境のクラウドサービスであり開発したアルゴリズムをQuantX Storeで販売して収益を得るC to C（Consumer-to-Consumer）サービスとして提供されているプラットフォームです。
[ここ](https://factory.quantx.io/)からQuantｘFactoryに飛べます。
では実際にログインしてコードを見てみましょう。

#MACDとは
MACD（移動平均収束拡散手法）は短期の移動平均線と中長期の移動平均線を使用することで、買いと売りを判断する手法です。
通常の日足分析においては、短期EMA期間は9、長期EMA期間は26とするのが一般的です。
また、MACDの移動平均であるシグナルとともに2本の線で分析することが多く、シグナルの平均期間は9が一般的です。
よって短期EMA期間、長期EMA期間、シグナルの平均期間を上記の数値に設定しました。

使用するライン及び計算式は以下のようになる。
![Screenshot from 2019-02-06 15-25-14.png](https://qiita-image-store.s3.amazonaws.com/0/331535/fe764b8f-e9e5-78fe-6afb-65ca50553362.png)
![index.png](https://qiita-image-store.s3.amazonaws.com/0/331535/ce5dd296-28d5-46c6-2625-740ab4f9d439.png)


###・買いのサイン
１，先行するMACDが遅行する同平均（SIGNAL）を下から上に抜いた時（ゴールデンクロス）
２，(1)の後に2本のMACDがともにゼロのラインを上回れば、信頼度が増す（ゴールデンクロス＋０ライン超え）

###・売りのサイン
１，先行するMACDが遅行する同平均（SIGNAL）を上から下に抜いた時（デッドクロス）
２，(1)の後に2本のMACDがともにゼロのラインを下回れば、信頼度が増します（デッドクロス＋０ラインより低い）


[サインに関する参考サイト](https://www.sevendata.co.jp/shihyou/technical/macd.html)はこちら

#コード
コードは[こちら](https://factory.quantx.io/developer/382d8f3a5ca948cbaa130f832a391613)のようになる。
今回、コード内では基準線をbas、相対線をrel、同平均をsignalとしている。

```ruby:qiita.rb
import pandas as pd
import talib as ta
import numpy as np

def initialize(ctx):
    ctx.logger.debug("initialize() called")
    ctx.codes = [9984,7974,4502,9983,4506,6758,7203,9501,6857,6981,6754,8306,
                 6594,6762,8035,9433,8316,3436,4063,6861,8411,4911,6954,6301,
                 3092,4503,7751,4751,6098,9432,9437,6367,3064,6702,7735,4507,
                 8058,4523,6506,7267,2914,6976,2267,5301,4921,6273,8750,8766,
                 6501,4661]

    ctx.symbol_list = ["jp.stock.{}".format(code) for code in ctx.codes]
    ctx.configure(
      channels={         
        "jp.stock": {
          "symbols": ctx.symbol_list,
          "columns": ["close_price_adj"],
        }
      }
    )

    def _MACD(data):
      cp = data["close_price_adj"].fillna(method="ffill")
      bas = pd.DataFrame(data=0,columns=[], index=cp.index)
      rel = pd.DataFrame(data=0,columns=[], index=cp.index)
      signal = pd.DataFrame(data=0,columns=[], index=cp.index)
      
      for (sym,val) in cp.items():
        bas[sym] = ta.EMA(cp[sym].values.astype(np.double), timeperiod=12)
        rel[sym] = ta.EMA(cp[sym].values.astype(np.double), timeperiod=26)
        MACD = bas - rel
        signal = MACD.fillna(method='ffill').rolling(window=9, center=False).mean()

        
      buy_sig = ((MACD > signal) & (MACD.shift(1) < signal.shift(1)) & (MACD > 0)) 
      sell_sig = ((MACD < signal) & (MACD.shift(1) > signal.shift(1)) & (MACD < 0))
      return {
            "basic line": bas,
            "relative line": rel,
            "MACD:g2": MACD,
            "signal:g2": signal,
            "buy:sig": buy_sig,
            "sell:sig": sell_sig,
        }

    ctx.regist_signal("MACD", _MACD)
def handle_signals(ctx, date, current):
    '''
    current: pd.DataFrame
    '''

    df = current.copy()

    # 買いシグナル
    df_long = df[df["buy:sig"]]
    if not df_long.empty:
      for (sym, val) in df_long.iterrows(): 
        #ctx.logger.info(val)
        sec = ctx.getSecurity(sym)
        msg = "買いシグナル"
        sec.order_target_percent(0.10, comment= msg)

    # 売りシグナル
    df_sell = df[df["sell:sig"]]
    if not df_sell.empty:
      for (sym, val) in df_sell.iterrows(): 
        sec = ctx.getSecurity(sym)
        msg = "売りシグナル"
        sec.order_target_percent(0, comment= msg)

```

#結果
![Screenshot from 2019-02-08 17-08-23.png](https://qiita-image-store.s3.amazonaws.com/0/331535/7006e62c-a5f6-4f07-ca00-1f12464b564f.png)
2015/1/1 ~ 2017/3/31で初期資金量１００0万円の時のバックテストとなる。
（Beta値が凄く高いのは少し気になる....）
ちなみに
・MaxDrowDown：
最大資産（累積利益）からの下落率のこと
・Volatility:
証券などの価格の変動性のこと。期待収益率が期待通りとなる度合いを示す。ボラティリティが高ければ期待収           益率から大きく外れる可能性が高い。
・SharpeRatio:
リスク（標準偏差）1単位当たりの超過リターン（リスクゼロでも得られるリターンを上回った超過収益）を測るもので、この数値が高いほどリスクを取ったことによって得られた超過リターンが高いこと（効率よく収益が得られたこと）
・Alpha:
個別証券の収益率が、どれだけ市場平均（ベンチマーク）の収益率を上回っているのかを示す数値。
・Beta:
個別銘柄のリスク


#補足と感想
####今回のEMAを求める時に上記に記載した式を使ってないことに関して
Ta-libにEMAを計算してもらいました。（Ta-libの開発者さんありがとう）
また、この記事でどんな分析出来るかが見れる[素晴らしいQiita記事](https://qiita.com/ryoshi81/items/983c06e0bf859b280eba)を載せておきます。

```ruby:qiita.rb
for (sym,val) in cp.items():
        bas[sym] = ta.EMA(cp[sym].values.astype(np.double), timeperiod=12)
        rel[sym] = ta.EMA(cp[sym].values.astype(np.double), timeperiod=26)
```
Ta-libの詳細は[こちら](https://mrjbq7.github.io/ta-lib/)
感想としては力不足だなぁって思い勉強モチベが少し上がりつつこのコードをもっと良いものにするべくにする為頑張ろうと思いました。
#この内容と近い記事＆使える情報をまとめられてる記事
[近い記事１](https://qiita.com/katakyo/items/63e4c6461a0c8ac861d6)
[近い記事２](https://qiita.com/akihirosasaki/items/a4c086fbb02aa639779c)
[近い記事３](https://qiita.com/shinseitaro/items/ee0b24d4466d20c8f30e)
[まとめられてる記事](https://qiita.com/ryoshi81/items/983c06e0bf859b280eba)
これら以外にも色々な良い記事があるので是非探してみてくだい
#免責注意事項
このコードに基づき投資した結果、損害が発生しても，一切責任を持ちません．
このコードが正しく機能する保証は一切致しません．