一文了解限价单和止损单

策略分享
limitorder
stoporder
标签: #<Tag:0x00007fcf7963c6d0> #<Tag:0x00007fcf7963c518> #<Tag:0x00007fcf7963c3d8>

(iQuant) #1
克隆策略

本文内容

本文希望通过简单的例子介绍,让大家知道如何在回测中使用限价单(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),指定限价和止损价格

释义

  • 限价单:如果是买单,当最新价小于等于限价单设置的价格,那么订单将生成;如果是卖单,当最新价大于等于限价单设置的价格,那么订单将生成;

  • 止损单:当持有某股票仓位时,当市场价格小于等于止损价设置的价格时,订单将生成;

  • 止损限价单:既设置止损价,又设置限价。

例子介绍

In [30]:
# 导入
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
In [40]:
# 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%,那就平仓
         
In [41]:
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',
    )
[2017-12-25 19:35:24.025304] INFO: bigquant: backtest.v7 开始运行..
[2017-12-25 19:35:24.138728] INFO: algo: set price type:original
日期: 2012-08-08 07:00:00+00:00
日期: 2012-08-09 07:00:00+00:00
[2017-12-25 19:35:32.113558] INFO: Performance: Simulated 1252 trading days out of 1252.
[2017-12-25 19:35:32.114812] INFO: Performance: first open: 2012-05-28 01:30:00+00:00
[2017-12-25 19:35:32.115785] INFO: Performance: last close: 2017-07-18 07:00:00+00:00
  • 收益率-2.18%
  • 年化收益率-0.44%
  • 基准收益率42.52%
  • 阿尔法-0.05
  • 贝塔0.0
  • 夏普比率-9.2
  • 收益波动率0.53%
  • 信息比率-0.32
  • 最大回撤2.18%
[2017-12-25 19:35:35.870738] INFO: bigquant: backtest.v7 运行完成[11.845409s].