克隆策略
In [9]:
# 1. 策略基本参数
import numpy as np
import talib as ta
instruments = ['600031.SHA']
# 起始日期
start_date = '2014-11-01'
# 结束日期
end_date = '2016-08-08'
# 初始资金
capital_base = 100000
# 2. 选择股票:为了得到更好的性能,在这里做批量计算
history_data = D.history_data(instruments, start_date, end_date, fields=['close'])
# 3. 策略主体函数
# 初始化虚拟账户状态,只在第一个交易日运行
def initialize(context):
# 设置手续费,买入时万3,卖出是千分之1.3,不足5元以5元计
context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
# 策略交易逻辑,每个交易日运行一次
def handle_data(context,data):
for instrument in instruments:
sid = context.symbol(instrument)
float_data = data.history(sid, 'price', 60, '1d').values # 获取最近60日的收盘价数据
nhisbar = np.array(float_data) # 转化成array格式,以便talib函数调用
MA10 = ta.MA(nhisbar,10)
MA13 = ta.MA(nhisbar,13)
MA34 = ta.MA(nhisbar,34)
MA55 = ta.MA(nhisbar,55)
MA60 = ta.MA(nhisbar,60)
cur_position = context.portfolio.positions[sid].amount # 目前持仓
#调仓:买入新的股票
stock_market_price = data.current(context.symbol(instrument), 'price')
if MA13[-1] > MA55[-1] and MA34[-1] > MA55[-1] and MA13[-1] > MA34[-1] and cur_position == 0 and data.can_trade(sid):
if stock_market_price is not np.nan:
amount = int(capital_base / stock_market_price / 100) * 100
if amount > 100:
context.order(context.symbol(instrument), amount) # 由于是希望成交amount数量,因此使用order下单接口
elif MA13[-1] < MA34[-1] and data.can_trade(sid):
if stock_market_price is not np.nan:
context.order_target_percent(context.symbol(instrument), 0)
# 4. 策略回测:https://bigquant.com/docs/module_trade.html
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=capital_base+1,
benchmark='000001.INDX'
)