本文希望通过简单的例子介绍,让大家知道如何在回测中使用限价单(LimitOrder)和止损单(StopOrder)。我们以order_target下单接口举例:(更多下单接口见order)
order_target(asset, amount, style=OrderType) 买卖股票, 使成交之后最终持有的股票数量达到预期目标的amount(股数)
参数:
asset – 股票
amount – 交易数量, 正数表示买入, 负数表示卖出
style –(可选参数)指定下单类型,默认为市价单,可用的下单类型如下:
style=MarketOrder(),下市价单
style=StopOrder(stop_price),下止损单,通常用来止损或者锁定利润
style=LimitOrder(limit_price),下限价单,限定一个价格买入或卖出
style=StopLimitOrder(limit_price=price1, stop_price=price2),指定限价和止损价格
限价单:如果是买单,当最新价小于等于限价单设置的价格,那么订单将生成;如果是卖单,当最新价大于等于限价单设置的价格,那么订单将生成;
止损单:当持有某股票仓位时,当市场价格小于等于止损价设置的价格时,订单将生成;
止损限价单:既设置止损价,又设置限价。
# 导入
from zipline.finance.execution import LimitOrder,StopOrder
# 选择投资标的
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
# 持仓标志,0表示没有持仓
context.pos = 0
# 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')
# 测试一个不容易触发的限价单
if context.trading_day_index == context.long_period+1:
order(sid,100, style=LimitOrder(price*0.8)) # 下限价单,价格为price*0.8,条件很难触发
context.pos = 1
context.stop_price = price*0.9
print('日期:',data.current_dt)
return
# 测试一个容易触发的限价单
if context.trading_day_index == context.long_period+2:
order(sid,100, style=LimitOrder(price*1.1)) # 下限价单,价格为price*1.1,条件很容易触发
context.pos = 1
context.stop_price = price*0.9 # 记录止损价格
print('日期:',data.current_dt)
return
# 测试一个止损单
if context.pos == 1:
order_target_percent(sid,0, style=StopOrder(context.stop_price)) # 下止损单。如果持有仓位,价格低于买入成本的90%,那就平仓
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='original',
)