创业板涨幅动量策略

Tags
#理财
在策略市场发现有不少创业板的动量效应策略,我回测了一下其中的几种,发现创业板的动量效应确实存在,容易暴涨暴跌。
考虑到暴涨之前,20日涨幅一定会上涨,暴跌之前,20日跌幅也一定会下跌。之所以用N日涨幅做突破指标,而不是N日均价,是发现,在顶部时,均价总是大于20日前的收盘价的,反应太慢,在底部时,均价又总是小于20日前的收盘价的,反应也慢。
对参数做了一番测试后,发现在这种情况下效果最好: 买入条件:20日涨幅大于8% 卖出条件:20日涨幅小于-2%
回测2014年01月01日至今的数据,年化收益率26.93%,最大回测-19.32%。
查看收益曲线时发现,这种策略一般都能抓住大涨,逃掉大跌,至于日常的小涨小跌,就当它是浮云了。
但是呢,这种策略有一个问题,就是在绝大多数时候,它是在空仓等待,资金利用率有点低了。
于是将策略中空仓时的资金,都买入货币基金了,但是回测的效果很一般,没啥大增强,买入债券基金呢,效果也不大。想了想,像创业板这种暴涨暴跌的,最好配一个慢慢上涨的做防守,于是选定了纳指100,回测了一下,效果很明显。年化收益率为36.75,最大回测为-26.13%。
可能有人说是因为防守基金选的纳指100,这种基金本来就是走势很好的,但是,我回测了一下从2014年买入纳指一直不动的话,年化收益率为20.29%,最大回测为-28.57%。
综合来看,无论是单纯的创业板动量策略,还是单纯的纳指100死守策略,都不如这两者的结合策略
notion image

代码

可直接复制到聚宽量化交易平台运行。
# 导入函数库
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')
    # 设置手续费是:买入时佣金万分之一,卖出时佣金万分之一,无印花税, 每笔交易佣金最低扣0块钱
    set_order_cost(OrderCost( open_commission=0.0001, close_commission=0.0001,close_tax=0, min_commission=0), type='fund')
    # 设置滑点
    set_slippage(FixedSlippage(0.01))
    # 开盘时运行
    run_daily(market_open, time='open', reference_security='000300.XSHG')
    g.percent=1

## 开盘时运行函数
def market_open(context):
    # 标的
    g.growth = '159915.XSHE' #攻击标的:创业板
    g.backup='513100.XSHG'#防守标的:银华日利(511880.XSHG)、纳指100(513100.XSHG)、消费(159928.XSHE)
    # 获取过去21日的收盘价
    close_data = get_bars(g.growth, count=21, unit='1d', fields=['date','close'])
    # 获取21日前的价格
    close_before_21 = close_data['close'][0]
    # 获取昨日的价格
    close_before_1 = close_data['close'][-1]
    # 取得昨日的20日涨幅
    rate20=close_before_1/close_before_21-1
    # 如果创业板昨日的20日涨幅高于8%, 则买入
    if rate20 > 0.08 :
        # 如果当前未持有创业板,则买入,否则就继续持有创业板,不用操作
        if g.growth not in context.portfolio.positions:
            # 如果持有纳指,则卖出
            if g.backup in context.portfolio.positions:
                g.sell_order=order_target_value(g.backup, 0)
                if g.sell_order is not None:
                    log.info("-->卖出防守标的:"+str(g.sell_order.price))
                    replay()
            # 买入创业板
            g.buy_order=order_target_value(g.growth, context.portfolio.total_value*g.percent)
            if g.buy_order is not None:
                log.info("买入攻击标的:"+str(g.buy_order.price))
    # 如果创业板昨日的20日涨幅低于-2%, 则卖出
    elif rate20 < -0.02 :
        # 如果当前已经持有创业板,则卖出,否则就继续持有纳指,不用操作
        if g.growth in context.portfolio.positions:
            # 卖出创业板
            g.sell_order=order_target_value(g.growth, 0)
            if g.sell_order is not None:

© fishyer 2022 - 2023