首页 > 解决方案 > 带日期的 Python EWMA

问题描述

我有一个看起来像这样的数据框:

Date    AAPL    TSLA    NESN    FB  ROCH    TOT VISA    JPM
2/1/2019    0.00259 0.00164 0.00122 0.00179 0.00116 0.00023 0.00145 0.00141
3/1/2019    -0.09961    -0.03147    0.02545 -0.02904    0.02241 0.00227 -0.03604    -0.02215
4/1/2019    0.04269 0.0577  0.01679 0.04714 0.01017 0.0293  0.04308 0.03687
7/1/2019    -0.00223    0.05436 -0.01053    0.00072 -0.00881    -0.00184    0.01803 0.0007
8/1/2019    0.01906 0.00116 0.00314 0.03245 0.02633 -0.00313    0.00544 -0.00189
9/1/2019    0.01698 0.00948 0.00928 0.01193 0.00093 0.02196 0.01177 -0.00169
10/1/2019   0.0032  0.01902 0.00776 -0.00021    0.00679 -0.00758    0.00188 -1.00E-04
11/1/2019   -0.00982    0.00664 0.00142 -0.00277    -0.00583    -0.01947    -0.0044 -0.00478
14/1/2019   -0.01504    -0.03703    -0.00095    0.01106 -0.00247    0.00761 -0.00695    0.01031
15/1/2019   0.02047 0.02999 0.00308 0.02449 0.00495 -0.00902    0.00175 0.00733
16/1/2019   0.01222 0.0047  -0.00803    -0.00947    -0.00154    -0.0039 0   0.00806
17/1/2019   0.00594 0.00364 0.00607 0.00515 -0.00062    0.00299 -0.00044    0.0041

我想最终得到一个由 EWMA(lambda:0.94)组成的数组,用于我考虑的每只股票,作为我时间序列的最后一天。我能够使用常规升序索引(0、1、2、3 等)来获得它,但是在处理日期时遇到了问题。

谢谢你的帮助。

标签: pythonpandas

解决方案


首先,我创建了数据框;将日期更改为类型日期时间;并将 Date 设为索引:

from io import StringIO
import pandas as pd

data = '''Date    AAPL    TSLA    NESN    FB  ROCH    TOT VISA    JPM
2/1/2019    0.00259 0.00164 0.00122 0.00179 0.00116 0.00023 0.00145 0.00141
3/1/2019    -0.09961    -0.03147    0.02545 -0.02904    0.02241 0.00227 -0.03604    -0.02215
4/1/2019    0.04269 0.0577  0.01679 0.04714 0.01017 0.0293  0.04308 0.03687
7/1/2019    -0.00223    0.05436 -0.01053    0.00072 -0.00881    -0.00184    0.01803 0.0007
8/1/2019    0.01906 0.00116 0.00314 0.03245 0.02633 -0.00313    0.00544 -0.00189
9/1/2019    0.01698 0.00948 0.00928 0.01193 0.00093 0.02196 0.01177 -0.00169
10/1/2019   0.0032  0.01902 0.00776 -0.00021    0.00679 -0.00758    0.00188 -1.00E-04
11/1/2019   -0.00982    0.00664 0.00142 -0.00277    -0.00583    -0.01947    -0.0044 -0.00478
14/1/2019   -0.01504    -0.03703    -0.00095    0.01106 -0.00247    0.00761 -0.00695    0.01031
15/1/2019   0.02047 0.02999 0.00308 0.02449 0.00495 -0.00902    0.00175 0.00733
16/1/2019   0.01222 0.0047  -0.00803    -0.00947    -0.00154    -0.0039 0   0.00806
17/1/2019   0.00594 0.00364 0.00607 0.00515 -0.00062    0.00299 -0.00044    0.0041
'''

df = pd.read_csv(StringIO(data), sep='\s+', engine='python')
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')
df = df.set_index('Date')

然后,我应用了这个ewm().mean()方法。您可以在 ewm() 方法中指定不同的参数,因为 span 可能不是您想要的

df.ewm(span=2).mean().iloc[-1]

AAPL    0.007770
TSLA    0.004901
NESN    0.002509
FB      0.003415
ROCH   -0.000471
TOT     0.000485
VISA   -0.000351
JPM     0.005281
Name: 2019-01-17 00:00:00, dtype: float64

最后,我相信它ewma()在 pandas 中已被弃用(我的示例已使用 pandas 1.0.5 进行了测试)。


推荐阅读