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

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

(以下练习题来源于《统计学—基于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轴分布,但呈现出了有规律的分布,表明所选的模型也是不合适的。


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/778295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数的排列组合公式C代码

我们知道,计算排列A(n,m)和组合C(n,m)可以用先求阶乘的方式实现,但是当数很大时求阶乘很容易溢出,所以这里给出非阶乘的方式求排列组合 求排列 分母和分子可以抵消,最后代码如下 unsigned long long A(int n, int m) {unsigned…

代码随想录-Day49

300. 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的 …

进程控制-fork函数

一个进程,包括代码、数据和分配给进程的资源。 fork ()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同…

第十六章 Qt的文件处理操作详解

目录 一、基本文件操作 二、二进制文件读写 三、文本文件读写 四、操作例子 1、QTextStream的流操作符 一、基本文件操作 文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库,提供了跨平台的文件操作能力。在所有的 I/O 设备中,文件 I/O 是最重要的部分之…

InfluxDB时序数据库基本使用介绍

1、概要介绍 1.1、时序数据库使用场景 所谓时序数据库就是按照一定规则的时间序列进行数据读写操作的数据库。它们常被用于以下业务场景: 物联网IOT场景:可用于IOT设备的指标、状态监控数据存取。IT建设场景:可用于服务器、虚拟机、容器的…

linux下的网络编程

网络编程 1. 网络基础编程知识1.1网络字节序问题1.2 常用socket编程接口1.2.1 sockaddr1.2.2 ip地址转换函数1.2.4 socket()1.2.3 bind()1.2.4 listen()1.2.5 accept()1.2.6 connect() 1.3 以udp为基础的客户端连接服务器的demo1.4 以udp为基础的的服务器聊天室功能demo1.5 基于…

解决vscode配置C++编译带有中文名称报错问题

在新电脑上安装vscode运行带有中文路径和中文名称的C代码时遇到报错 根据别人的教程将laugh.json文件中"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",改成了"program": "${fileDirname}\\output\\test.exe",&#x…

聊天广场(Vue+WebSocket+SpringBoot)

由于心血来潮想要做个聊天室项目 ,但是仔细找了一下相关教程,却发现这么多的WebSocket教程里面,很多都没有介绍详细,代码都有所残缺,所以这次带来一个比较完整得使用WebSocket的项目。 目录 一、效果展示 二、准备工…

大数据中的常见数据问题:独断脏

想象你刚刚入职一家声称正在进行"数字化转型"的大型企业,担任大数据开发工程师。在入职的第一周,你满怀热情,迫不及待地想要大展拳脚,用你的技能来推动公司的数据驱动决策。 目录 大数据中的常见数据问题1. 独 - 数据孤岛2. 断 - 数据价值链断层3. 缺 - 标准、治理…

并口、串口和GPIO口区别

并口 并行接口,简称并口。并口采用的是25针D形接头。所谓“并行”,是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错,目前,并行接口主要作为打印机端口等。 并口的工作模式 …

ctfshow web 36d 练手赛

不知所措.jpg 没啥用然后测试了网站可以使用php伪达到目的 ?filephp://filter/convert.base64-encode/resourcetest/../index.<?php error_reporting(0); $file$_GET[file]; $file$file.php; echo $file."<br />"; if(preg_match(/test/is,$file)){inclu…

安全测试之使用Docker搭建SQL注入安全测试平台sqli-labs

1 搜索镜像 docker search sqli-labs 2 拉取镜像 docker pull acgpiano/sqli-labs 3 创建docker容器 docker run -d --name sqli-labs -p 10012:80 acgpiano/sqli-labs 4 访问测试平台网站 若直接使用虚拟机&#xff0c;则直接通过ip端口号访问若通过配置域名&#xff0…

【论文笔记】UniST:通用预训练城市时空预测模型

目录 写在前面1. 通用时空模型的挑战与能力特性2. 构建通用时空模型UniST2.1 大规模时空预训练2.2 时空知识规则引导提示学习 3. UniST的实验与分析3.1 模型预测效果3.2其他实验分析 写在前面 文章标题&#xff1a;UniST: A Prompt-Empowered Universal Model for Urban Spati…

基于SpringBoot+Vue的招生管理系统(带1w+文档)

基于SpringBootVue的招生管理系统(带1w文档&#xff09; 通过招生管理系统的研究可以更好地理解系统开发的意义&#xff0c;而且也有利于发展更多的智能系统&#xff0c;解决了人才的供给和需求的平衡问题&#xff0c;招生管理系统的开发建设&#xff0c;由于其开发周期短&…

linux centos 安装niginx并且添加ssl(https)模块

文章目录 前言一、nginx安装教程1.流程步骤 总结 前言 一、nginx安装教程 1.流程步骤 代码如下&#xff08;示例&#xff09;&#xff1a; 1.先下载linux安装包 2.解压安装命令 sudo tar -zxvf nginx-1.20.1.tar.gz3.进入解压后的目录 sudo cd nginx-1.20.14.安装 sudo y…

AntDesign上传组件upload二次封装+全局上传hook使用

文章目录 前言a-upload组件二次封装1. 功能分析2. 代码详细注释3. 使用到的全局上传hook代码4. 使用方式5. 效果展示 总结 前言 在项目中&#xff0c;ant-design是我们常用的UI库之一&#xff0c;今天就来二次封装常用的组件a-upload批量上传组件,让它用起来更方便。 a-uploa…

C++ | Leetcode C++题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; class Solution { public:int robRange(vector<int>& nums, int start, int end) {int first nums[start], second max(nums[start], nums[start 1]);for (int i start 2; i < end; i) {int temp second;second max(fi…

Nacos服务注册总流程(源码分析)

文章目录 服务注册NacosClient找看源码入口NacosClient服务注册源码NacosServer处理服务注册 服务注册 服务注册 在线流程图 NacosClient找看源码入口 我们启动一个微服务&#xff0c;引入nacos客户端的依赖 <dependency><groupId>com.alibaba.cloud</groupI…

工作两年后,我如何看待设计模式

在软件工程中&#xff0c;设计模式是经过反复验证的最佳实践&#xff0c;用于解决在软件设计中经常遇到的一类问题。它们为开发者提供了一种通用的解决方案和语言&#xff0c;使得复杂的编程问题得以简化&#xff0c;代码结构更加清晰&#xff0c;可维护性大大提高。简而言之&a…

PostgreSQL 如何优化存储过程的执行效率?

文章目录 一、查询优化1. 正确使用索引2. 避免不必要的全表扫描3. 使用合适的连接方式4. 优化子查询 二、参数传递1. 避免传递大对象2. 参数类型匹配 三、减少数据量处理1. 限制返回结果集2. 提前筛选数据 四、优化逻辑结构1. 分解复杂的存储过程2. 避免过度使用游标 五、事务处…