我正试图计算个股的CAPE比率(链接如下,但你不太可能需要知道它来回答这个问题)。
链接到CAPE定义
我的数据框架有每股收益("EPS")和CPI("CPI值")的季度数据。我希望计算10年(40个季度)通货膨胀调整后的平均市盈率。对于新列的每一行,计算需要:
- a 40周期回顾
- 期初CPI与当期CPI之比(在每个回顾窗口开始时从1开始,并逐渐降低以考虑通货膨胀)
- 该CPI比率乘以当前EPS值
- 窗口 所有这些乘法的平均值
eg- CAPE on day i:
[我]=平均角((CPI (i - 40公路上啊)/CPI (i - 40公路上啊))* EPS (i - 40公路上啊)),(CPI (i - 40公路上啊)/CPI (i-39)) * EPS (i-39)……, (CPI[i-40]/CPI[i]) * EPS[i]))
似乎相当清楚,需要使用'滚动',可能与'agg'函数一起使用。
我正在努力做到这一点,因为计算需要数据框架的两列,而不是只有一个,我不确定如何在滚动函数中访问它们。
也不要认为'helper'列是有用的,因为每个回看窗口的值都会改变。
示例代码:
df = pd.DataFrame(index = range(100))
df['CPI Value'] = 1. + (df.index / 100.)
df['EPS'] = 10.
,这是我的非工作尝试:
df['CAPE'] = df.rolling(40).agg(lambda x: ((x['CPI Value'][0] / x['CPI Value']) * x['EPS']).mean())
无法让它与pandas一起工作,尽管它看起来相对微不足道,不断出现语法错误或没有传递正确的参数。
Numpy-extended的rolling_apply函数似乎已经工作了。
from numpy_ext import rolling_apply
def func(a,b): return np.mean((a.iloc[0] / a) * b)
df['inf_adj'] = rolling_apply(func, 40, df['CPI Value'], df['EPS'])