1、数据S&P500的收盘价格,return=100*log(pt/pt-1)
方法1:用python代码
import numpy as np
import pandas as pddef calculate_log_returns(prices):"""计算价格序列的对数收益率。参数:prices (numpy.array): 价格序列。返回:log_returns (numpy.array): 对数收益率序列。"""# 确保输入是NumPy数组prices = np.array(prices)# 计算连续价格之间的比率price_ratios = prices[1:] / prices[:-1]# 计算对数收益率log_returns = 100 * np.log(price_ratios)return log_returns# 读取CSV文件
df = pd.read_csv('sp500.csv')# 假设第二列的名字是"closing"(根据你的描述)
closing_prices = df['closing']# 计算对数收益率
log_returns_np = calculate_log_returns(closing_prices)
# 因为这个对数收益率直接输出是numpy数组,没办法直接用to_csv# 将NumPy数组转换为Pandas Series
log_returns_series = pd.Series(log_returns_np)# 如果需要将这一列保存到新的CSV文件中
log_returns_series.to_csv('Sp500-return.csv', index=False, header=["Log_Returns"])
方法2:用matlab软件,关于return的计算在lbtest.m代码里面。这里不重点说。
2、matlab的一些基本描述性代码
x=[ ] 里面粘贴上SP500的收盘价格时间序列,其实就是下面的SP500.mat
命令行窗口输入:最小值:min(x)最大值:max(x)平均值:mean(x)标准差:std(x)峰度:skewness(x)偏度:kurtosis(x)
例子:
S&P500 | |
Min | -0.0947 |
Max | 0.1096 |
Mean | 0.00022728 |
Std | 0.0123 |
Skewness | -0.2295 |
Kurtosis | 10.6859 |
3、matlab进行Jarque-Bera、Q(20)=Ljung-Box Q-test、ARCH、KPSS、ADF检验的代码
3.1 matlab进行Jarque-Bera test
目的:总体分布的正态性检验
返回值:h=0 接受x服从正态分布的假设;h=1 拒绝该假设
jbtest - Jarque-Bera test - MATLAB - MathWorks 中国
以alpha (默认0.05)显著水平对数据x进行Jarque-Bera检验[h,pValue,jbstat,cValue]=jbtest (x,alpha)
Function | 描述 |
jbtest | 测试样本是否来自均值和方差未知的正态分布,而不是来自正态分布。 |
这个表格来自于Matlab官网搜索“Available Hypothesis Tests”里。
https://ww2.mathworks.cn/help/stats/jbtest.html对于结果的输出情况:(1) h — Hypothesis test result1 | 0假设检验结果,返回1或0。如果h=1,则表示在α显著性水平上拒绝了零假设。如果h=0,则表示在α显著性水平上未能拒绝零假设。(2)pValue:范围(0,1)内的标量值测试的p值,以(0,1)范围内的标量值返回。p是观察到检验统计量与零假设下的观察值一样极端或更极端的概率。较小的p值使人们对零假设的有效性产生怀疑。当p不在表列范围[0.001,0.50]内时,jbtest会发出警告,并返回最小或最大的表列值。在这种情况下,您可以使用mctol来计算更准确的p值。(3)jbstat--测试统计非负标量值Jarque-Bera检验的检验统计量,以非负标量值返回。(4) crival——临界值非负标量值在α显著性水平上,Jarque-Bera检验的临界值以非负标量值返回。如果alpha在[0.001,0.50]范围内,并且样本量小于或等于2000,则jbtest会在预计算值表中查找测试的临界值。如果使用mctol,jbtest将使用蒙特卡洛模拟确定测试的临界值。当jbstat>crival时,零假设被拒绝。
关于更多Jarque-Bera Test的知识
蒙特卡罗标准误差(Monte Carlo Standard Error)
蒙特卡洛标准误差是由于模拟p值而产生的误差。
蒙特卡洛标准误差计算如下:
其中,是假设检验的估计p值,mcreps是执行的蒙特卡洛复制次数。jbtest选择足够大的蒙特卡洛复制次数(mcreps),以使蒙特卡洛标准误差小于为mctol指定的值。
例子
[h,pValue,jbstat,cValue]=jbtest (returns,0.05)[h,pValue,jbstat,cValue]=jbtest (returns)这两个的结果是一样的,说明默认alph=0.05
S&P500 | |
Jarque-Bera | 12521.37*** |
3.2 matlab进行Ljung-Box Q-test
目的:检验残差自相关
返回值:h=1拒绝了零假设,并表明XX残差序列中滞后1到20中至少有一个显著自相关的证据是强有力的。
官网解释Ljung-Box Q-test (lbqtest)
# https://ww2.mathworks.cn/help/econ/lbqtest.html[h,pValue,stat,cValue] = lbqtest(res)# 返回测试的 p值,测试统计值,临界值
# 一般表格里面记录 测试统计值和p值就可以p<0.1, *
p<0.05, **
p<0.01, ***
例子
- 创建一个新的文件夹,自行命名
- 创建一个SP500.mat
3.然后是新建SP500.m,代码如下:
%%对数据向量进行Ljung Box Q检验load SP500;
%-load('SP500.mat');plot(SP500);
title('\bf SP500 Closing price');
ylabel('Closing Price');
xlabel('S&P500 Price Since January 3, 1997');%% 每次运行代码之前,命令行窗口clear
补充:这个图的横坐标、纵坐标的刻度都是可以调整的,有需要可留言。
4.新建lbtest.m,代码如下:
%%按照以下步骤对数据进行预处理:
%通过计算每日回报来稳定该系列。
%计算与平均回报的偏差。load SP500;returns = price2ret(SP500);
residuals = returns - mean(returns);%%测试残差序列是否存在1到20个滞后的显著自相关。返回测试决策、p值、测试统计量和临界值。[h,pValue,stat,cValue] = lbqtest(residuals);
运行出来的结果:
h=1和pValue=4.3887e-13拒绝了零假设,并表明S&P500收益残差序列中滞后1到20中至少有一个显著自相关的证据是强有力的。
S&P500 | |
Q(20) 就是 Ljung-Box 检验 | 102.5521*** |
我最终出来的结果,和原论文的值不是完全一样,有轻微的差异。但是,学会怎么做,才是我们的目的。
3.3 matlab进行ARCH(10) 检验
目的:剩余异方差的恩格尔检验
[h,pValue,stat,cValue] = archtest(res)
例子(ARCH的10怎么设定?未解决)
S&P500 | |
ARCH(10) | 219.4485*** |
了解更多archtest - Engle test for residual heteroscedasticity - MATLAB - MathWorks 中国
3.4 matlab进行KPSS 检验
KPSS(Kwiatkowski-Phillips-Schmidt-Shin)test 为了稳定性检验。
[h,pValue,stat,cValue] = kpsstest(x)
例子
命令行窗口clear
load returns
[h,pValue,stat,cValue] = kpsstest(returns)
S&P500 | |
KPSS | 0.0766 |
不知道为什么和图中的结果不一样,而且不能拒绝原假设。
Function | 描述 |
kruskalwallis | 测试多个样本是否都来自同一人群(或等效地,来自具有相同分布的不同人群),而不是都来自同一群人。 |
解释来自:Available Hypothesis Tests - MATLAB & Simulink - MathWorks 中国
3.5 matlab进行ADF 检验
ADF(Augmented Dickey-Fuller)对输入单变量时间序列中的单位根进行增强Dickey-Fuller检验,返回拒绝决定。
目的:稳定性检验
返回值:值1表示拒绝单位根零模型,支持替代模型。值0表示无法拒绝单位根空模型。
[h,pValue,stat,cValue] = adftest(x)alpha默认:0.05
例子
命令行窗口clear
load returns
[h,pValue,stat,cValue] = adftest(returns)
S&P500 | |
ADF | -76.2071*** |
了解更多:adftest - Augmented Dickey-Fuller test - MATLAB - MathWorks 中国