LoginSignup
2
1

More than 5 years have passed since last update.

QuantXでウィリアムズ%Rを用いたシステムトレード

Posted at

自己紹介

この度Smart Tradeでインターンすることになったゴンです。

ゴンについて、知りたい方はこちら。

初めての記事はこちら(QuantXを初めてみて)
https://qiita.com/investor-gon/items/2b1952ae5c2c88334c74

何を作るのか(完成目標)



日経平均寄与率上位10位の銘柄(2018年12月25日)を用いて、ウィリアムズ%Rを用いたアルゴリズムを作る!!!

とりあえず動けば良い。

数式で書くとこんな感じ




買い(buy)= Williams <-80
\\

\\
売り(sell) =Williams  >-20


%Rオシレーター(別名、Williams %R、ウィリアムズ%R)は1966年にLarry Williamsにより開発されたテクニカルで、買われすぎ、売られすぎの水準を判断するために利用されます。当日の価格が値動きの中のどこに位置するかを表しており、当日の高値に近い程数値が小さくなり、逆に安値に近づくほど数値は高くなります。

まずは完成コード(コピペ、どうぞ)


############################################################################
# 日経ウィリアムズ
import numpy as np
import pandas as pd
import talib as ta


def initialize(ctx):
    # 設定
    ctx.logger.debug("initialize() called")
    ctx.configure(
      channels={          # 利用チャンネル
        "jp.stock": {
          "symbols": [
             "jp.stock.9983", #ファーストリテイリング
            "jp.stock.9984", #ソフトバンク
            "jp.stock.6954", #ファナック
            "jp.stock.9433", #KDDI
            "jp.stock.8028", #ファミリーマート
            "jp.stock.8035", #東京エレクトロン
            "jp.stock.4543", #テルモ
            "jp.stock.6367", #ダイキン
            "jp.stock.6971", #京セラ
            "jp.stock.9735", #セコム
          ],
          "columns": [
           #"open_price_adj",    # 始値(株式分割調整後)
            "high_price_adj",    # 高値(株式分割調整後)
            "low_price_adj",     # 安値(株式分割調整後)
            #"volume_adj",         # 出来高
            #"txn_volume",         # 売買代金
            "close_price",        # 終値
            "close_price_adj",    # 終値(株式分割調整後) 
          ]
        }
      }
    )

    def _my_williams(data):
       #各銘柄の終値(株式分割調整後)を取得、欠損データの補完
      cp=data["close_price_adj"].fillna(method="ffill")
      hp=data["high_price_adj"].fillna(method="ffill")
      lp=data["low_price_adj"].fillna(method="ffill")

      # Ta-libを使ってWilliam's %Rを算出
      williamR = pd.DataFrame(data=0,columns=[], index=cp.index)
      for (sym,val) in cp.items():
        williamR [sym] = ta.WILLR( hp[sym], lp[sym], cp[sym], timeperiod=14)

      buy_sig = williamR < -80
      sell_sig= williamR > -20

      return {
          "buy:sig":buy_sig,
          "sell:sig":sell_sig,
          "williamR":williamR

        }

    # シグナル登録
    ctx.regist_signal("my_williams", _my_williams)

def handle_signals(ctx, date, current):

 # 買いシグナル
    buy = current["buy:sig"].dropna()
    for (sym,val) in buy.items():
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0.2, comment="SIGNAL BUY")
        pass

 # 売りシグナル
    sell = current["sell:sig"].dropna()
    for (sym,val) in sell.items():
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0, comment="SIGNAL SELL")
        pass


結果はこちら

スクリーンショット 2019-01-02 21.33.09.png


三年間で40%のプラスですね。すごい。

ちなみに、

アルファ値は、アルゴリズムの収益率から市場全体の動き(ベンチマーク)に連動したリターンを差し引いたもので、本数値が高いほど、ベンチマークの収益率を上回り、それだけリターンが高いことを意味します。


ベータ値とは、アルゴリズムの収益が証券市場全体の動きに対してどの程度敏感に反応して変動するかを示す数値です。この数値が高いほど、証券市場全体の動きに連動した変動幅(増減幅)が大きいことを意味します。

解説

ライブラリーの選択

#ライブラリーの設定

import pandas as pd
import talib as ta
import numpy as np

使うライブラリーをあらかじめ設定しておきます。

日本株式の選択

def initialize(ctx):
    # 設定
    ctx.logger.debug("initialize() called")
    ctx.configure(
      channels={          # 利用チャンネル
        "jp.stock": {
          "symbols": [
             "jp.stock.9983", #ファーストリテイリング
            "jp.stock.9984", #ソフトバンク
            "jp.stock.6954", #ファナック
            "jp.stock.9433", #KDDI
            "jp.stock.8028", #ファミリーマート
            "jp.stock.8035", #東京エレクトロン
            "jp.stock.4543", #テルモ
            "jp.stock.6367", #ダイキン
            "jp.stock.6971", #京セラ
            "jp.stock.9735", #セコム
          ],
          "columns": [
           #"open_price_adj",    # 始値(株式分割調整後)
            "high_price_adj",    # 高値(株式分割調整後)
            "low_price_adj",     # 安値(株式分割調整後)
            #"volume_adj",         # 出来高
            #"txn_volume",         # 売買代金
            "close_price",        # 終値
            "close_price_adj",    # 終値(株式分割調整後) 
          ]
        }
      }
    )



今回使用する日経平均寄与率上位10銘柄を持ってきます。


また、使う値は、高値・安値・終値です。

取引手法

 def _my_williams(data):
       #各銘柄の終値(株式分割調整後)を取得、欠損データの補完
      cp=data["close_price_adj"].fillna(method="ffill")
      hp=data["high_price_adj"].fillna(method="ffill")
      lp=data["low_price_adj"].fillna(method="ffill")

      # Ta-libを使ってWilliam's %Rを算出
      williamR = pd.DataFrame(data=0,columns=[], index=cp.index)
      for (sym,val) in cp.items():
        williamR [sym] = ta.WILLR( hp[sym], lp[sym], cp[sym], timeperiod=14)

      buy_sig = williamR < -80
      sell_sig= williamR > -20

      return {
          "buy:sig":buy_sig,
          "sell:sig":sell_sig,
          "williamR":williamR

        }

    # シグナル登録
    ctx.regist_signal("my_williams", _my_williams)  

今回は、高値・安値・終値を用いて、ウィリアムズ%Rをまず求めます。

%Rオシレーター(別名、Williams %R、ウィリアムズ%R)は1966年にLarry Williamsにより開発されたテクニカルで、買われすぎ、売られすぎの水準を判断するために利用されます。当日の価格が値動きの中のどこに位置するかを表しており、当日の高値に近い程数値が小さくなり、逆に安値に近づくほど数値は高くなります。



Williams%Rが-80より小さければ買い、-20より大きくなれば売りシグナルになるようなアルゴリズムで売買しているよ。


そしてシグナルを登録しておく。

数量選択

def handle_signals(ctx, date, current):

 # 買いシグナル
    buy = current["buy:sig"].dropna()
    for (sym,val) in buy.items():
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0.2, comment="SIGNAL BUY")
        pass

 # 売りシグナル
    sell = current["sell:sig"].dropna()
    for (sym,val) in sell.items():
        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0, comment="SIGNAL SELL")
        pass

あとはさっき設定した買いシグナル売りシグナルで売買をするのですが、
詳しくはこちらなのですが、今回使用したやつだけ載せておきます。




 
order_target_percent(amount, comment): void

この銘柄の総保有額が総資産評価額(現金+保有ポジション評価額)に対して指定の割合となるように注文を行ないます。 amountには割合(例:5%なら0.05)を指定します。


つまり、今回の場合は、総資産の20%の買いを入れていて、資金がなくなったらおしまいという感じで資金管理しています。

それでは今回はこの辺で。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1