Help us understand the problem. What is going on with this article?

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

home.jpg

こんにちわ

こんにちわ専攻が化学の大学二年生のMeaです。
投資の勉強期間は一ヶ月になります。最近はカサゴの本を使い機械学習を触っています。
今回は前回の記事で扱ったMACDという指標でブルベアを扱ってみたいと思います。
前回の記事を呼んでいない人はこちらを参照してから進んでもらえたほうが良いかもしれません。

ブル・ベアとは?そのメリットとデメリットは?

ブルベアファンドは、インデックスファンドのように特定の指数と連動して価格が動きますが、価格が動く向きや大きさが違います。まず価格が動く向きですが、ファンドの名称にブルとあれば、基準指数と同じ方向に動き、ベアとあれば基準指数と逆の動きをします。

ベア(Bear)

ベアは弱気 のことで、熊が前足を振り下ろす仕草、あるいは背中を丸めている姿から相場が下落 していることを表しています。
例えば、基準となる指数が下落局面に置いて以下のように動くと期待できる。
image.png
しかし、指標が上昇局面に置かれた時は大きな損害が生じることとなる。
bear.jpeg

ブル(Bull)

ブルは強気のことで、雄牛が角を下から上へ突き上げる仕草から相場が上昇していることを表しています。
例えば、基準となる指数が上昇局面に置いて以下のように動くと期待できる。

image.png
しかし、指標が下落局面に置かれた時は大きな損害が生じることとなる。
image.png

メリット

相場が連続して上昇(もしくは下落)するときには、ブルベアファンドは一定方向に大きく動きます。そして、倍率が高いファンドほど、より大きく値が動きます。上昇相場が続くときはブル型ファンドを、下落相場が続くときににはベア型ファンドを持っていると、大きな利益狙える可能性があるのです。これがブルベアファンドのメリットです。

デメリット

一方、基準となる指数が上昇と下落を繰り返すボックス相場になると、ブルベアファンドの価格は思うように伸びてくれません。これがブルベアファンドのデメリットです。
また、ブルベアファンドは価格の値上がり値下がりが繰り返されると、徐々に基準価格が下がっていく特徴もあります。以上のことから、ブルベアファンドを長期で持つこと、ボックス相場の時は危険!!

コード

今回のコードはMACDを用いて買い売りを判するので以下のように買い売りの条件を付けます。(前回と似た条件)
完成した全体的なコードはこちらから飛べます。

・買いのサイン

1,先行するMACDが遅行する同平均(SIGNAL)を下から上に抜いた時(ゴールデンクロス)
2,(1)の後に2本のMACDがともにゼロのラインを上回れば、信頼度が増す(ゴールデンクロス+0ライン超え)

・売りのサイン

1,先行するMACDが遅行する同平均(SIGNAL)を上から下に抜いた時(デッドクロス)
2,(1)の後に2本のMACDがともにゼロのラインを下回れば、信頼度が増します(デッドクロス+0ラインより低い)

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
今回の設定は2016年末から2017年末で100万円で運用させました。基本的にブル・ベアはβ値が低くなるが明らかに高いのが怖く、グラフの上がり方も不安定さがあるので怖い要素となっている。

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

#買いシグナル
  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")

前回と比べて買う際にブルは55%、ベアは50%買うように指示を出しています。
他にも%で指示するのではなく具体的な数量を指示していく方法があります。以下に乗せておくので参考にしてください。
(以下のように書くと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")

お知らせ

直近ですがこのようなイベントがありますよ!!っていうお知らせです。
今日作ったようなアルゴリズムを締め切り期間の3/31までに結果が良いアルゴリズムを提出して貰い上位に入ると最大5万円の賞金が出る大会が開催されます。詳しくは下のURLから確認して下さい。
https://algorithms-contest.quantx.io/
また、アルゴリズムの制作のノウハウを勉強できる勉強会も開催されているので下のConpassのURLから是非参加してみて下さい。
https://python-algo.connpass.com/

免責注意事項

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away