1、数据S&P500的收盘价格,return=100*log(pt/pt-1)
方法1:用python代码
python
import numpy as np
import pandas as pd
def 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
Matlab
命令行窗口输入:
最小值: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 |
[S&P500描述性统计表]
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 中国
Matlab
以alpha (默认0.05)显著水平对数据x进行Jarque-Bera检验
[h,pValue,jbstat,cValue]=jbtest (x,alpha)
|----------|---------------------------------|
| Function | 描述 |
| jbtest | 测试样本是否来自均值和方差未知的正态分布,而不是来自正态分布。 |
这个表格来自于Matlab官网搜索"Available Hypothesis Tests"里。
Matlab
https://ww2.mathworks.cn/help/stats/jbtest.html
对于结果的输出情况:
(1) h --- Hypothesis test result
1 | 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指定的值。
例子
Matlab
[h,pValue,jbstat,cValue]=jbtest (returns,0.05)
[h,pValue,jbstat,cValue]=jbtest (returns)
这两个的结果是一样的,说明默认alph=0.05
|-------------|----------------|
| | S&P500 |
| Jarque-Bera | 12521.37*** |
[S&P500描述性统计表]
3.2 matlab进行Ljung-Box Q-test
目的:检验残差自相关
**返回值:**h=1拒绝了零假设,并表明XX残差序列中滞后1到20中至少有一个显著自相关的证据是强有力的。
Matlab
官网解释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,代码如下:
Matlab
%%对数据向量进行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,代码如下:
Matlab
%%按照以下步骤对数据进行预处理:
%通过计算每日回报来稳定该系列。
%计算与平均回报的偏差。
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*** |
[S&P500描述性统计表]
我最终出来的结果,和原论文的值不是完全一样,有轻微的差异。但是,学会怎么做,才是我们的目的。
3.3 matlab进行ARCH(10) 检验
目的:剩余异方差的恩格尔检验
Matlab
[h,pValue,stat,cValue] = archtest(res)
例子(ARCH的10怎么设定?未解决)
|----------|----------------|
| | S&P500 |
| ARCH(10) | 219.4485*** |
[S&P500描述性统计表]
了解更多archtest - Engle test for residual heteroscedasticity - MATLAB - MathWorks 中国
3.4 matlab进行KPSS 检验
KPSS(Kwiatkowski-Phillips-Schmidt-Shin)test 为了稳定性检验。
Matlab
[h,pValue,stat,cValue] = kpsstest(x)
例子
Matlab
命令行窗口
clear
load returns
[h,pValue,stat,cValue] = kpsstest(returns)
|------|---------|
| | S&P500 |
| KPSS | 0.0766 |
[S&P500描述性统计表]
不知道为什么和图中的结果不一样,而且不能拒绝原假设。
|-----------------------------------------------------------------------------------------|-------------------------------------------------|
| Function | 描述 |
| kruskalwallis | 测试多个样本是否都来自同一人群(或等效地,来自具有相同分布的不同人群),而不是都来自同一群人。 |
解释来自:Available Hypothesis Tests - MATLAB & Simulink - MathWorks 中国
3.5 matlab进行ADF 检验
ADF(Augmented Dickey-Fuller)对输入单变量时间序列中的单位根进行增强Dickey-Fuller检验,返回拒绝决定。
目的:稳定性检验
返回值: 值1表示拒绝单位根零模型,支持替代模型。值0表示无法拒绝单位根空模型。
Matlab
[h,pValue,stat,cValue] = adftest(x)
alpha默认:0.05
例子
Matlab
命令行窗口
clear
load returns
[h,pValue,stat,cValue] = adftest(returns)
|-----|----------------|
| | S&P500 |
| ADF | -76.2071*** |
[S&P500描述性统计表]
了解更多:adftest - Augmented Dickey-Fuller test - MATLAB - MathWorks 中国