首页 > 编程语言 >Python统计实战:时间序列分析之一元线性回归预测和指数曲线预测

Python统计实战:时间序列分析之一元线性回归预测和指数曲线预测

时间:2024-07-06 15:56:14浏览次数:19  
标签:pre plt 预测 Python 残差 df 线性 model size

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能,从而更快地掌握解决问题所需的能力。

(以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。


练习题

下表是某只股票连续35个交易日的收盘价格(前3行和后3行)。

(1)分别采用m=5和m=10对收盘价格进行平滑,并绘制实际值和平滑值的图形进行比较。

(2)分别采用以下方法进行预测,并绘制预测图和残差图,对结果进行比较。

        (a)简单指数平滑和Holt指数平滑;
        (b)一元线性回归和指数曲线;
        (c)二阶曲线和三阶曲线。


图形绘制与分析

本文就(2b)题展开分析。

(2b)收盘价的一元线性回归预测

线性趋势(linear trend)是时间序列按一个固定的常数(不变的斜率)增长或下降。时间序列为线性趋势时,除了可以用Holt指数平滑模型进行预测外,还可以使用一元线性回归模型进行预测。

建立一元线性回归模型

import pandas as pd
from statsmodels.formula.api import ols
df = pd.read_csv('exercise11_1.csv')

#拟合一元线性回归模型(l_model)
l_model = ols('收盘价 ~ 时间', data = df).fit()
print(l_model.summary()) # 输出模型结果

由以上结果得到一元线性回归方程为:Yt=34.0158+(-0.0559)t。决定系数R2=61.3%,F检验的P=2.77e-08,表示模型显著。b1=-0.0559 ,表示时间每变动一期,收盘价平均变动-0.0559。

绘制预测图和残差图

# 绘制预测图和残差图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Songti SC']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('exercise11_1.csv')
#拟合一元线性回归模型(l_model)
l_model = ols('收盘价 ~ 时间', data = df).fit()
df_pre = pd.DataFrame({'时间':df['时间'], '收盘价':df['收盘价'], '预测值':l_model.fittedvalues, '预测残差':l_model.resid})

# 图(a)预测图
plt.subplots(1, 2, figsize = (11, 4))
plt.subplot(121)
l1 = plt.plot(df_pre['收盘价'], marker = 'o')
l2 = plt.plot(df_pre['预测值'], marker = '*', linewidth = 1, markersize = 8, ls = '-.')
plt.axvline(34, ls = '--', c = 'grey', linewidth = 1)
plt.xticks(range(0, 35, 2), df_pre['时间'][::2])
plt.xlabel('时间', size = 12)
plt.ylabel('收盘价', size = 12)
plt.legend(['收盘价', '预测值'], prop = {'size':11})
plt.title('(a)收盘价的一元线性回归预测', size = 13)

# 图(b)残差图
plt.subplot(122)
res = l_model.resid # 计算残差
plt.scatter(range(len(res)), res, marker = 'o', linewidth = 1)
plt.hlines(0, 0, 35, linestyle = '--', color = 'red', linewidth = 1)
plt.xlabel('时间', size = 12)
plt.xticks(range(0, 35, 2), df_pre['时间'][::2])
plt.ylabel('残差', size = 12)
plt.title('(b)一元线性回归预测残差', size = 13)

plt.tight_layout()

左图展示了收盘价的实际值和预测值,拟合结果并不理想。右图显示,残差围绕0轴分布,但呈现出了有规律的分布,表明所选的模型是不合适的。

(2b)收盘价的指数曲线预测

指数曲线(exponential curve)用于描述以几何级数递增或递减的现象,即时间序列的观测值Yt按指数规律变化,或者说逐期观测值按一定的增长率增长或衰减。

建立指数曲线模型

import pandas as pd
import numpy as np
from statsmodels.formula.api import ols
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Songti SC']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('exercise11_1.csv')

# 拟合指数曲线模型(e_model)
e_model = ols('np.log(收盘价) ~ 时间', data = df).fit()
print(e_model.summary()) # 输出模型结果

由以上结果得到指数曲线的方程为:Yt=3.5269exp(-0.0017t)。决定系数R2=60.9%,F检验的P=3.18e-08,表示模型显著。b1=-0.0017 ,表示时间每变动一期,收盘价平均变动-0.0017。

绘制预测图和残差图

# 绘制预测图和残差图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Songti SC']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('exercise11_1.csv')
# 拟合指数曲线模型(e_model)
e_model = ols('np.log(收盘价) ~ 时间', data = df).fit()
df_pre = pd.DataFrame({'时间':df['时间'], '收盘价':df['收盘价'], '预测值':np.exp(e_model.fittedvalues)})
# df_pre = df_pre.astype({'时间':int})

# 图(a)预测图
plt.subplots(1, 2, figsize = (11, 4))
plt.subplot(121)
l1 = plt.plot(df_pre['收盘价'], marker = 'o')
l2 = plt.plot(df_pre['预测值'], marker = '*', linewidth = 1, markersize = 8, ls = '-.')
plt.axvline(34, ls = '--', c = 'grey', linewidth = 1)
plt.xticks(range(0, 35, 2), df_pre['时间'][::2])
plt.xlabel('时间', size = 12)
plt.ylabel('收盘价', size = 12)
plt.legend(['收盘价', '预测值'], prop = {'size':11})
plt.title('(a)收盘价的指数曲线预测', size = 13)

# 图(b)残差图
plt.subplot(122)
df_pre['残差'] = df_pre['收盘价'] - df_pre['预测值'] # 计算残差
plt.scatter(range(len(df_pre['残差'])), df_pre['残差'], marker = 'o', linewidth = 1)
plt.hlines(0, 0, 35, linestyle = '--', color = 'red', linewidth = 1)
plt.xlabel('时间', size = 12)
plt.xticks(range(0, 35, 2), df_pre['时间'][::2])
plt.ylabel('残差', size = 12)
plt.title('(b)指数曲线预测残差', size = 13)

plt.tight_layout()

左图展示了收盘价的实际值和预测值,拟合结果不理想。右图显示,残差围绕0轴分布,但呈现出了有规律的分布,表明所选的模型也是不合适的。


都读到这里了,不妨关注、点赞一下吧!

标签:pre,plt,预测,Python,残差,df,线性,model,size
From: https://blog.csdn.net/lucasluy2020/article/details/140230261

相关文章

  • python-docx库 写入docx时中文不适配问题,中文异常问题解决办法。
    python-docx库写入docx时中文不适配问题,中文异常问题解决办法。通过以下方法可以成功将正文修改为宋体字体。这个是全文设置。fromdocx.oxml.nsimportqndoc=Document()doc.styles['Normal'].font.name=u'宋体'doc.styles['Normal']._element.rPr.rFonts.set(qn('w:......
  • 使用Python绘制甘特图
    使用Python绘制甘特图甘特图效果代码甘特图甘特图是一种项目管理工具,用于展示项目进度和任务安排。它通过条状图形表示各任务的起止时间,便于直观地查看项目的各个任务的进度和相互关系。效果[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(im......
  • 【BP时序预测】基于布谷鸟优化算法CS实现负荷数据预测单输入单输出附matlab代码
    %负荷数据预测单输入单输出(BP时序预测)%使用布谷鸟优化算法实现%假设你已经有了输入数据和对应的输出数据%输入数据应该是一个矩阵,每一行代表一个样本,每一列代表一个特征%输出数据应该是一个列向量,每个元素代表对应样本的输出%设置布谷鸟优化算法参数max_iter=......
  • 十分钟学习Python异常处理
    十分钟学习Python异常处理在编程过程中,错误和异常是不可避免的。Python提供了强大的异常处理机制,帮助我们捕获和处理运行时错误,使程序更加健壮和可靠。本文将带你在十分钟内快速掌握Python的异常处理基础知识。1.什么是异常?异常是指在程序运行过程中发生的错误,它会中断程序......
  • 一个基于Flask框架的Python Web应用程序
    dashboard.py主要实现了以下功能:1.用户注册与登录:提供了用户注册和登录的功能,用户的密码会被哈希处理后存储在users.json文件中。2.文件管理:实现了简单的文件管理功能,包括列出文件夹中的文件、上传文件和删除文件。只有管理员用户才能进行文件管理操作。3,路由定义:定义了......
  • 【python数据挖掘案列】利用线性回归(LR)实现天气变化的时间序列预测
    利用线性回归实现天气变化的时间序列预测一、引言天气预测一直是气象学和机器学习领域的重要研究内容。时间序列预测是其中的一种常见任务,旨在通过分析历史数据来预测未来的天气情况。在本文中,我们将使用线性回归模型来实现天气变化的时间序列预测,并介绍整个预测流程。二......
  • python 基于函数的API设计,理解接口与实现分离
    在Python中,基于函数的API设计中实现接口与实现分离是一种良好的编程实践,它可以提高代码的可维护性、可扩展性和可读性。接口:可以理解为一组定义好的函数签名,这些函数签名描述了函数的名称、参数以及返回值的类型,但不包含具体的实现逻辑。实现:则是针对接口中定义的函数......
  • python绘制一维离散点
    在Python中,绘制一维离散点通常意味着我们要在一条直线上标记出几个特定的点。这可以通过多种库来实现,但最常见和强大的库之一是matplotlib。以下是一个详细的代码示例,它展示了如何使用matplotlib库来绘制一维离散点,并且这个示例具有一定的参考价值和实际意义。1.绘制一维离散点......
  • 【模块二】Python进阶
    函数基础函数的本质就是一功能代码块组织在一个函数名下,可以反复调用1.去重函数可以减少代码的重复性。通过将重复的代码逻辑封装成函数。可以避免再不同的地方重复编写相同的代码**2.解耦**函数对代码的组织结构化可以将代码分成逻辑上独立的模块,提高代码的可读性和可维护......
  • 【模块三】Python高级
    面向对象基础类和对象概念面向对象编程(Object-OrientedProgramming,简称OOP)是一种编程范式。类是人们抽象出来的一个概念,所有拥有相同属性和功能的事物称为一个类;而拥有相同属性和功能的具体事物则成为这个类的实例对象。面向对象编程提供了一种从现实世界中抽象出概念和实体......