zoukankan      html  css  js  c++  java
  • 量化交易——动量策略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、执行显示效果

      动量策略:

      

       反转策略:

      

      

  • 相关阅读:
    困扰几周了,请教啊,android与websevice数据交互很诡异的问题
    最新版本_adt-bundle-windows-x86_64-20140702 无法建立avd
    android向web提交数据,中文乱码
    activity怎么控制fragment中的textview组件
    关于云储存或者百度云的基础问题, 用java/android 实现上传文件到云储存(比如百度云)
    短信列表如何让同一个号码的短信只显示一条,刚刚加载短信列表会加载所有的数据列。求指教
    Android图片上传到服务器的问题
    安卓模拟器这么慢,大家都怎么调试的?
    浏览器前缀-----[译]Autoprefixer:一个以最好的方式处理浏览器前缀的后处理程序
    windows 下安装nodejs及其配置环境
  • 原文地址:https://www.cnblogs.com/xiugeng/p/12922822.html
Copyright © 2011-2022 走看看