我正在尝试使用 Pandas 在 Python 中实现考夫曼效率比 (ER)。
在 Pandas DataFrame 中,我有两列:
日期 关闭
2016-01-05 10310.10
2016-01-06 10214.02
2016-01-07 9979.85
2016-01-08 9849.34
2016-01-11 9825.07
2016-01-12 9985.43
2016-01-13 9960.96
2016-01-14 9794.20
我需要的是包含给定时期 n 的 ER 的第三列。
ER的定义:
ER = Direction / Volatility
Run Code Online (Sandbox Code Playgroud)
在哪里:
Direction = ABS (Close – Close[n])
Volatility = n * ? (ABS(Close – Close[1]))
n = The efficiency ratio period.
Run Code Online (Sandbox Code Playgroud)
这是 an=3 周期 ER 的示例(取自http://etfhq.com/blog/2011/02/07/kaufmans-efficiency-ratio/):
我正在苦苦挣扎的是如何用 Pandas 在 Python 中做到这一点?最后,根据上面的计算,我的数据框应该是这样的:
日期调整关闭 ER(3) 2016-01-04 10283.44 2016-01-05 10310.10 2016-01-06 10214.02 2016-01-07 9979.85 0.9 2016-01-08 9849.34 1.0 2016-01-11 9825.07 1.0 2016-01-12 9985.43 0.0 2016-01-13 9960.96 0.5 2016-01-14 9794.20 0.1
如何让 Pandas 回顾前 n 行以进行 ER 所需的计算?
任何帮助是极大的赞赏!先感谢您。短剑
无需编写滚动函数,只需使用diffand rolling_sum:
df['direction'] = df['Close'].diff(3).abs()
df['volatility'] = pd.rolling_sum(df['Close'].diff().abs(), 3)
Run Code Online (Sandbox Code Playgroud)
我认为代码是不言自明的。如果您需要解释,请告诉我。
In [11]: df['direction'] / df['volatility']
Out[11]:
0 NaN
1 NaN
2 NaN
3 1.000000
4 1.000000
5 0.017706
6 0.533812
7 0.087801
dtype: float64
Run Code Online (Sandbox Code Playgroud)
这看起来像你要找的东西。