quantopian系列—Algorithm( 三 )


许多滑点模型的行为取决于算法所捕获的总交易量的多少 。 你可以使用self.volume_for_bar()来查看当前证券在这一栏中到目前为止已经成交了多少股 。 如果你的算法在同一栏里对同一只股票有许多不同的订单 , 这对于确保你不会采取不切实际的大部分交易量是有用的 。
如果您的滑点模型没有对订单的全部金额进行交易 , 那么订单将以更新的金额值保持开放 , 并将在下一栏传递给process_order 。 限额未达到的订单将不会被传递给process_order 。 最后 , 如果你的交易只有0股或比原来的订单金额更多 , 将抛出一个异常 。
佣金
在Quantopian上 , 交易费用是通过佣金模式获取的 。 这个佣金模式会影响到回测中下单的成交率 。 美股订单的默认佣金模式是PerShare , 每股0.001美元 , 每个订单没有最低费用 。 第一次填单至少会产生最低佣金 , 后续填单会产生额外佣金 。
佣金从算法的可用现金中提取 。 无论您使用何种佣金模式 , 在任何补仓发生之前取消的订单都不会产生任何佣金 。
要覆盖默认的佣金模式 , 请使用set_commission()方法 , 并传入PerShare或PerTrade 。 像滑点模型一样 , set_commission()必须在initialize()方法中调用 。
您可以通过使用get_order()获取订单 , 然后查看它的佣金字段来查看与订单相关联的佣金数量 。

  • 手动资产查询
如果你想手动引用一个股票 , 你可以使用symbol()函数通过其股票代码或公司名称来查找一个证券 。
当使用 symbol()时 , 你需要考虑你的模拟日期 , 以确保股票代码指的是正确的股票--有时 , 股票代码会随着时间的推移而被重复使用 , 因为公司退市和新公司开始交易 。 例如 , G曾经指的是吉列 , 但现在指的是Genpact 。 如果一个股票代码被多个公司重用 , 使用set_symbol_lookup_date()来指定解决冲突时使用的日期 。 这个日期需要在调用symbol()之前设置 。
另一个手动引用资产的选项是使用 sid() 函数 。 在我们的系统中 , 所有证券都有一个独特的证券标识符(SID) 。 由于股票代码可以在不同的交易所之间重复使用 , 使用SID可以防止任何混淆 , 并确保无论模拟日期如何 , 您都能调用所需的资产 。 你可以使用sid()方法通过其ID、符号或名称来查找证券 。
当你使用symbol()或sid()函数时 , IDE将自动填充SID和符号 。
Quantopian的回溯测试器会尝试自动调整回溯测试的开始或结束日期 , 以适应正在使用的资产 。 例如 , 如果你想在2004年运行一个特斯拉的回溯测试 , 回溯测试会建议你从2010年6月28日开始 , 即该证券交易的第一天 。 当使用symbol()而不是sid.()时 , 这种能力会大大降低 。
symbol()和symbols()方法只接受字符串文字作为参数 。 sid()方法只接受一个整数字面作为参数 。 为了快速检索回测所需的数据 , 会代码进行静态分析 。
使用数据在算法中 , 有两种访问数据的方式 。
  1. Pipeline 。 比较常见的访问数据的方式是在算法中附加一个Pipeline , 每天检索输出 。 一旦你在算法中拥有了因子数据(由附加的Pipeline生成) , 你就可以用它来进行交易和组合构建决策 。
  2. BarData查找 。 除了使用pipeline , 你还可以使用内置的BarData对象(在定期函数中通过数据变量提供)查询分钟级的价格和成交量数据 。 BarData提供的方法可以让你在算法中查询当前和历史分钟频率数据 。
这两种在算法中使用数据的技术将在接下来的章节中详细介绍
  • 算法中使用Pipeline
正如本指南前面所讨论的那样 , Pipeline的目的是使定义和执行横截面跟踪窗口计算变得容易 。 一旦您在Research中开发了一个Pipeline , 您就可以将其附加到您的算法上 。 一旦您的Pipeline被附加到您的算法上 , 它就会被执行 , 并通过pipeline_output()为回测模拟中的每一天提供结果 。 Pipeline_output()可以在任何预定函数中调用 。
例如 , 下面的代码可以从以'my_pipeline'为名附加的Pipeline中获取输出 。
quantopian系列—Algorithm文章插图
pipeline_output()的返回值将是一个pd.DataFrame , 其列数与Pipeline定义中包含的列数相对应 , 并且每个资产在当天指定领域的支持交易所上市的资产为一行 。 此外 , 任何没有通过screen(如果提供了screen)的股票将从输出中省略 。
重要的是 , pipeline_output()返回的pd.DataFrame与Research中run_pipeline()返回的pd.DataFrame略有不同 。 研究中的Pipeline产生pd.MultiIndex数据帧 , 同时与第一级别指数对应模拟日期 , 第二级别指数对应股票对象 。 附属于算法的Pipeline有一个隐含的模拟日期等于当前最靠后的模拟日期 , 所以输出的数据帧有一个只包含股权对象的常规pd.Index 。