生生不息

生生不息

AI修正时间序列的不平稳性

2025-06-27
AI修正时间序列的不平稳性

提示词

# Python代码
# 导入statsmodels中的adfuller方法
from statsmodels.tsa.stattools import adfuller

# 对北京碳排放权交易成交价进行ADF检验
result = adfuller(df['成交价'])

# 输出结果
print('ADF统计量:', result[0])
print('p值:', result[1])
print('滞后阶数:', result[2])
print('观察到的值比临界值低的百分比:', result[4])

# Python代码
# 导入kpss方法
from statsmodels.tsa.stattools import kpss

# 仍然使用北京碳排放权交易数据实验
result = kpss(df['成交价'])

print('KPSS统计量: ', result[0])
print('p值: ', result[1])
print('滞后阶数: ', result[2])
print('观察到的值比临界值高的百分比: ', result[3])

现在需要对之前用过的DataFrame中的成交价进行平稳性处理,尝试计算对数收益,并对处理后的数据重新使用ADF和KPSS检验,请给出示例代码。

答案

import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller, kpss

# 1. 计算对数收益率
df['对数收益率'] = np.log(df['成交价'] / df['成交价'].shift(1))

# 删除第一个NaN值(因为shift操作产生的)
df = df.dropna(subset=['对数收益率'])

# 2. 对处理后的数据进行ADF检验
def adf_test(series):
    """执行ADF检验并格式化结果"""
    result = adfuller(series.dropna())
    adf_stat = result[0]
    p_value = result[1]
    critical_values = result[4]
  
    # 判断结论
    conclusion = "拒绝原假设,序列平稳" if p_value < 0.05 else "无法拒绝原假设,序列非平稳"
  
    return pd.Series({
        'ADF统计量': round(adf_stat, 4),
        'p值': round(p_value, 4),
        '1%临界值': round(critical_values['1%'], 4),
        '5%临界值': round(critical_values['5%'], 4),
        '10%临界值': round(critical_values['10%'], 4),
        '结论': conclusion
    })

# 执行ADF检验
adf_result_log = adf_test(df['对数收益率'])
print("对数收益率的ADF检验结果:")
print(adf_result_log.to_string())

# 3. 对处理后的数据进行KPSS检验
def kpss_test(series, regression_type='c'):
    """执行KPSS检验并格式化结果"""
    result = kpss(series, regression=regression_type, nlags='auto')
    statistic = result[0]
    p_value = result[1]
    critical_values = result[3]
  
    # 判断结论
    conclusion = "拒绝原假设,序列非平稳" if p_value < 0.05 else "无法拒绝原假设,序列平稳"
  
    return pd.Series({
        'KPSS统计量': round(statistic, 4),
        'p值': round(p_value, 4),
        '10%临界值': round(critical_values['10%'], 4),
        '5%临界值': round(critical_values['5%'], 4),
        '2.5%临界值': round(critical_values['2.5%'], 4),
        '1%临界值': round(critical_values['1%'], 4),
        '结论': conclusion
    })

# 执行KPSS检验(金融数据推荐使用趋势平稳性检验)
kpss_result_log = kpss_test(df['对数收益率'], regression_type='ct')
print("\n对数收益率的KPSS检验结果:")
print(kpss_result_log.to_string())

# 4. 可视化原始价格与对数收益率
import matplotlib.pyplot as plt
plt.figure(figsize=(14, 10))

# 原始价格序列
plt.subplot(2, 1, 1)
plt.plot(df.index, df['成交价'], 'b-')
plt.title('原始成交价序列')
plt.ylabel('价格')
plt.grid(alpha=0.3)

# 对数收益率序列
plt.subplot(2, 1, 2)
plt.plot(df.index, df['对数收益率'], 'g-')
plt.title('对数收益率序列')
plt.ylabel('对数收益率')
plt.grid(alpha=0.3)

plt.tight_layout()
plt.show()

# 5. 综合判断平稳性(结合ADF和KPSS结果)
def combined_stationarity(adf_result, kpss_result):
    """综合判断平稳性结果"""
    adf_stationary = adf_result['结论'].startswith("拒绝")
    kpss_stationary = kpss_result['结论'].startswith("无法")
  
    if adf_stationary and kpss_stationary:
        return "强平稳证据:ADF和KPSS结果一致表明序列平稳"
    elif not adf_stationary and not kpss_stationary:
        return "强非平稳证据:ADF和KPSS结果一致表明序列非平稳"
    elif not adf_stationary and kpss_stationary:
        return "趋势平稳:建议进行去趋势处理"
    else:
        return "差分平稳:建议进行差分处理"

# 输出综合结论
conclusion = combined_stationarity(adf_result_log, kpss_result_log)
print("\n平稳性综合结论:", conclusion)

代码都是ai写的。

结果: