回测16年3月25号,5日均线大于20日均线卖出了

策略分享
标签: #<Tag:0x00007fcf6694b1e0>

(chidaye) #1
克隆策略

金叉死叉策略

当短期均线上穿长期均线,出现金叉,买入

当短期均线下穿长期均线,出现死叉,卖出

1. 主要参数

In [177]:
# 股票选择
instruments =['000099.SZA']

#['000099.SZA','002197.SZA','600520.SHA','600312.SHA','600995.SHA','601998.SHA','000012.SZA','000625.SZA','000623.SZA','601088.SHA','601800.SHA','002673.SZA','002206.SZA','000559.SZA']
  #中信海直  ,政通电子,     文一科技,   平高电气,  文山电力,    中信银行,      南玻,         长安汽车,吉林敖东      中国神华      中国交建      西部证券,   海利得       万向钱潮
# 开始时间
start_date = '2015-12-01'
# 结束时间
end_date = '2018-03-21'

2. 策略回测主体

In [178]:
# 初始化账户
def initialize(context):
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) # 设置手续费,买入成本为万分之三,卖出为千分之1.3
    context.period_5 = 5
    context.period_10 =10
    context.period_20= 20
    context.period_30 =30
    context.period_60 =60
    context.ins = context.instruments
    context.weights = 1/len(context.instruments)
def handle_data(context, data):
    date = data.current_dt.strftime('%Y-%m-%d')  
    #------------------------------------------止赢模块START--------------------------------------------
    positions = {e.symbol: p.cost_basis  for e, p in context.portfolio.positions.items()}
    # 新建当日止赢股票列表是为了handle_data 策略逻辑部分不再对该股票进行判断
    current_stopwin_stock = [] 
    if len(positions) > 0:
        for i in positions.keys():
            stock_cost = positions[i] 
            stock_market_price = data.current(context.symbol(i), 'price') 
            # 赚10%就止赢
            if (stock_market_price - stock_cost ) / stock_cost>= 0.15:   
                context.order_target_percent(context.symbol(i),0)     
                current_stopwin_stock.append(i)
                print('日期:',date,'股票:',i,'出现止盈状况')
    #-------------------------------------------止赢模块END---------------------------------------------
    
     
    # 长期均线值要有意义,需要在50根k线之后
    if context.trading_day_index <  context.period_20:     
        return
    for k in context.instruments:
        sid = context.symbol(k) # 将标的转化为equity格式
        price = data.current(sid, 'price') # 最新价格
     
        mavg_5 = data.history(sid, 'price',context.period_5, '1d').mean() # 短期均线值
        mavg_10 = data.history(sid, 'price',context.period_10, '1d').mean() # 短期均线值
        mavg_20 = data.history(sid, 'price',context.period_20, '1d').mean() # 短期均线值
        mavg_30 = data.history(sid, 'price',context.period_30, '1d').mean() # 短期均线值
        mavg_60 = data.history(sid, 'price',context.period_60, '1d').mean() # 长期均线值
  
    

        cash = context.portfolio.portfolio_value  # 现金
        cur_position = context.portfolio.positions[sid].amount # 持仓
    
        # 交易逻辑
        # 如果短期均线大于长期均线形成金叉,并且没有持仓,并且该股票可以交易
        
    if mavg_5 > mavg_20   and cur_position == 0  and data.can_trade(sid):  
            context.order_target_percent(sid, 0.3) # 买入
        # 如果短期均线小于长期均线形成死叉,并且有持仓,并且该股票可以交易
    elif  mavg_5 < mavg_20  and cur_position > 0 and   data.can_trade(sid):  
            context.order_target_percent(sid, 0) # 全部卖出
    

     

3.回测接口

In [179]:
m=M.trade.v3(
    instruments=instruments,
    start_date=start_date,
    end_date=end_date,
    initialize=initialize,
    handle_data=handle_data,
    order_price_field_buy='open', # 以开盘价买入
    order_price_field_sell='open', # 以开盘价卖出
    capital_base=100000, # 本金
    price_type='forward_adjusted'
    )
[2018-03-28 16:42:08.252732] INFO: bigquant: backtest.v7 开始运行..
[2018-03-28 16:42:08.258332] INFO: bigquant: 命中缓存
  • 收益率-10.16%
  • 年化收益率-4.68%
  • 基准收益率13.87%
  • 阿尔法-0.09
  • 贝塔0.11
  • 夏普比率-1.33
  • 胜率0.267
  • 盈亏比1.381
  • 收益波动率6.85%
  • 信息比率-0.63
  • 最大回撤15.33%
[2018-03-28 16:42:10.780072] INFO: bigquant: backtest.v7 运行完成[2.527343s].

(小Q) #2

我们回测了下,当天的卖出是前一个交易日出现了止盈信号,不知道你这边检查是否检查到这个原因!