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.mzph.cn/pingmian/42044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql数据库基础操作

Mysql数据库 基本概念 内核的作用:调用硬件资源 数据库的作用 使用数据库可以高效且条理分明地存储数据,使人们能够更加迅速、方便的管理数据。 数据、表、数据库 数据 描述事物的符号记录,包括数字,文字,图形&…

nginx的正向代理和反向代理以及tomcat

nginx的正向代理和反向代理: 正向代理以及缓存配置: 代理:客户端不再是直接访问服务端,通过代理服务器访问服务端。 正向代理:面向客户端,我们通过代理服务器的IP地址访问目标范围端。 服务端只知道代理…

开发个人Go-ChatGPT--3 服务拆分

开发个人Go-ChatGPT–3 服务拆分 个人Go-ChatGPT项目可拆分用户服务(user),AI模型服务(AiModel),… 每个服务都可以再分为 api 服务和 rpc 服务。api 服务对外,可提供给 app 调用。rpc 服务是…

如何利用算法优化广告效果

效果广告以超过67%的占比,成为了中国互联网广告预算的大头。在BAT、字节等大的媒体平台上,效果广告以CPC实时竞价广告为主。在这种广告产品的投放中,广告主或其代理公司通过针对每个广告点击出价,系统自动把这些点击出价换算成eCP…

Java + MySQL 实现存储完整 Json

Java MySQL 实现存储完整 Json 一、应用场景二、数据库配置三、后端代码配置1、maven 依赖2、实体类3、Service 实现类4、xml 文件 四、测试1、新增接口2、查询接口3、数据表内容 一、应用场景 将前端传过来的 Json 完整存储到 MySQL 中,涉及技术栈为 Java、MyBat…

揭秘 Vue 组件通信:构建响应式数据流

引言 Vue.js 的核心特性之一是其组件化架构。组件化开发是一种现代的前端开发模式,它鼓励开发者将用户界面拆分成独立的、可复用的组件。每个组件都有自己的逻辑和结构,使得代码更加模块化,易于维护和测试。 Vue 组件基础 组件的定义和用途…

从资金管理的角度 谈谈伦敦金投资技巧

刚进入伦敦金市场的时候,笔者认为技术分析是很重要的,所以将学习伦敦金投资技巧的精力全部投入到技术分析的学习中。经过一系列交易的亏损,笔者才发现,其实交易管理才是最重要的。如果管理得好,30%的胜率,投…

docker-compose部署node-exporter

一、安装 node_exporter:image: prom/node-exporter:v1.8.0container_name: node_exportervolumes:- /proc:/host/proc:ro- /sys:/host/sys:ro- /:/rootfs:ro# ports:# - 9100:9100environment:TZ: Asia/Shanghaicommand:- --path.procfs/host/proc- --path.rootfs/rootfs- -…

数据机构记录顺序表-笔记1

一、线性表的基本概念 数据元素:线性表中的基本单位,每个元素都是线性表的一部分。 数据项:数据元素的具体值。 存储位置:线性表中的元素在内存中的具体存储位置。 线性表按存储结构可以分为顺序表和链表两大类: 1.1…

嵌入式C语言面试相关知识——关键字(不定期更新)

嵌入式C语言面试相关知识——关键字 一、博客声明二、C语言关键字1、sizeof关键字2、static关键字3、const关键字4、volatile关键字5、extern关键字 一、博客声明 又是一年一度的秋招,怎么能只刷笔试题目呢,面试题目也得看,想当好厂的牛马其实…

快速上手指南:使用 Minikube 在本地运行 Kubernetes 集群

前言 Minikube 是一个开源工具,用于在本地运行 Kubernetes 集群。它提供了一种简单的方法来在本地开发和测试 Kubernetes 应用程序,而无需设置完整的 Kubernetes 集群。以下是 Minikube 的基本使用步骤: 安装 Minikube 安装依赖项 虚拟化…

java之静态方法

如果要在类中使用方法,就得需要将这个类实例化。有时候希望在不创建对象的情况下,通过类名直接调用某个方法,就得需要静态方法,要实现静态方法,只需要再成员方法前加上static关键字 静态方法也可以通过类名和对象访问…

Charles拦截发送数据包-cnblog

Charles拦截发送数据包 打开允许断点 右键要打断点的数据包,打断点 重新发请求进入断点模式 修改完毕后发送

拦截HTTP的多种方式

部分场景下需要修改请求报文信息,可以利用 AOP 思维(切面编程),对请求进行拦截处理。Web 中有见的几种发送请求的方式: XMLHttpRequestfetchwindow.navigator.sendBeaconnew Imageservice worker 针对这几种不同的场…

C++实现简化版Qt的QObject(3):增加父子关系、属性系统

前几天写了文章: C实现一个简单的Qt信号槽机制 C实现简化版Qt信号槽机制(2):增加内存安全保障 之后感觉还不够过瘾,Qt中的QObject体系里还有不少功能特性没有实现。为了提高QObject的还原度,今天我们将父子…

2024.06.29校招 实习 内推 面经

绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、实习 | 中国汽研2025届实习生招募 实习 | 中国汽研2025届实习生招募 2、开放周 | 航天513所暑期实践开放周邀请函 开放周 | 航天513所暑期实践开放周邀请函 3、开放日 | 中国电科第四…

vscode远程连接linux(配置免密)

远程连接 1.首先保证物理机和虚拟机网络可以ping通 2.查看ubuntu得ip地址 ifconfig IP为:192.168.52.133 3.连接远程主机 配置免密 1.打开cmd运行ssh-keygen -t rsa 一路回车就行 2.打开window文件夹C:\Users\xbj\.ssh 3.用记事本打开id_rsa.pub文件复制公…

LeetCode刷题之搜索二维矩阵

2024 7/5 一如既往的晴天,分享几张拍的照片嘿嘿,好几天没做题了,在徘徊、踌躇、踱步。蝉鸣的有些聒噪了,栀子花花苞也都掉落啦,今天给他剪了枝,接回一楼来了。ok,做题啦! 图1、宿舍…

数据结构之“栈”(全方位认识)

🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:数据结构 前言 栈是一种数据结构,具有" 后进先出 "的特点 或者也可见说是 ” 先进后出 “。大家一起加油吧冲冲冲!! …

玩转springboot之springboot注册servlet

springboot注册servlet 有时候在springboot中依然需要注册servlet,filter,listener,就以servlet为例来进行说明,另外两个也都类似 使用WebServlet注解 在servlet3.0之后,servlet注册支持注解注册,而不需要在…