求助:在spmvg nfoursid中输入时间序列DataFrame做N4SID估计报错
解决spmvg nfoursid处理AAPL对数收益率的报错问题
1. 修复NFourSID初始化的TypeError
错误原因
NFourSID构造函数要求第一个参数必须传入包含所有数据的DataFrame,output_columns和input_columns得传列名(字符串/字符串列表),不是DataFrame对象。你之前把AAPL(整个DataFrame)传给input_columns、空DataFrame传给output_columns,完全不符合参数要求,才触发这个报错。
正确写法
你的数据只有对数收益率(无外部输入变量),所以input_columns设为空列表,output_columns指定列名即可:
# 先清理数据:去掉对数收益率第一行的NaN AAPL = AAPL.dropna() # 正确初始化NFourSID nfoursid = NFourSID( dataframe=AAPL, output_columns=['Log Return'], input_columns=[], # 无输入变量,设为空列表 num_block_rows=10 )
2. 解决StateSpace相关的ValueError和TypeError
错误原因
ValueError:StateSpace期望的输入维度和你传入的实际维度不匹配,大多是因为你硬塞了输入参数,但你的数据根本没有输入变量;TypeError: 'DataFrame' object is not callable:你大概率把DataFrame变量名当成函数调用了(比如写了AAPL()而不是AAPL)。
正确使用方式
建议通过NFourSID的estimate方法自动生成StateSpace模型,不要手动构造(除非你明确知道各矩阵的维度):
# 执行N4SID辨识,n是状态空间维度(可根据需求调整,比如设为2) state_space = nfoursid.estimate(n=2) # 查看模型参数 print('状态转移矩阵A:\n', state_space.a) print('输出矩阵C:\n', state_space.c)
如果一定要手动构造无输入的StateSpace,要确保输入相关的矩阵为空:
# 示例:构造2维状态的无输入模型 a = np.random.randn(2, 2) # 状态转移矩阵 c = np.random.randn(1, 2) # 输出矩阵 state_space = StateSpace(a, np.array([]), c, np.array([]))
原官方文档核心内容翻译(Overview.ipynb)
- NFourSID用于多变量输入输出系统的子空间辨识,输入必须是包含所有输入、输出列的DataFrame;
num_block_rows参数决定辨识用的块Hankel矩阵行数,一般设为数据长度的1/5到1/10;estimate(n)里的n是状态空间维度,可通过奇异值分解结果确定合适的值;- 无输入的单变量时间序列场景,需将
input_columns设为空列表,此时模型等价于ARMA类状态空间模型。
内容的提问来源于stack exchange,提问作者real_kampffisch
相关产品推荐
相关产品推荐

