有不少同学对的出现类似上述的warning表示疑惑,在这里统一回复一下:
Ⅰ.???在position中不存在,为了保持兼容我们返回空的position对象
1,为什么出现上述warning呢?
这是因为当我们使用context.portfolio.positions(字典类型) 时查询了一个并不存在于于这个字典的标的持仓信息,为了兼容不报错才出现的警告。比如,我们的仓位中没有000001这只股票,当我们调用 context.portfolio.positions['000001.XSHE'] 时,就会提示 :
Security(code=000001.XSHE) 在 positions 中不存在, 为了保持兼容, 我们返回空的 Position 对象, amount/price/*g_cost 都是 0
(当然其他查询仓位信息的方法也会导致上边的问题,这里只举了一个最简单的例子)
这些警告对策略本身运行并没有影响,但如果策略中有用到上述数据的有可能会引发逻辑上的问题(很小的可能性哦,和策略有关,一般可选择忽略)。
2, 如何避免看到此类警告呢?(非处女座请忽略)
在调用上述方法前 ,先判断标的是否存在于上述对象中
if stock in context.portfolio.positions.keys(): print context.portfolio.positions[stock]
3,卖出仓位中的所有标的:
for stock in context.portfolio.positions.keys(): order_target(stock,0)
Ⅱ.下单数量为0,订单取消/目标数量已经满足, 没有提交委托
一般有以下几种原因,并会在日志中提醒:
1, 使用了order_target或者order_target_value进行下单,仓位中标的的数量已经等于预期的数量,所以订单取消。
2, 下单的手数或下单所用的资金不足一手,调整为0,订单取消
3, 累计成交量为0,停牌,退市,未上市等原因