MACDというオシレーター指標でブル・ベアを扱ってみた

![home.jpg](https://qiita-image-store.s3.amazonaws.com/0/331535/853b44ce-9411-fc6b-04df-682bf27dbb2d.jpeg)

#こんにちわ
こんにちわ専攻が化学の大学二年生のMeaです。
投資の勉強期間は一ヶ月になります。最近は[カサゴの本](https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8BDeep-Learning-%E2%80%95Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AE%E7%90%86%E8%AB%96%E3%81%A8%E5%AE%9F%E8%A3%85-%E6%96%8E%E8%97%A4-%E5%BA%B7%E6%AF%85/dp/4873117585/ref=sr_1_1?ie=UTF8&qid=1551075389&sr=8-1&keywords=%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8B+deep+learning)を使い機械学習を触っています。
今回は前回の記事で扱ったMACDという指標でブルベアを扱ってみたいと思います。
前回の記事を呼んでいない人は[こちら](https://qiita.com/Mea/items/15feb661b88cd548085b)を参照してから進んでもらえたほうが良いかもしれません。
#ブル・ベアとは？そのメリットとデメリットは？
ブルベアファンドは、インデックスファンドのように特定の指数と連動して価格が動きますが、価格が動く向きや大きさが違います。まず価格が動く向きですが、ファンドの名称にブルとあれば、基準指数と同じ方向に動き、ベアとあれば基準指数と<font color="DarkMagenta">逆の動き</font>をします。
###ベア（Bear）
ベアは<font color="MediumBlue">弱気</font> のことで、熊が前足を振り下ろす仕草、あるいは背中を丸めている姿から相場が<font color="MediumBlue">下落</font> していることを表しています。
例えば、基準となる指数が下落局面に置いて以下のように動くと期待できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331535/4ca8cbd9-d716-41be-8016-35915d981dcc.png)
しかし、指標が上昇局面に置かれた時は大きな損害が生じることとなる。
![bear.jpeg](https://qiita-image-store.s3.amazonaws.com/0/331535/2706d092-03ea-ccad-cbe5-21690928c2ff.jpeg)
###ブル（Bull）
ブルは<font color="Red">強気</font>のことで、雄牛が角を下から上へ突き上げる仕草から相場が<font color="Red">上昇</font>していることを表しています。
例えば、基準となる指数が上昇局面に置いて以下のように動くと期待できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/331535/d7d24d5f-e211-b876-ae12-0f833be8884a.png)
しかし、指標が下落局面に置かれた時は大きな損害が生じることとなる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/331535/d2711bb7-81c0-7002-2eb1-05e1a42c8cd0.png)

###メリット
相場が連続して上昇（もしくは下落）するときには、ブルベアファンドは一定方向に大きく動きます。そして、倍率が高いファンドほど、より大きく値が動きます。上昇相場が続くときはブル型ファンドを、下落相場が続くときににはベア型ファンドを持っていると、<font color="Red">大きな利益狙える可能性がある</font>のです。これがブルベアファンドのメリットです。
###デメリット
一方、基準となる指数が上昇と下落を繰り返すボックス相場になると、ブルベアファンドの価格は思うように伸びてくれません。これがブルベアファンドのデメリットです。
また、ブルベアファンドは価格の値上がり値下がりが繰り返されると、徐々に基準価格が下がっていく特徴もあります。以上のことから、ブルベアファンドを長期で持つこと、ボックス相場の時は<font color="Red">危険</font>！！


#コード
今回のコードはMACDを用いて買い売りを判するので以下のように買い売りの条件を付けます。（前回と似た条件）
完成した全体的なコードは[こちら](https://factory.quantx.io/developer/799d3c712a1f451b941034615c97b790)から飛べます。

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

```bullbear.py
import pandas as pd
import talib as ta
import numpy as np

def initialize(ctx):
    ctx.logger.debug("initialize() called")
    ctx.codes = [1357,1570,1321]

    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))) 
      sell_sig = ((MACD < signal) & (MACD.shift(1) > signal.shift(1)))
      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):
    bear = ctx.getSecurity("jp.stock.1357")
    bull = ctx.getSecurity("jp.stock.1570")
    '''
    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)
        bull.order_target_percent(0.55, comment= "bull_buy")
        bear.order_target_percent(0, comment="bear_sell")

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

```


#まとめと小話

![Screenshot from 2019-02-26 15-21-30.png](https://qiita-image-store.s3.amazonaws.com/0/331535/8816dc59-c807-7221-7bf1-0aa80a1f3ff4.png)
今回の設定は2016年末から２０１７年末で１００万円で運用させました。基本的にブル・ベアはβ値が低くなるが明らかに高いのが怖く、グラフの上がり方も不安定さがあるので怖い要素となっている。

今回のコードは前回と少し違い持てる銘柄が２種類となるので買う量と売る量を上げてみました。

```sell_buy
#買いシグナル
  bull.order_target_percent(0.55, comment= "bull_buy")
  bear.order_target_percent(0, comment="bear_sell")
＃売りシグナル
  bear.order_target_percent(0.50, comment= "bear_buy")
  bull.order_target_percent(0, comment = "bull_sell")
```
前回と比べて買う際にブルは５５％、ベアは５０％買うように指示を出しています。
他にも％で指示するのではなく具体的な数量を指示していく方法があります。以下に乗せておくので参考にしてください。
（以下のように書くと10個ずつ買われる）

```
#買いシグナル
bull.order(bull.unit() * 10, comment="bll_buy")
bear.order_target_percent(0, comment="bear_sell")
＃売りシグナル
bear.order(bull.unit() * 10, comment="bear_buy")
bull.order_target_percent(0, comment = "bull_sell")
```
#お知らせ
直近ですがこのようなイベントがありますよ！！っていうお知らせです。
今日作ったようなアルゴリズムを<font color="DarkRed">締め切り期間の3/31まで</font>に結果が良いアルゴリズムを提出して貰い上位に入ると<font color="Gold">最大５万円の賞金</font>が出る大会が開催されます。詳しくは下のURLから確認して下さい。
https://algorithms-contest.quantx.io/
また、アルゴリズムの制作のノウハウを勉強できる勉強会も開催されているので下のConpassのURLから是非参加してみて下さい。
https://python-algo.connpass.com/

#免責注意事項
このコードに基づき投資した結果、損害が発生しても，一切責任を持ちません．
このコードが正しく機能する保証は一切致しません．