在Python中计算复合的返回系列

Jas*_*pel 9 python list-comprehension time-series pandas

问候所有,我有两个系列的数据:每日原始股票价格回报(正或负浮动)和交易信号(买= 1,卖= -1,无交易= 0).

原始价格回报只是今天价格的对数除以昨天的价格:

log(p_today / p_yesterday)
Run Code Online (Sandbox Code Playgroud)

一个例子:

raw_return_series = [ 0.0063 -0.0031 0.0024 ..., -0.0221 0.0097 -0.0015]
Run Code Online (Sandbox Code Playgroud)

交易信号系列如下:

signal_series = [-1. 0. -1. -1. 0. 0. -1. 0. 0. 0.]
Run Code Online (Sandbox Code Playgroud)

根据交易信号获得每日回报:

daily_returns = [raw_return_series[i] * signal_series[i+1] for i in range(0, len(signal_series)-1)]
Run Code Online (Sandbox Code Playgroud)

这些每日回报可能如下所示:

[0.0, 0.00316, -0.0024, 0.0, 0.0, 0.0023, 0.0, 0.0, 0.0] # results in daily_returns; notice the 0s
Run Code Online (Sandbox Code Playgroud)

我需要使用daily_returns系列来计算复合的返回系列.但是,假设daily_returns系列中有0个值,我需要将"通过时间"的最后一个非零复合返回到下一个非零复合返回.

例如,我像这样计算复合回报(注意我将随着时间"向后"):

compound_returns = [(((1 + compounded[i + 1]) * (1 + daily_returns[i])) - 1) for i in range(len(compounded) - 2, -1, -1)]
Run Code Online (Sandbox Code Playgroud)

以及结果清单:

[0.0, 0.0, 0.0023, 0.0, 0.0, -0.0024, 0.0031, 0.0] # (notice the 0s)
Run Code Online (Sandbox Code Playgroud)

我的目标是将最后的非零回报继续累积这些复合回报.也就是说,由于索引i处的返回取决于索引i + 1处的返回,因此索引i + 1处的返回应该是非零的.每次列表理解在daily_return系列中遇到零时,它基本上都会重新启动.

Mik*_*ton 8

有一个名为pandas的奇妙模块是由AQR(对冲基金)的一个人编写的,擅长这样的计算......你需要的是一种处理"缺​​失数据"的方法......正如上面提到的那样,基础知识正在使用scipy或numpy的nan(不是数字)功能; 然而,即使是那些库也不会使财务计算变得更容易......如果你使用pandas,你可以标记你不想要考虑的数据nan,然后任何未来的计算将拒绝它,同时执行正常操作其他数据.

我在我的交易平台上使用熊猫大约8个月......我希望我早点开始使用它.

Wes(作者)在pyCon 2010上发表了关于模块功能的演讲......请参阅pyCon 2010网页上的幻灯片和视频.在该视频中,他演示了如何获得每日回报,在返回矩阵(在几分之一秒内),时间戳/图表数据上运行1000次线性回归...所有这些都是通过此模块完成的.结合psyco,这是一个财务分析工具的野兽.

它处理的另一件好事是横截面数据...所以你可以抓住每日收盘价,滚动价格等等......然后 计算每一次计算的时间戳,并将所有这些存储在类似于python字典的内容中(参见pandas.DataFrameclass)...然后您可以像访问以下内容一样访问数据切片:

close_prices['stdev_5d']
Run Code Online (Sandbox Code Playgroud)

有关计算滚动stdev(它是单行)的更多信息,请参阅pandas滚动时刻doc.

由于我的分析要求,Wes已经不遗余力地使用cython来加速模块,尽管我会承认我正在考虑升级我的服务器(一个较旧的Xeon).

编辑STRIMP的问题: 在您将代码转换为使用pandas数据结构之后,我仍然不清楚您如何在大熊猫数据框中索引数据以及复合函数处理丢失数据的要求(或者就此而言的条件) 0.0返回...或者如果您NaN在熊猫中使用..).我将演示使用我的数据索引...随机选择一天... df是一个ES期货报价的数据框...每秒索引...缺少报价填写numpy.nan.DataFrame索引是datetime对象,由pytz模块的时区对象偏移.

>>> df.info
<bound method DataFrame.info of <class 'pandas.core.frame.DataFrame'>
Index: 86400 entries , 2011-03-21 00:00:00-04:00 to 2011-03-21 23:59:59-04:00
etf                                         18390  non-null values
etfvol                                      18390  non-null values
fut                                         29446  non-null values
futvol                                      23446  non-null values
...
>>> # ET is a pytz object...
>>> et
<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>
>>> # To get the futures quote at 9:45, eastern time...
>>> df.xs(et.localize(dt.datetime(2011,3,21,9,45,0)))['fut']
1291.75
>>>
Run Code Online (Sandbox Code Playgroud)

举一个简单的例子说明如何计算连续回报列(在a中pandas.TimeSeries),它在10分钟前引用了引用(并填写了缺失的刻度),我会这样做:

>>> df['fut'].fill(method='pad')/df['fut'].fill(method='pad').shift(600)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,不需要lambda,只需在600秒前将值列除以自己.那.shift(600)部分是因为我的数据每秒被索引.

HTH,\迈克