QuantX에서 브린 테이프를 사용한 시스템 거래

자기 소개


이번에 스마트트레이드에서 인턴으로 일한 제이입니다.
샤오제에 대해서 알고 싶은 사람이 여기 있어요.
첫 번째 문장이 여기 있다(QuantX를 처음 본다)
https://qiita.com/investor-gon/items/2b1952ae5c2c88334c74

뭘 만들지(목표 달성)


일경 평균 기여율 상위 10개 품목 사용(2018년 12월 25일), 브린대-2σ근처에서 사다σ할 때 팔고, 제작해서 넣는 알고리즘!!!
일단 움직이면 돼.
공식적으로 쓰면 이런 느낌이에요.



買い(buy)= \frac{lowerband(-2σ)}{価格} >1.002
\\
売り(sell) =\frac{価格}{upperband(+2σ)} >0.99



브린대는 이동평균선과 그 위에 파동폭을 나타내는 선을 더한 지표다.
이것은 1980년 존 브린그가 설계한 지표로 통계학을 응용하는 기술 지표 중의 하나이다.
1회 표준 편차, 1σ=약 68.3%
2차 표준 편차, 2σ=약 95.5%
3회 표준 편차, 3σ=약 99.7%

우선 완성 코드(복사 붙여넣기,)

############################################################################
# 日経225 ボリンジャーバンド

  #ライブラリーの設定
import pandas as pd
import talib as ta
import numpy as np


def initialize(ctx):
    # 設定
    ctx.logger.debug("initialize() called")
    ctx.configure(
      target="jp.stock.daily",
      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",     # 安値(株式分割調整後)
            "close_price",        # 終値
            "close_price_adj",    # 終値(株式分割調整後) 
            "volume_adj",         # 出来高
            "txn_volume",         # 売買代金
          ]
        }
      }
    )

    #売買シグナル生成部分
    def _TALIB_CALL(data):

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

      upperband = {}
      middleband = {}
      lowerband = {}

      buy_sig = pd.DataFrame(data=0,columns=[], index=cp.index)
      sell_sig = pd.DataFrame(data=0,columns=[], index=cp.index)
      uband = pd.DataFrame(data=0,columns=[], index=cp.index)
      lband = pd.DataFrame(data=0,columns=[], index=cp.index)

      for (sym,val) in cp.items():
        upperband[sym], middleband[sym], lowerband[sym] = ta.BBANDS(cp[sym].values.astype(np.double),
          timeperiod=25,
          nbdevup=2,
          nbdevdn=2,
          matype=0)

        lband[sym] = lowerband[sym]
        uband[sym] = upperband[sym]
        #-2σに近いときに買い
        buy_sig[sym] = lowerband[sym] / cp[sym]
        #+2σに近いときに売り
        sell_sig[sym] = cp[sym] / upperband[sym]


      return {
        "upperband:price": uband,
        "lowerband:price": lband,
        "bb_buy:sig": (buy_sig >= 1.002),
        "bb_sell:sig": (sell_sig >= 0.99),
      }


    # シグナル登録
    ctx.regist_signal("TALIB", _TALIB_CALL)

def handle_signals(ctx, date, current):

    done_syms = set([])

    ratio = current["bb_buy:sig"]
    df = ratio[ratio == 1.0]
    for (sym,val) in df.items():
        if sym in done_syms:
          continue

        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0.15, comment="シグナル買(%f)" % val)
        pass

    ratio = current["bb_sell:sig"]
    df = ratio[ratio == 1.0]
    for (sym,val) in df.items():
        if sym in done_syms:
          continue

        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0, comment="シグナル売(%f)" % val)
        pass

    pass


결과는 다음과 같다.



3년간 36% 증가했다.어?너무 긍정적이고 즐거웠어요.
겸사겸사 말씀드리겠습니다.
알파치는 알고리즘의 수익률에서 시장 전체 운동(기준)과 연동된 수익을 뺀 것으로, 이 수치가 높을수록 기준 수익률이 높을수록 그에 상응하는 수익이 높다는 뜻이다.
베타값은 알고리즘의 수익이 증권시장 전체의 운동에 얼마나 민감하게 반응하고 변동하는지를 나타내는 수치다.이 수치가 높을수록 전체 증시의 변동폭(증감폭)이 크다는 의미다.

해설


총서 선택


#총서 목록 설정
import pandas as pd
import talib as ta
import numpy as np
사용할 장서를 미리 설정하다.

일본 주식의 선택

def initialize(ctx):
    # 設定
    ctx.logger.debug("initialize() called")
    ctx.configure(
      target="jp.stock.daily",
      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",     # 安値(株式分割調整後)
            #"close_price",        # 終値
            "close_price_adj",    # 終値(株式分割調整後) 
            #"volume_adj",         # 出来高
            #"txn_volume",         # 売買代金
          ]
        }
      }
    )


이번 사용을 가져온 일경 평균 공헌률 상위 10개 품종.
또 사용된 값은 일족의 종가(주식분할 조정 후)다.

거래 방법

 #売買シグナル生成部分
    def _TALIB_CALL(data):

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

      upperband = {}
      middleband = {}
      lowerband = {}

      buy_sig = pd.DataFrame(data=0,columns=[], index=cp.index)
      sell_sig = pd.DataFrame(data=0,columns=[], index=cp.index)
      uband = pd.DataFrame(data=0,columns=[], index=cp.index)
      lband = pd.DataFrame(data=0,columns=[], index=cp.index)

      for (sym,val) in cp.items():
        upperband[sym], middleband[sym], lowerband[sym] = ta.BBANDS(cp[sym].values.astype(np.double),
          timeperiod=25,
          nbdevup=2,
          nbdevdn=2,
          matype=0)

        lband[sym] = lowerband[sym]
        uband[sym] = upperband[sym]
        #-2σに近いときに買い
        buy_sig[sym] = lowerband[sym] / cp[sym]
        #+2σに近いときに売り
        sell_sig[sym] = cp[sym] / upperband[sym]


      return {
        "upperband:price": uband,
        "lowerband:price": lband,
        "bb_buy:sig": (buy_sig >= 1.002),
        "bb_sell:sig": (sell_sig >= 0.99),
      }


    # シグナル登録
    ctx.regist_signal("TALIB", _TALIB_CALL)

이번에 사용한 값을cp,블린대에 대입(+2)σ및 - 2σ)제발
이번엔 족히 25일, +-2σ구문을 생성합니다.
(코드는 여기입니다.timeperiod=25,nbdevup=2,nbdevdn=2,)
그리고 주식 가격과 브린치의 비율을 찾는 것이 매매를 결정한다.
보답으로 브린벨트의 가격, 구매 신호와 판매 신호를 설정한다.
신호를 등록해.
브린대는 이동평균선과 그 위에 파동폭을 나타내는 선을 더한 지표다.
이것은 1980년 존 브린그가 설계한 지표로 통계학을 응용하는 기술 지표 중의 하나이다.
1회 표준 편차, 1σ=약 68.3%
2차 표준 편차, 2σ=약 95.5%
3회 표준 편차, 3σ=약 99.7%

수량 선택

def handle_signals(ctx, date, current):

    done_syms = set([])

    ratio = current["bb_buy:sig"]
    df = ratio[ratio == 1.0]
    for (sym,val) in df.items():
        if sym in done_syms:
          continue

        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0.15, comment="シグナル買(%f)" % val)
        pass

    ratio = current["bb_sell:sig"]
    df = ratio[ratio == 1.0]
    for (sym,val) in df.items():
        if sym in done_syms:
          continue

        sec = ctx.getSecurity(sym)
        sec.order_target_percent(0, comment="シグナル売(%f)" % val)
        pass

    pass

그리고 아까 설정한 구매 신호로 매매를 하는 거예요.
상세한 상황은 여기에 있으며, 이번에 사용한 것만 열거합니다.
 
order_target_percent(amount, comment): void
이 주식의 총보유액과 총자산평가액(현금+보유위치평가액)을 지정비율로 하기 위해 주문을 진행한다.amount에서 비율을 지정합니다(예를 들어 5%면 0.05).
이번 경우 총자산의 15%를 매입해 자금이 없어지면 끝인 것처럼 느껴졌다는 것이다.
상당히 공격적인 무역이 성과를 높였다는 느낌입니다.
그럼 이번엔 여기까지.

좋은 웹페이지 즐겨찾기