Matlab软件进行金融时间序列数据的描述性统计代码

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, ***

例子

  1. 创建一个新的文件夹,自行命名
  2. 创建一个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 中国

相关推荐
stm 学习ing37 分钟前
HDLBits训练6
经验分享·笔记·fpga开发·fpga·eda·verilog hdl·vhdl
stm 学习ing1 小时前
HDLBits训练4
经验分享·笔记·fpga开发·课程设计·fpga·eda·verilog hdl
炸毛的飞鼠1 小时前
汇编语言学习
笔记·学习
风无雨2 小时前
react杂乱笔记(一)
前端·笔记·react.js
胡西风_foxww2 小时前
【ES6复习笔记】Class类(15)
javascript·笔记·es6·继承··class·静态成员
2301_815389373 小时前
【笔记】下载mysql5.7
笔记
m0_748233885 小时前
黑马程序员JavaWeb开发教程(前端部分) ---笔记分享
前端·笔记
1101 11015 小时前
STM32-笔记10-手写延时函数(SysTick)
笔记·stm32·单片机
2401_858286115 小时前
117.【C语言】数据结构之排序(选择排序)
c语言·开发语言·数据结构·笔记·算法·排序算法
1101 11016 小时前
STM32-笔记8-433M点灯
笔记