量化交易——动量策略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、执行显示效果

  动量策略:

  

   反转策略:

  

 

 

  

 

posted @ 2020-05-20 12:04  休耕  阅读(7973)  评论(0编辑  收藏  举报