任务是使用自定义函数(panel_garch1)和Pandas'滚动应用',它使用另一个名为'arch'的包,用于预测波动率,首先让我们得到一些数据:
import numpy as np
from arch.univariate import GARCH, EGARCH, ConstantMean, Normal
import pandas as pd
from pandas.io.data import DataReader
aapl = DataReader('AAPL', 'yahoo', datetime(2006,1,1), datetime(2016,3,10))
returns = pd.DataFrame(np.diff(np.log(aapl['Adj Close'].values)))
returns.index = aapl.index.values[1:aapl.index.values.shape[0]]
returns.columns = ['AAPL Returns']
返回数据看起来像这样
2006-01-04 0.002939
2006-01-05 -0.007901
2006-01-06 0.025486
2006-01-09 -0.003282
2006-01-10 0.061328
2006-01-11 0.036906
2006-01-12 0.004638
2006-01-13 0.015305
2006-01-17 -0.010335
2006-01-18 -0.026557
2006-01-19 -0.042723
一个简单的函数'compute_mean'非常适用
def compute_mean(ret):
return np.mean(ret)
returns.rolling(center=False, window=12).apply(compute_mean)
现在我想在下面使用这个功能
def panel_garch1(df_ret):
ret = df_ret
am = ConstantMean(ret)
am.volatility = EGARCH(1, 0, 1)
am.distribution = Normal()
cond_vol = am.fit(update_freq=0, disp='off').conditional_volatility
return cond_vol
如果我只使用它,它可以正常工作,返回可以是数据帧或numpy数组
panel_garch1(returns)
然后,如果我尝试将其应用于滚动窗口,则无效
returns.rolling(center=False, window=12).apply(panel_garch1)
或
pd.rolling_apply(returns, 12, lambda x: panel_garch1(x))
熊猫会抱怨
TypeError: only length-1 arrays can be converted to Python scalars
这里有什么问题?我已经在stackoverflow上读过一些内容,比如here,但这些问题的答案并不适用于这种情况。非常感谢你!