量化交易——動量策略vs反轉策略


一、動量策略和反轉策略介紹

1、動量效應&反轉效應

  動量效應(Momentum effect):股票的收益率有延續原來的運動方向的趨勢,即過去一段時間收益率較高的股票在未來獲得的收益率仍會高於過去收益率較低的股票。

  反轉效應(Reversal effect):在一段較長的時間內,表現差的股票在其后的一段時間內有強烈的趨勢經歷相當大的逆轉,要回復到正常水平(reversal to mean),而在給定的一段時間內,最佳股票則傾向於在其后的時間內出現差的表現。

2、動量策略&反轉策略

  動量策略:基於股價動量效應的投資策略,如果某只股票在前一段時期表現較好,那么下一端時期該股票仍將有良好表現。

  反轉策略:基於股價反轉效應的投資策略,如果某只股票在前一段時期表現不好,那么下一段時期該股票將會反轉,即表現良好。

  使用策略:

  • 計算股票池中所有股票在前一段時間的收益率
  • 選擇收益率最大(最小)的N只股票調倉

二、動量策略&反轉策略實現

def initialize(context):
    # 設定滬深300作為基准
    set_benchmark('000300.XSHG')
    # 開啟動態復權模式(真實價格)
    set_option('use_real_price', True)
    # 股票類每筆交易時的手續費是:買入時佣金萬分之三,賣出時佣金萬分之三加千分之一印花稅, 每筆交易佣金最低扣5塊錢
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    # 持股數量
    g.N = 10
    run_monthly(handle, 1)


def handle(context):
    stocks = get_index_stocks('000300.XSHG')
    
    # 滬深300股票的過去30天(不包含今天)的每天的收盤價
    df_close = history(30, field='close', security_list=list(stocks)).T
    # 加入一列——每只股票這30天收益率
    df_close['ret'] = (df_close.iloc[:,-1]-df_close.iloc[:,0]) / df_close.iloc[:,0]
    # ascending=False:根據收益率降序排列——動量策略
    # ascending=True:根據收益率升序排列——反轉策略
    sorted_stocks = df_close.sort_values('ret', ascending=False).index
    # 找到收益最大/最小的N只股票
    to_hold = sorted_stocks[:g.N]

    for stock in context.portfolio.positions:
        if stock not in to_hold:
            order_target_value(stock, 0)
            
    to_buy = [stock for stock in to_hold if stock not in context.portfolio.positions]
    
    if len(to_buy) > 0:
        cash_per_stock = context.portfolio.available_cash / len(to_buy)
        for stock in to_buy:
            order_value(stock, cash_per_stock)

1、history()——獲取歷史數據

  查詢歷史數據中多個標的單個數據字段。

history(count, unit='1d', field='avg', security_list=None, df=True, skip_paused=False, fq='pre')

  查看過去30天(不包含今天)的每天的收盤價:

def initialize(context):
    # 設定滬深300作為基准
    set_benchmark('000300.XSHG')
    # 開啟動態復權模式(真實價格)
    set_option('use_real_price', True)
    # 股票類每筆交易時的手續費是:買入時佣金萬分之三,賣出時佣金萬分之三加千分之一印花稅, 每筆交易佣金最低扣5塊錢
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    # 持股數量
    g.N = 10
    run_monthly(handle, 1)


def handle(context):
    stocks = get_index_stocks('000300.XSHG')
    
    # 滬深300股票的過去30天(不包含今天)的每天的收盤價
    df_close = history(30, field='close', security_list=list(stocks)).T
    print(df_close)

  執行顯示如下:

2019-01-02 09:30:00 - INFO  -              2018-11-19  2018-11-20     ...      2018-12-27  2018-12-28
000001.XSHE       10.85       10.57     ...            9.28        9.38
000002.XSHE       25.97       25.65     ...           23.44       23.82
000063.XSHE       21.73       20.51     ...           19.90       19.59
000069.XSHE        6.38        6.25     ...            6.16        6.35
000100.XSHE        2.60        2.56     ...            2.42        2.45
000157.XSHE        3.74        3.67     ...            3.58        3.56

2、pandas的sort_values()方法

sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)

  參數:

  • axis:0按照行名排序;1按照列名排序
  • level:默認None,否則按照給定的level順序排列---貌似並不是,文檔
  • ascending:默認True升序排列;False降序排列
  • inplace:默認False,否則排序之后的數據直接替換原來的數據框
  • kind:默認quicksort,排序的方法
  • na_position:缺失值默認排在最后{"first","last"}
  • by:按照那一列數據進行排序,但是by參數貌似不建議使用

3、執行顯示效果

  動量策略:

  

   反轉策略:

  

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM