1. 程式人生 > >量化交易入門筆記-策略結構

量化交易入門筆記-策略結構

今天是國慶節假期第三天,萬分無聊,心想著不能白白虛度光陰,便想做點什麼——做了一頓美食、和貓咪玩了一會、運動了半小時、看了會書,忽想起一直被擱淺的量化交易,心裡實在忐忑不安。索性就認認真真的研究一番,也不枉這一半日的光陰。在此祝母國國運昌盛,也祝正在看本文章的你天天快樂^_^

瞭解股票量化策略的組成(結構)

單擊選單欄中的“我的策略”,然後單擊“新建策略”,新建一個“股票策略”,然後進入程式碼編輯視窗中

示例:

# 匯入函式庫
from jqdata import *

# 初始化函式,設定基準等等
def initialize(context):
    # 設定滬深300作為基準
    set_benchmark(
'000300.XSHG') # 開啟動態復權模式(真實價格) set_option('use_real_price', True) # 輸出內容到日誌 log.info() log.info('初始函式開始執行且全域性只執行一次') # 過濾掉order系列API產生的比error級別低的log # log.set_level('order', 'error') ### 股票相關設定 ### # 股票類每筆交易時的手續費是:買入時佣金萬分之三,賣出時佣金萬分之三加千分之一印花稅, 每筆交易佣金最低扣5塊錢 set_order_cost(
OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock') ## 執行函式(reference_security為執行時間的參考標的;傳入的標的只做種類區分,因此傳入'000300.XSHG'或'510300.XSHG'是一樣的) # 開盤前執行 run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') # 開盤時執行 run_daily(
market_open, time='open', reference_security='000300.XSHG') # 收盤後執行 run_daily(after_market_close, time='after_close', reference_security='000300.XSHG') ## 開盤前執行函式 def before_market_open(context): # 輸出執行時間 log.info('函式執行時間(before_market_open):'+str(context.current_dt.time())) # 給微信傳送訊息(新增模擬交易,並繫結微信生效) send_message('美好的一天~') # 要操作的股票:平安銀行(g.為全域性變數) g.security = '000001.XSHE' ## 開盤時執行函式 def market_open(context): log.info('函式執行時間(market_open):'+str(context.current_dt.time())) security = g.security # 獲取股票的收盤價 close_data = attribute_history(security, 5, '1d', ['close']) # 取得過去五天的平均價格 MA5 = close_data['close'].mean() # 取得上一時間點價格 current_price = close_data['close'][-1] # 取得當前的現金 cash = context.portfolio.available_cash # 如果上一時間點價格高出五天平均價1%, 則全倉買入 if current_price > 1.01*MA5: # 記錄這次買入 log.info("價格高於均價 1%%, 買入 %s" % (security)) # 用所有 cash 買入股票 order_value(security, cash) # 如果上一時間點價格低於五天平均價, 則空倉賣出 elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0: # 記錄這次賣出 log.info("價格低於均價, 賣出 %s" % (security)) # 賣出所有股票,使這隻股票的最終持有量為0 order_target(security, 0) ## 收盤後執行函式 def after_market_close(context): log.info(str('函式執行時間(after_market_close):'+str(context.current_dt.time()))) #得到當天所有成交記錄 trades = get_trades() for _trade in trades.values(): log.info('成交記錄:'+str(_trade)) log.info('一天結束') log.info('##############################################################')

上例是自動生成的程式碼,其基本的結構為:

  • 匯入聚寬函式庫 import jqdata
  • 初始化函式 initialize
  • 開盤前執行函式 before_market_open
  • 開盤時執行函式 market_open
  • 收盤後執行函式 after_market_close

初始化函式(initialize)

平臺程式碼:

# 初始化函式,設定基準等等
def initialize(context):
    # 設定滬深300作為基準
    set_benchmark('000300.XSHG')
    # 開啟動態復權模式(真實價格)
    set_option('use_real_price', True)
    # 輸出內容到日誌 log.info()
    log.info('初始函式開始執行且全域性只執行一次')
    # 過濾掉order系列API產生的比error級別低的log
    # log.set_level('order', 'error')
    
    ### 股票相關設定 ###
    # 股票類每筆交易時的手續費是:買入時佣金萬分之三,賣出時佣金萬分之三加千分之一印花稅, 每筆交易佣金最低扣5塊錢
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    ## 執行函式(reference_security為執行時間的參考標的;傳入的標的只做種類區分,因此傳入'000300.XSHG'或'510300.XSHG'是一樣的)
      # 開盤前執行
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG') 
      # 開盤時執行
    run_daily(market_open, time='open', reference_security='000300.XSHG')
      # 收盤後執行
    run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')

initialize(context),即初始化函式,在整個回測或實盤中開始執行一次用於初始化一些全域性變數。引數context是一個Context物件,用以儲存當前賬戶或股票持倉資訊

開盤前執行函式(before_market_open)

平臺程式碼:

## 開盤前執行函式     
def before_market_open(context):
    # 輸出執行時間
    log.info('函式執行時間(before_market_open):'+str(context.current_dt.time()))

    # 給微信傳送訊息(新增模擬交易,並繫結微信生效)
    send_message('美好的一天~')

    # 要操作的股票:平安銀行(g.為全域性變數)
    g.security = '000001.XSHE'

該函式的名稱與行為可以自定義,它是在初始化函式中被run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')呼叫,該函式會在每天開盤前執行

開盤時執行函式(market_open)

平臺程式碼:

## 開盤時執行函式
def market_open(context):
    log.info('函式執行時間(market_open):'+str(context.current_dt.time()))
    security = g.security
    # 獲取股票的收盤價
    close_data = attribute_history(security, 5, '1d', ['close'])
    # 取得過去五天的平均價格
    MA5 = close_data['close'].mean()
    # 取得上一時間點價格
    current_price = close_data['close'][-1]
    # 取得當前的現金
    cash = context.portfolio.available_cash

    # 如果上一時間點價格高出五天平均價1%, 則全倉買入
    if current_price > 1.01*MA5:
        # 記錄這次買入
        log.info("價格高於均價 1%%, 買入 %s" % (security))
        # 用所有 cash 買入股票
        order_value(security, cash)
    # 如果上一時間點價格低於五天平均價, 則空倉賣出
    elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
        # 記錄這次賣出
        log.info("價格低於均價, 賣出 %s" % (security))
        # 賣出所有股票,使這隻股票的最終持有量為0
        order_target(security, 0)

該函式名稱可以自定義,它是在初始化函式中被run_daily(market_open, time='open', reference_security='000300.XSHG')呼叫,會在每個交易日的開盤的整個時間內執行

收盤後執行函式

平臺程式碼:

def after_market_close(context):
    log.info(str('函式執行時間(after_market_close):'+str(context.current_dt.time())))
    #得到當天所有成交記錄
    trades = get_trades()
    for _trade in trades.values():
        log.info('成交記錄:'+str(_trade))
    log.info('一天結束')
    log.info('##############################################################')

該函式名稱可自定義,它是在初始化函式中被run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')呼叫,會在收盤後執行

本節內容先了解編寫一個策略的框架,粗略的讀一下平臺的程式碼,以作了解

注:本文章為個人學習筆記,參考了一些書籍與官方教程,不作任何商業用途!