QuantX에서 균형표를 사용하는 시스템 거래 중 하나(기준선·전환선)

자기 소개


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

뭘 만들지(목표 달성)


닛케이 평균 기여율 상위 10개 종목(2018년 12월 25일)을 사용해 균형표 한 목의 기준선과 전환선의 교차로 매매하는 알고리즘을 제작한다!!!
일단 움직이면 돼.
공식적으로 쓰면 이런 느낌이에요.



買い(buy)= (転換線の値-基準線の値 )>0
\\

\\
売り(sell) = (転換線の値-基準線の値 )< 0

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

############################################################################
# 日経一目均衡表その1
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_ichimoku(data):

      cp=data["close_price_adj"].fillna(method="ffill")
      hp=data["high_price_adj"].fillna(method="ffill")

      result1=pd.DataFrame(data=0,columns=[],index=cp.index)
      sample1=pd.DataFrame(data=0,columns=[],index=cp.index)
      result1=pd.DataFrame(data=0,columns=[],index=cp.index)
      sample3=pd.DataFrame(data=0,columns=[],index=cp.index)
      index3=pd.DataFrame(data=0,columns=[],index=cp.index)
      index6=pd.DataFrame(data=0,columns=[],index=cp.index)
      index7=pd.DataFrame(data=0,columns=[],index=cp.index)
      index8=pd.DataFrame(data=0,columns=[],index=cp.index)
      index12=pd.DataFrame(data=0,columns=[],index=cp.index)
      index13=pd.DataFrame(data=0,columns=[],index=cp.index)
      index14=pd.DataFrame(data=0,columns=[],index=cp.index)

      index1=data["high_price_adj"].fillna(method='ffill').rolling(window=9,center=False).max()
      index2=data["low_price_adj"].fillna(method="ffill").rolling(window=9,center=False).min()
      index3=(index1+index2)/2 #転換線
      index4=data["high_price_adj"].fillna(method='ffill').rolling(window=26,center=False).max()
      index5=data["low_price_adj"].fillna(method='ffill').rolling(window=26,center=False).min()
      index6=(index4+index5)/2 #基準線
      index7=(index3+index6)/2 
      index8=index7.shift(26) #先行スパン1
      index9=data["high_price_adj"].fillna(method='ffill').rolling(window=52,center=False).max()
      index10=data["low_price_adj"].fillna(method='ffill').rolling(window=52,center=False).min()
      index11=(index8+index9)/2 
      index12=index11.shift(26) #先行スパン2
      index13=index3-index6
      index14=index13.shift(1)
      index15=data["close_price_adj"].fillna(method='ffill').shift(26)

      buy_sig=index13[(index13>0)&(index14<0)]
      sell_sig=index13[(index13<0)&(index14>0)]

      return {
          "buy:sig":buy_sig,
          "sell:sig":sell_sig,
          "転換線:g2":index3,
          "基準線:g2":index6,
          "先行スパン1:g2":index8,
          "先行スパン2:g2":index12,
          "遅行線:g2":index15
        }

    # シグナル登録
    ctx.regist_signal("my_ichimoku", _my_ichimoku)

def handle_signals(ctx, date, current):

    buy = current["buy:sig"].dropna()
    for (sym,val) in buy.items():

        sec = ctx.getSecurity(sym)
        sec.order(sec.unit() * 1, comment="SIGNAL BUY")
        ctx.logger.debug("BUY: %s,  %f" % (sec.code(), val))
        pass

    sell = current["sell:sig"].dropna()
    for (sym,val) in sell.items():

        sec = ctx.getSecurity(sym)
        sec.order(sec.unit() * -1, comment="SIGNAL SELL")
        ctx.logger.debug("SELL: %s,  %f" % (sec.code(), val))
        pass

결과는 다음과 같다.



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

해설


총서 선택


#총서 목록 설정
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_ichimoku(data):

      cp=data["close_price_adj"].fillna(method="ffill")
      hp=data["high_price_adj"].fillna(method="ffill")

      result1=pd.DataFrame(data=0,columns=[],index=cp.index)
      sample1=pd.DataFrame(data=0,columns=[],index=cp.index)
      result1=pd.DataFrame(data=0,columns=[],index=cp.index)
      sample3=pd.DataFrame(data=0,columns=[],index=cp.index)
      index3=pd.DataFrame(data=0,columns=[],index=cp.index)
      index6=pd.DataFrame(data=0,columns=[],index=cp.index)
      index7=pd.DataFrame(data=0,columns=[],index=cp.index)
      index8=pd.DataFrame(data=0,columns=[],index=cp.index)
      index12=pd.DataFrame(data=0,columns=[],index=cp.index)
      index13=pd.DataFrame(data=0,columns=[],index=cp.index)
      index14=pd.DataFrame(data=0,columns=[],index=cp.index)

      index1=data["high_price_adj"].fillna(method='ffill').rolling(window=9,center=False).max()
      index2=data["low_price_adj"].fillna(method="ffill").rolling(window=9,center=False).min()
      index3=(index1+index2)/2 #転換線
      index4=data["high_price_adj"].fillna(method='ffill').rolling(window=26,center=False).max()
      index5=data["low_price_adj"].fillna(method='ffill').rolling(window=26,center=False).min()
      index6=(index4+index5)/2 #基準線
      index7=(index3+index6)/2 
      index8=index7.shift(26) #先行スパン1
      index9=data["high_price_adj"].fillna(method='ffill').rolling(window=52,center=False).max()
      index10=data["low_price_adj"].fillna(method='ffill').rolling(window=52,center=False).min()
      index11=(index8+index9)/2 
      index12=index11.shift(26) #先行スパン2
      index13=index3-index6
      index14=index13.shift(1)
      index15=data["close_price_adj"].fillna(method='ffill').shift(26)

      buy_sig=index13[(index13>0)&(index14<0)]
      sell_sig=index13[(index13<0)&(index14>0)]

      return {
          "buy:sig":buy_sig,
          "sell:sig":sell_sig,
          "転換線:g2":index3,
          "基準線:g2":index6,
          "先行スパン1:g2":index8,
          "先行スパン2:g2":index12,
          "遅行線:g2":index15
        }

    # シグナル登録
    ctx.regist_signal("my_ichimoku", _my_ichimoku)


이번에 사용한 값을cp에 대입하여 균형표(기준선, 전환선, 선행경계 1, 2, 느린행선)에 필요한 값을 구한다.
전환선치-기준선치가 0보다 크면 매입하고 0보다 작으면 팔라는 신호.
균형표의 값에 관하여
기준선
지난 26일의 고가와 저가의 평균치
전환선
지난 9일간의 고가와 저가의 평균치
서행 간격
이날 종가는 26일 종가보다 낮다
선행 간격1
기준선과 전환선의 중간 위치를 26일 앞당겨 작성했습니다.
선행 간격2
52일의 고가와 저가를 26일 앞당겨 기입한
보답치로 균형표의 값, 구매 신호와 판매 신호를 설정한다.
신호를 등록해.

수량 선택

def handle_signals(ctx, date, current):

    buy = current["buy:sig"].dropna()
    for (sym,val) in buy.items():

        sec = ctx.getSecurity(sym)
        sec.order(sec.unit() * 1, comment="SIGNAL BUY")
        ctx.logger.debug("BUY: %s,  %f" % (sec.code(), val))
        pass

    sell = current["sell:sig"].dropna()
    for (sym,val) in sell.items():

        sec = ctx.getSecurity(sym)
        sec.order(sec.unit() * -1, comment="SIGNAL SELL")
        ctx.logger.debug("SELL: %s,  %f" % (sec.code(), val))
        pass


그리고 아까 설정한 신호기로 매매를 해요.
상세한 상황은 여기에 있으며, 이번에 사용한 것만 열거합니다.
 
order(amount, comment): void
수량을 지정하여 주문하다.
이번엔 유닛 주식 매매 느낌으로 자금을 관리하겠다는 것이다.
그럼 이번엔 여기까지.

좋은 웹페이지 즐겨찾기