和python有关的工作_该课程如何工作?(与Quantopian,Python和Pandas有关)

classReversion(CustomFactor):"""

Here we define a basic mean reversion factor using a CustomFactor. We

take a ratio of the last close price to the average price over the

last 60 days. A high ratio indicates a high price relative to the mean

and a low ratio indicates a low price relative to the mean.

"""inputs=[USEquityPricing.close]window_length=60defcompute(self,today,assets,out,prices):out[:]=-prices[-1]/np.mean(prices,axis=0)

Reversion()似乎返回pandas.DataFrame,我完全不知道为什么。一方面,在那里inputs和window_length使用?到底是out[:]什么?

这种特定的行为是否特别与Quantopian或Python / Pandas有关?

解决方案

TL; DR

Reversion()不返回DataFrame,而是返回Reversion该类的实例,您可以将其视为执行尾随窗口计算的公式。您可以使用quantopian.algorithm.pipeline_output或来在特定时间段内运行该公式quantopian.research.run_pipeline,具体取决于您是编写交易算法还是在笔记本中进行离线研究。

该compute方法定义了Reversion实例计算的“公式”。它计算二维numpy价格数组的减少量,其中数组的每一行对应一天,数组的每一列对应股票。计算的结果是一维数组,其中包含每个股票的值,并将其复制到中out。out也是一个numpy数组。语法out[:] = 表示“将值从复制到out”。

compute将其结果直接写到输出数组中而不是简单地返回,因为这样做可以使CustomFactor基类确保输出具有正确的形状和dtype,这对于更复杂的情况而言可能并不重要。

通过覆盖输入而具有“返回”功能是不常见的,并且通常是非惯用的Python。我不建议您实施类似的API,除非您非常确定没有更好的解决方案。

链接的示例中的所有代码都是开源的,可以在Zipline中找到,Zipline是在其基础上构建Quantopian的框架。如果您对实现感兴趣,则可以从以下文件开始:

zipline/pipeline/engine.py

zipline/pipeline/term.py

zipline/pipeline/graph.py

zipline/pipeline/pipeline.py

zipline/pipeline/factors/factor.py

您还可以在此处找到有关Pipeline API的详细教程。

我认为您的问题有两种答案:

Reversion该类如何适应Zipline / Quantopian算法的较大框架?换句话说,“Reversion该类如何使用”?

预期输入Reversion.compute()什么,对这些输入执行什么计算?换句话说,“该Reversion.compute()方法具体做什么?

使用(1)中的某些上下文来回答(2)更容易。

Reversion该类如何使用?

Reversion是CustomFactorZiplinePipeline API的一部分的子类。Pipeline API的主要目的是使用户能够轻松地对多种数据源高效地执行某种特殊的计算。这种特殊的计算方式是横截面的尾随窗口计算,其形式为:

每天,对于某些数据源集,获取所有已知资产的最后N天数据,并应用归约函数为每个资产生成单个值。

一个非常简单的横截面尾随窗口计算将类似于“每日收市”,其形式为:

每天获取最后两天的收盘价,并为每种资产计算资产前一天的收盘价与其当前当前收盘价之间的百分比变化。

为了描述横截面尾随窗的计算,我们至少需要三部分信息:

计算对哪些数据(例如价格,数量,市值)进行运算?

计算在数据尾随窗口中运行多长时间(例如1天,20天,100天)?

计算对(1)和(2)描述的数据执行什么归约函数?

在CustomFactor类定义这些三条信息合并成一个单一的对象的API。

该inputs属性描述了执行计算所需的一组输入。在问题的摘录中,唯一的输入是USEquityPricing.close,表示我们只需要跟踪每日收盘价即可。但是,总的来说,我们可以要求任何数量的输入。例如,要计算VWAP(成交量加权平均价格),我们可以inputs = [USEquityPricing.close, USEquityPricing.volume]说要跟踪收盘价和日成交量。

该window_length属性描述执行计算所需的尾随数据的天数。在上面的代码段中,我们要求追踪60天的收盘价。

该compute方法描述了要执行的尾窗计算。在下面的部分中,我概述了如何compute执行其计算。到目前为止,足以知道它compute实际上是从一定数量的2维数组到单个1维数组的归约函数。

您可能会注意到,我们尚未定义可能要计算Reversion因子的实际日期集。这是设计使然,因为我们希望能够使用同一Reversion实例在不同的时间点执行计算。

Quantopian定义了两种用于计算表达式的APIReversion:一种设计用于实际交易算法的“在线”模式,一种设计用于研发的“批处理”模式。在这两种API中,我们首先构造一个Pipeline对象,该对象包含我们要执行的所有计算。然后,我们将管道对象馈入一个实际执行我们感兴趣的计算的函数中。

在批处理API中,我们调用run_pipeline传递管道,开始日期和结束日期。一个计算自定义因素的简单研究笔记本可能如下所示:

fromquantopian.pipelineimportPipeline,CustomFactorfromquantopian.researchimportrun_pipelineclassReversion(CustomFactor):# Code from snippet above.reversion=Reversion()pipeline=Pipeline({'reversion':reversion})result=run_pipeline(pipeline,start_date='2014-01-02',end_date='2015-01-02')do_stuff_with(result)

在交易算法中,我们通常对管道中最近计算出的值感兴趣,因此有一个稍微不同的API:我们在启动时将管道“附加”到我们的算法中,并在管道中请求管道的最新输出每天的开始。使用的简单交易算法Reversion可能看起来像这样:

importquantopian.algorithmasalgofromquantopian.pipelineimportPipeline,CustomFactorclassReversion(CustomFactor):# Code from snippet above.definitialize(context):reversion=Reversion()pipeline=Pipeline({'reversion':reversion})algo.attach_pipeline(pipeline,name='my_pipe')defbefore_trading_start(context,data):result=algo.pipeline_output(name='my_pipe')do_stuff_with(result)

了解上面两个例子的最重要的事情是简单构造一个实例Reversion不会执行任何计算。特别是,该行:

reversion=Reversion()

不会获取任何数据或调用compute方法。它只是创建Reversion该类的一个实例,该类知道它每天需要60天的收盘价来运行其compute功能。同样,USEquityPricing.close它不是DataFrame或numpy数组或类似的东西:只是一个哨兵值,描述了Reversion需要什么样的数据作为输入。

思考这一问题的一种方法是通过类比数学。的实例Reversion类似于执行计算的公式,并且USEquityPricing.close类似于该公式中的变量。

简单地写下公式不会产生任何值。它只是给我们一种方式说“如果为所有这些变量插入值,这就是如何计算结果”。

通过实际插入变量的值来获得具体的结果,这在我们调用run_pipeline或时发生pipeline_output。

那么,具体是Reversion.compute()做什么的呢?

双方run_pipeline并pipeline_output最终归结为调用PipelineEngine.run_pipeline,这是在实际计算发生。

从上面继续进行类比,如果reversion是一个公式,并且USEquityPricing.close是该公式中的变量,那么PipelineEngine是那位小学学生,其作业是查找变量的值并将其插入公式中。

当我们调用时PipelineEngine.run_pipeline(pipeline, start_date, end_date),引擎将遍历我们请求的表达式,加载这些表达式的输入,然后compute在每个交易日之间start_date和end_date加载的输入数据的适当切片之间调用每个表达式的方法一次。

具体来说,引擎希望每个表达式都有一个compute带有如下签名的方法:

defcompute(self,today,assets,out,input1,input2,...,inputN):

前四个参数始终相同:

self是有CustomFactor问题的实例(例如reversion,在上面的摘录中)。通常,这就是方法在Python中的工作方式。

today是表示compute要调用的日期的熊猫时间戳。

assets是一维numpy数组,其中包含上每个可交易资产的整数today。

out是与形状相同的一维numpy数组assets。的约定compute是应将其计算结果写入out。

其余参数是带有shape的二维numpy数组(window_length, len(assets))。这些参数中的每一个都对应于表达式inputs列表中的一个条目。在的情况下Reversion,我们只有一个输入,USEquityPricing.close因此只有一个额外的参数prices,该参数包含一个60 x len(assets)数组,其中包含存在的每种资产的60天尾随收盘价today。

的一个不寻常功能compute是,它希望将其计算结果写入out。通过更改输入使函数“返回”在C或Fortran等低级语言中很常见,但在Python中很少见,通常被认为是非惯用的。compute将其输出写入out部分原因是出于性能方面的考虑(在某些情况下,我们可以避免大阵列的额外复制),部分这样做是为了使CustomFactor实现者无需担心构造具有正确形状和dtypes的输出数组,这可能会很棘手在更复杂的情况下,用户具有多个返回值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值