如何写一个趋势和强度同时有效的策略

新手专区
标签: #<Tag:0x00007f73e94b2c10>

(jh_ufo) #1

基本思路是: 5日均线上穿30均线,并且macd 处于强势状态(红色柱体),提示出现买入信号,并开仓;

怎么将macd 的状态加进策略中呢,请大虾们明示,谢谢!

初始化部分:

def initialize(context):

    # 设置手续费,买入时万3,卖出是千分之1.3,不足5元以5元计
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
    # 短均线参数
    context.short_period = 5
    # 长均线参数
    context.long_period = 30
    #趋势参数
    # 这里想标明 MACD往上走;

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

(iQuant) #2
克隆策略

移动平均线和MACD结合起来开发策略

当短期均线上穿长期均线并且macd线上穿signal线时,买入股票 

当短期均线下穿长期均线并且并且macd线下穿signal线时,卖出

1. 主要参数

In [6]:
import talib
instruments = ['600519.SHA']  
start_date = '2012-05-28'  
end_date = '2017-07-18'

2. 策略回测主体

In [15]:
def initialize(context):
    context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) # 设置手续费
    context.short_ma = 5 # 移动平均线指标参数
    context.long_ma = 50 
    context.short_macd = 12 # macd指标参数
    context.long_macd = 26
    context.smoothperiod = 9

def handle_data(context, data):
    
    if context.trading_day_index <  context.long_ma: # 长期均线值要有意义,需要在50根k线之后
        return
    
    k = instruments[0] # 标的为字符串格式
    sid = context.symbol(k) # 将标的转化为equity格式
    current_price = data.current(sid, 'price') # 最新价格
    
    short_mavg = data.history(sid, 'price',context.short_ma, '1d').mean() # 短期均线值
    long_mavg = data.history(sid, 'price',context.long_ma, '1d').mean() # 长期均线值
    prices = data.history(sid, 'price', context.long_ma, '1d') # 读取历史数据
    # 使用talib包计算macd指标
    macd, signal, hist = talib.MACD(np.array(prices), context.short_macd, context.long_macd, context.smoothperiod)
    
    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) and macd[-1] - signal[-1] > 0 and macd[-2] - signal[-2] < 0:  
        context.order(sid, int(cash/current_price/100)*100) # 买入
    # 卖出交易逻辑
    elif short_mavg < long_mavg and cur_position > 0 and data.can_trade(sid) and macd[-1] - signal[-1] < 0 and macd[-2] - signal[-2] > 0:  
        context.order_target_percent(sid, 0) # 全部卖出

3.回测接口

In [16]:
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-08-31 12:04:03.189639] INFO: bigquant: backtest.v7 start ..
[2017-08-31 12:04:12.902285] INFO: Performance: Simulated 1252 trading days out of 1252.
[2017-08-31 12:04:12.903701] INFO: Performance: first open: 2012-05-28 13:30:00+00:00
[2017-08-31 12:04:12.904681] INFO: Performance: last close: 2017-07-18 19:00:00+00:00
  • 收益率98.83%
  • 年化收益率14.84%
  • 基准收益率42.52%
  • 阿尔法0.09
  • 贝塔0.33
  • 夏普比率0.5
  • 收益波动率20.92%
  • 信息比率0.29
  • 最大回撤28.06%
[2017-08-31 12:04:16.692965] INFO: bigquant: backtest.v7 end [13.503301s].

(iQuant) #3

策略逻辑部分应该放在handle_data函数部分,不能放在initialize函数部分,因为initialize函数部分只在第一个交易日调用一次,而handle_data函数部分会在每个交易日都调用。详情请参考:交易引擎


(jh_ufo) #4

3Q,策略已经跑起来了