quantopian系列—Algorithm( 五 )


查看投资组合状态
在重新平衡之前 , 您可能需要检查您已经持有哪些资产 。 您可以使用Portfolio的属性来查看您的投资组合的状态 。 例如 , 您可以使用context.portfolio.position访问您的算法的Position , 其中包含所有未平仓合约的字典 , 或者使用context.portfolio.cash查看您的投资组合中的当前现金量 。

  • 常见的再平衡问题
不可获得的资产
订购退市证券或在IPO前订购证券的行为会在回测中引发错误 。 Pipeline 只返回在每个模拟日在支持的交易所上市的资产 , 因此从pipeline_output()检索到的任何资产都应该是可以交易的 。 如果你是手动引用资产 , 你可能需要检查该资产是否仍然上市 。 要检查某项资产是否可以在算法中的某一点进行交易 , 使用can_trade()(如果该资产已经上市并至少交易过一次 , 则返回True) 。
陈旧的价格
Quantopian向前填充定价数据 。 然而 , 您的算法可能需要在下单之前知道某只股票的价格是否是最近一分钟的价格 。 如果资产是活的 , 但最新的价格是前一分钟的 , 那么is_stale()方法返回True 。
未完成的订单
您可以使用订单状态函数来获取订单的信息 。 例如 , 您可以通过调用get_order()查看特定订单的状态 , 或者通过调用get_open_orders()查看所有未结订单的列表 。 关于订单状态函数的完整列表 , 请参见 API 参考资料 。
所有未结订单在一天结束时都会被取消 , 无论是在回溯测试还是真实交易中 。 对于通过任何方式(使用Optimize API和手动订单方法)下的订单都是如此 。 您也可以在当天结束前使用cancel_order()取消订单 。
记录与绘图当你运行算法时 , 你可能想记录或绘制那些由backtester自动跟踪的指标以外的自定义指标 。
  • 记录
你的算法可以通过使用log.info()方法轻松生成日志输出 。 日志输出出现在IDE的右侧面板或完整回测结果页面的 "活动 "标签下 。
由于性能原因 , 日志记录是有速率限制的(节流) 。 基本限制是每次调用初始化时有两条日志信息 , 每分钟多两条日志信息 。 每个回溯测试有一个额外的20条日志消息的缓冲区 。 一旦超过限制 , 消息将被丢弃 , 直到缓冲区被清空 。 会显示一条消息 , 解释一些消息被丢弃的原因 。
下面是两个例子:
  1. 假设在initialize()中 , 你记录了22行 。 两行是允许的 , 再加上20条额外的日志信息 , 所以这是可行的 。 但是 , 第23行日志会被丢弃 。
  2. 假设每分钟运行一个定期函数 , 在该函数中 , 你记录了三行日志 。 每次调用定期函数时 , 允许记录两行 , 加上多出来的20行中的一行被消耗掉了 。 在第21次调用时 , 记录了两行 , 最后一行被丢弃 。 随后的日志行也会被丢弃 , 直到缓冲区被清空 。
此外 , 每个成员有一个总的日志限制 。 当回溯测试导致达到总限制时 , 最老的回溯测试的日志将被丢弃 。
  • 绘图
在你的算法中 , 这个应该放在哪里?调用record()的最佳位置是在一个定期函数中 。 例如记录自定义指标的算法 , 或者在每日再平衡函数的最后 。
在算法中 , 你有一些(有限的)绘图功能 。 使用record() , 您可以通过使用关键字参数传递系列名称和相应的值来创建时间系列图 。 在一个算法中 , 最多可以绘制五个日级粒度的系列图 。 然后 , 时间序列会显示在性能图下方的图表中(如果您点击 "构建算法" , 或者如果您运行完整的回溯测试 , 则显示在 "活动 "标签下) 。
在回溯测试中 , 会使用每天最后记录的值 。 因此 , 我们建议使用schedule_function()每天记录一次值 。
这个最小的例子记录并绘制了MSFT和AAPL每天收市时的价格:
quantopian系列—Algorithm文章插图
常见错误
  • 编写更快的算法
当你遵循最佳实践时 , Quantopian backtester将运行得最快 , 例如 。
使用Pipeline: Pipeline是Quantopian上访问数据的最有效方式 。 在可能的情况下 , 您应该使用Pipe来执行计算 , 以使您的反向测试尽可能快地运行 。
只有在您需要的时候才会访问分钟数据:您可以通过BarData方法访问分钟频率的价格和交易量数据 , 而且这些数据是按需加载的 。 当您调用数据时 , 您需要支付访问数据的性能成本 。 如果你的算法每分钟都要检查一个价格 , 那就会有性能成本 。 如果你不那么频繁地需要价格数据 , 减少要求它的频率会加快你的算法 。
避免 "for "循环:尽量使用向量化计算 , 而不是for循环 。 Quantopian上的大多数数据结构都支持矢量化计算 , 这通常比for循环快得多 。 在Quantopian上 , numpy数组和pandas数据结构是两个常见的支持向量化计算的实体 。