[量化学堂-策略开发]金叉死叉策略

金叉死叉策略
双均线
标签: #<Tag:0x00007f5bf99bf260> #<Tag:0x00007f5bf99bf120>

(iQuant) #1

本文向大家详细介绍如何在BigQuant平台开发传统的择时策略,旨在帮助大家对BigQuant平台回测有初步印象。

金叉死叉策略其实就是双均线策略。策略思想是:当短期均线上穿长期均线时,形成金叉,此时买入股票。当短期均线下穿长期均线时,形成死叉,此时卖出股票。研究表明,双均线系统虽然简单,但只要严格执行,也能长期盈利。

首先,我们选择要交易的股票,用instruments表示,然后确定回测的开始时间和结束时间。记住,如果是单只股票,那么instruments就是含有一个元素的列表,如果是多只股票,instruments就是含有多个元素的列表。

# 选择投资标的
instruments = ['600519.SHA']  
# 设置回测开始时间
start_date = '2012-05-28'  
# 设置回测结束时间 
end_date = '2017-07-18' 

然后,编写策略初始化部分。

# initialize函数只会运行一次,在第一个日期运行,因此可以把策略一些参数放在该函数定义
def initialize(context):
    # 设置手续费,买入时万3,卖出是千分之1.3,不足5元以五元计
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    # 短均线参数
    context.short_period = 5
    # 长均线参数
    context.long_period = 50

接着,编写策略主体部分。

# handle_data函数会每个日期运行一次,可以把行情数据理解成K线,然后handle_data函数会在每个K
#  线上依次运行
def handle_data(context, data):
    # 当运行的K线数量还达不到长均线时直接返回
    if context.trading_day_index <  context.long_period:
        return    
    # 投资标的
    k = instruments[0]
    sid = context.symbol(k)
    # 最新价格
    price = data.current(sid, 'price')  
    # 短周期均线值
    short_mavg = data.history(sid, 'price',context.short_period, '1d').mean()  
    # 长周期均线值
    long_mavg = data.history(sid, 'price',context.long_period, '1d').mean()   
    # 账户现金  
    cash = context.portfolio.cash  
    # 账户持仓
    cur_position = context.portfolio.positions[sid].amount 

    # 策略逻辑部分
    # 空仓状态下,短周期均线上穿长周期均线,买入股票
    if short_mavg > long_mavg and cur_position == 0  and data.can_trade(sid):  
        context.order(sid, int(cash/price/100)*100) 
    # 持仓状态下,短周期均线下穿长周期均线,卖出股票
    elif short_mavg < long_mavg  and cur_position > 0 and   data.can_trade(sid):  
        context.order_target_percent(sid, 0) 

最后,编写策略回测接口。

m=M.trade.v2(
    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,
    )

如果执行代码,策略就跑起来了,测试结果很快就显示在你的眼前了,是不是很神奇。点击 克隆策略按钮就可以把完整策略复制到你的个人账户里啦。宽客们快去试试吧:slight_smile:

克隆策略

金叉死叉策略

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

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

1. 主要参数

In [1]:
# 股票选择
instruments = ['600519.SHA']  
# 开始时间
start_date = '2012-05-29'  
# 结束时间
end_date = '2017-11-08'

2. 策略回测主体

In [2]:
# 初始化账户
def initialize(context):
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) # 设置手续费,买入成本为万分之三,卖出为千分之1.3
    context.short_period = 5 # 短期均线
    context.long_period = 50 # 长期均线 

def handle_data(context, data):
    
    # 长期均线值要有意义,需要在50根k线之后
    if context.trading_day_index <  context.long_period:   
        return
    
    k = instruments[0] # 标的为字符串格式
    sid = context.symbol(k) # 将标的转化为equity格式
    price = data.current(sid, 'price') # 最新价格
 
    short_mavg = data.history(sid, 'price',context.short_period, '1d').mean() # 短期均线值
    long_mavg = data.history(sid, 'price',context.long_period, '1d').mean() # 长期均线值

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

3.回测接口

In [3]:
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=1000000, # 本金
    )
[2017-11-09 11:00:42.311280] INFO: bigquant: backtest.v7 开始运行..
[2017-11-09 11:00:53.642338] INFO: Performance: Simulated 1327 trading days out of 1327.
[2017-11-09 11:00:53.643773] INFO: Performance: first open: 2012-05-29 13:30:00+00:00
[2017-11-09 11:00:53.644724] INFO: Performance: last close: 2017-11-08 20:00:00+00:00
  • 收益率456.59%
  • 年化收益率38.54%
  • 基准收益率54.82%
  • 阿尔法0.33
  • 贝塔0.31
  • 夏普比率1.54
  • 收益波动率22.2%
  • 信息比率1.11
  • 最大回撤17.44%
[2017-11-09 11:00:57.790053] INFO: bigquant: backtest.v7 运行完成[15.478802s].

一文带你快速入门股票量化交易
社区干货与精选整理(持续更新中...)
金叉死叉策略改动标的后,结果异常
(463941562) #2

为何输入其他的股票代码都 不会成交?收益率为0


(iQuant) #3

换成美的电器 000333,也是可以的啊。

克隆策略

金叉死叉策略

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

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

1. 主要参数

In [2]:
instruments = ['000333.SZA']  
start_date = '2012-05-28'  
end_date = '2017-07-18'

2. 策略回测主体

In [3]:
def initialize(context):
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) # 设置手续费
    context.short_period = 5 # 短期均线
    context.long_period = 50 # 长期均线 

def handle_data(context, data):
    
    if context.trading_day_index <  context.long_period:  # 长期均线值要有意义,需要在50根k线之后
        return
    
    k = instruments[0] # 标的为字符串格式
    sid = context.symbol(k) # 将标的转化为equity格式
    price = data.current(sid, 'price') # 最新价格
 
    short_mavg = data.history(sid, 'price',context.short_period, '1d').mean() # 短期均线值
    long_mavg = data.history(sid, 'price',context.long_period, '1d').mean() # 长期均线值

    cash = context.portfolio.cash # 现金
    cur_position = context.portfolio.positions[sid].amount # 持仓
    
    # 交易逻辑
    if short_mavg > long_mavg and cur_position == 0 and data.can_trade(sid):  
        context.order(sid, int(cash/price/100)*100) # 买入
        
    elif short_mavg < long_mavg and cur_position > 0 and data.can_trade(sid):  
        context.order_target_percent(sid, 0) # 全部卖出
     
        

3.回测接口

In [4]:
m=M.trade.v2(
    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=1000000,
    )
[2017-11-30 21:39:12.569861] INFO: bigquant: backtest.v7 开始运行..
[2017-11-30 21:39:25.546962] INFO: Performance: Simulated 1252 trading days out of 1252.
[2017-11-30 21:39:25.548495] INFO: Performance: first open: 2012-05-28 13:30:00+00:00
[2017-11-30 21:39:25.549635] INFO: Performance: last close: 2017-07-18 19:00:00+00:00
  • 收益率266.98%
  • 年化收益率29.91%
  • 基准收益率42.52%
  • 阿尔法0.24
  • 贝塔0.38
  • 夏普比率0.98
  • 收益波动率26.1%
  • 信息比率0.78
  • 最大回撤19.06%
[2017-11-30 21:39:30.360289] INFO: bigquant: backtest.v7 运行完成[17.790449s].


(lonereed) #4

真的可以实现。。。厉害厉害


(kajimage) #5

请问不能用于全市场的股票分析吗?


(达达) #6

可以参考传统策略的可视化开发