Python統計實戰:時間序列分析之簡單指數平滑和Holt指數平滑

為了解決特定問題而進行的學習是提高效率的最佳途徑。這種方法能夠使我們專注于最相關的知識和技能,從而更快地掌握解決問題所需的能力。

(以下練習題來源于《統計學—基于Python》。請在Q群455547227下載原始數據。


練習題

下表是某只股票連續35個交易日的收盤價格(前3行和后3行)。

(1)分別采用m=5和m=10對收盤價格進行平滑,并繪制實際值和平滑值的圖形進行比較。

(2)分別采用以下方法進行預測,并繪制預測圖和殘差圖,對結果進行比較。

  • (a)簡單指數平滑和Holt指數平滑;
  • (b)一元線性回歸和指數曲線;
  • (c)二階曲線和三階曲線。

圖形繪制與分析

鑒于篇幅原因,本文先就(1)題及(2a)題展開分析。

(1)計算m=5(5期移動平均)和m=10(10期移動平均)的移動平均

# 移動平均
import pandas as pd
df = pd.read_csv('exercise11_1.csv')
# df.head()
ma5 = df['收盤價'].rolling(window = 5, center = True).mean()  # 5期移動平均
ma10 = df['收盤價'].rolling(window = 10, center = True).mean()  # 10期移動平均
df_ma = pd.DataFrame({'時間':df['時間'], '收盤價':df['收盤價'], '5期移動平均':ma5, '10期移動平均':ma10})
round(df_ma,2)

顯示前20行:

繪制實際值和平滑值的折線圖

# 繪制實際值和平滑值的折線圖
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Songti SC']
plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize = (8, 5.5))
l1, = plt.plot(df_ma['收盤價'], linestyle = '-', marker = 'o', linewidth = 0.8)
l2, = plt.plot(df_ma['5期移動平均'], linestyle = '-', marker = '+', linewidth = 0.8)
l3, = plt.plot(df_ma['10期移動平均'], linestyle = '-', marker = '*', linewidth = 0.8)
plt.xticks(range(0, 36, 2), df['時間'][::2])
plt.legend(handles = [l1, l2, l3], labels = ['收盤價','5期移動平均', '10期移動平均'], loc = 'best', prop = {'size':10})
plt.xlabel('時間', size = 12)
plt.ylabel('收盤價', size = 12)

分析:移動間隔越長,曲線就越平滑。在實際應用中,可根據數據的波動情況和分析目的合理選擇移動間隔的長度。當數據量較大時,移動間隔可長一些。但如果數據是以固定長度的周期采集的,則移動間隔的長度最好與數據的采集周期一致,這樣可以有效去除序列中的隨機波動。比如,如果數據是按季節采集的,則移動間隔的長度應取4;如果數據是按月采集的,則移動間隔的長度應取12。

(2a)題的第一問要求進行簡單指數平滑預測
? 先建立模型并輸出相關參數信息
# 簡單指數平滑
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
plt.rcParams['font.sans-serif'] = ['Songti SC']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('exercise11_1.csv')# df.index = pd.date_range(start = '1', end = '35', freq = 'AS')# 擬合簡單指數平滑模型(alpha = 0.3)
model = SimpleExpSmoothing(df['收盤價']).fit(smoothing_level = 0.3, optimized = True)
model.params # 輸出模型參數

注:Smoothing_level:0.3為事先指定的平滑系數。initial_level:33.82為系統確定的初始平滑值。
接下來繪制實際值和擬合值圖
# 繪制實際值和擬合值圖
df['price_ses'] = model.fittedvalues
plt.figure(figsize = (7, 4.5))
l1, = plt.plot(df['收盤價'], linestyle = '-', marker = 'o', linewidth = 0.8)
l2, = plt.plot(df['price_ses'], linestyle = '--', marker = '*', linewidth = 0.8)
plt.legend(handles = [l1, l2], labels = ['收盤價', '擬合值'], loc = 'best', prop = {'size': 10})
plt.xlabel('時間', size = 12)
plt.ylabel('收盤價', size = 12)

上圖展示了收盤價的簡單指數平滑的擬合效果,可以觀察到預測模型看似較合適。后續觀察殘差圖做出判斷。
# 計算第36期的預測值
p_model = model.forecast(1) # 向后預測1期
p_model

計算結果:

繪制預測圖和殘差圖

# 繪制預測圖和殘差圖
import scipy
df = pd.read_csv('exercise11_1.csv')# 圖(a)預測圖
plt.subplots(1, 2, figsize = (11, 4))
plt.subplot(121)ax = df['收盤價'].plot(marker = 'o', linewidth = 0.8, color = 'black')  # 繪制實際值
ax.set_ylabel('收盤價', size = 12)
ax.set_xlabel('時間', size = 12)
model.forecast(1).plot(ax = ax, style = '--', marker = 'o', color = 'red')  # 繪制預測值# 計算置信區間并繪圖
simulations = model.simulate(nsimulations = 2, repetitions = 1000, error = 'add', random_errors = scipy.stats.norm) # 重復模擬100次,模擬步長為2
random_errors = 'bootstrap'
low_CI_95 = p_model-1.96*simulations.std(axis = 1)
high_CI_95 = p_model+1.96*simulations.std(axis = 1)
low_CI_80 = p_model-1.28*simulations.std(axis = 1)
high_CI_80 = p_model+1.28*simulations.std(axis = 1)plt.fill_between([36], low_CI_95, high_CI_95, alpha = 0.3, color = 'grey', linewidth = 20)
plt.fill_between([36], low_CI_80, high_CI_80, alpha = 0.3, color = 'blue', linewidth = 20)
plt.xlim(-1, 36)
plt.title('(a)收盤價的簡單指數平滑預測', size = 13)# 圖(b)殘差圖
res = model.resid
plt.subplot(122)
plt.scatter(range(len(res)), res, marker = 'o')
plt.hlines(0, 0, 35, linestyle = '--', color = 'red')
plt.xticks(range(0, 35, 2), df['時間'][::2])
plt.xlabel('時間', size = 12)
plt.ylabel('殘差', size = 12)
plt.title('(b)簡單指數平滑預測殘差', size = 13)plt.tight_layout()

分析:左圖中的折線圖是收盤價的實際值,紅色圓點是第36期的預測值,藍色和灰色區域是置信區間,其中的灰色區域是95%的置信區間,藍色是區域是80%的置信區間。 右圖的殘差圖顯示,殘差雖然圍繞0軸波動,但是呈現出U型的形態,表明采用簡單指數平滑預測模型可能是不合適的。

(2a)題的第二問要求進行Holt指數平滑預測

Holt指數平滑預測是以其提出者C.C.Holt 的名字命名的,通常簡稱 Holt 模型。當時間序列存在趨勢成分時,簡單指數平滑的預測值總是滯后于實際值。而Holt模型則改進了簡單指數平滑模型,它將趨勢成分也考慮造來,用平滑值對序列的線性趨勢進行修正,建立線性平滑模型進行預測。

先建立模型并輸出相關參數:

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.holtwinters import SimpleExpSmoothing, ExponentialSmoothing, Holt
plt.rcParams['font.sans-serif'] = ['Songti SC']
plt.rcParams['axes.unicode_minus'] = Falsedf = pd.read_csv('exercise11_1.csv')# 擬合Holt指數平滑模型(model_h)
model_h = Holt(df['收盤價']).fit(optimized = True)
model_h.params # 輸出模型系數

注:smoothing_level為系統確定的平滑指數α(反映隨機成分);smoothing_trend為系統確定的平滑系數β(反映趨勢成分);initial_level為初始平滑值;initial_trend為初始趨勢值。

?繪制實際值和擬合值圖

# 繪制實際值和擬合值圖
df['收盤價_holt'] = model_h.fittedvalues
plt.figure(figsize = (7, 4.5))
l1, = plt.plot(df['收盤價'], linestyle = '-', marker = 'o', linewidth = 1) # 實際值
l2, = plt.plot(df['收盤價_holt'], linestyle = '--', marker = '^', linewidth = 1) # 擬合值
plt.legend(handles = [l1, l2], labels = ['收盤價', '擬合值'], loc = 'best', prop = {'size': 10})
plt.xlabel('時間', size = 12)
plt.ylabel('收盤價', size = 12)
plt.title('收盤價的Holt指數平滑擬合', size = 13)

上圖展示了收盤價的Holt指數平滑的擬合效果,從擬合值和實際值的接近程度來看,預測模型比較理想。

# 計算第36期的預測值
model_h.forecast(1)

計算結果:

可以發現其計算結果與簡單指數平滑預測是不同的。

接下來繪制預測圖和殘差圖:

# 繪制預測圖和殘差圖
import scipy
df = pd.read_csv('exercise11_1.csv')# 圖(a)預測圖
plt.subplots(1, 2, figsize = (11, 4))
plt.subplot(121)ax = df['收盤價'].plot(marker = 'o', linewidth = 0.8, color = 'black')  # 繪制實際值
ax.set_ylabel('收盤價', size = 12)
ax.set_xlabel('時間', size = 12)
model_h.forecast(1).plot(ax = ax, style = '--', marker = 'o', color = 'red')  # 繪制預測值# 計算置信區間并繪圖
simulations = model_h.simulate(nsimulations = 2, repetitions = 1000, error = 'add', random_errors = scipy.stats.norm) # 重復模擬100次,模擬步長為2
#random_errors = 'bootstrap'
low_CI_95 = model_h.forecast(1)-1.96*simulations.std(axis = 1)
high_CI_95 = model_h.forecast(1)+1.96*simulations.std(axis = 1)
low_CI_80 = model_h.forecast(1)-1.28*simulations.std(axis = 1)
high_CI_80 = model_h.forecast(1)+1.28*simulations.std(axis = 1)plt.fill_between([36], low_CI_95, high_CI_95, alpha = 0.3, color = 'grey', linewidth = 20)
plt.fill_between([36], low_CI_80, high_CI_80, alpha = 0.3, color = 'blue', linewidth = 20)
plt.xlim(-1, 36)
plt.title('(a)收盤價的Holt指數平滑預測', size = 13)# 圖(b)殘差圖
plt.subplot(122)
res = model_h.resid
plt.scatter(range(len(res)), res, marker = 'o')
plt.hlines(0, 0, 35, linestyle = '--', color = 'red')
plt.xticks(range(0, 35, 2), df['時間'][::2])
plt.xlabel('時間', size = 12)
plt.ylabel('殘差', size = 12)
plt.title('(b)Holt指數平滑預測殘差', size = 13)plt.tight_layout()

分析:左圖中的折線是收盤價的實際值,紅色圓點是第36期的預測值,灰色和藍色區域是置信區間,其中灰色區域是95%的置信區間,藍色區域是80%的置信區間。 右圖的殘差圖顯示,殘差圍繞0軸隨機波動,無固定的模型,表明采用Holt指數平滑預測模型是合適的。


都讀到這里了,不妨關注、點贊一下吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40205.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40205.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40205.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

二維平面無中心點的聚類算法

問題描述 二維平面上有許多點p(x , y),按照彼此之間的歐式距離進行分為若干個集合。若點p1(x1, y1)與點p(x2, y2)之間距離小于d,則認為二者是鄰居。 算法思路 給數據集的點進行編號,順序遍歷這些點,找出當前點的鄰居,記住已經遍…

模具監視器的選擇要點介紹

模具監視器的選擇要點涉及多個方面,以確保其能夠滿足實際生產需求并提高生產效率。以下是一些關鍵的選擇要點: 一、性能和穩定性 監控精度:選擇模具監視器時,首先要考慮其監控精度,包括溫度、壓力、注射速度等參數的…

Debezium系列之:JVM參數詳解和Debezium集群JVM監控看板制作

Debezium系列之:JVM參數詳解和Debezium集群JVM監控看板制作 一、JVM參數詳解1.jvm_memory_bytes_used2.jvm_memory_bytes_committed3.jvm_memory_bytes_max4.jvm_memory_bytes_init5.jvm_memory_pool_bytes_used6.jvm_memory_pool_bytes_committed7.jvm_memory_pool_bytes_max…

金屬3D打印如何精準選材

隨著3D打印技術的飛躍發展,模具制造領域迎來了前所未有的創新機遇。在眾多3D打印技術中,SLM金屬3D打印以其精度高、復雜結構成型能力,成為眾多行業的優選。然而,金屬打印材料,如何精準選擇,以最大化滿足項目…

linux 內核打印log太多咋辦?

有時候發現,linux 內核打印太多消息了,對有用消息造成了干擾,如果你一個個源文件去關閉打印太麻煩了,有沒有一種更方便的方式來關閉這些消息呢? 對這個需求,內核提供了一個強大而又靈活的方式,…

開源 WAF 解析:選擇最適合你的防護利器

前言 隨著網絡安全風險的增加,Web 應用防火墻(WAF)成為保護網站和應用程序免受攻擊的關鍵工具。在眾多的選擇中,開源 WAF 以其靈活性、可定制性和成本效益備受青睞。本文將深入探討幾種主流開源 WAF 解決方案,幫助你選…

用html+css設計一個列表清單小卡片

目錄 簡介: 效果圖: 源代碼: 可能的問題: 簡介: 這個HTML代碼片段是一個簡單的列表清單設計。它包含一個卡片元素(class為"card"),內部包含一個無序列表(ul),列表項(li)前面有一個特殊的符號(△)。整個卡片元素設計成300px寬,150px高,具有圓角邊…

從0-1配置一個ROS項目

目標:從0-1配置一個ROS項目,實現hello,world打印,在此基礎上進行功能開發。 步驟1:創建工作空間: mkdir -p ros_workspace/src cd ros_workspace對工作空間進行初始化: catkin_make source devel/setup.…

20.【C語言】初識結構體(重要)

定義&#xff1a;由一批數據組合而成的結構型數據 作用&#xff1a;描述復雜對象&#xff0c;創建新的類型 格式&#xff1a; struct 對象 { …… } 介紹. 用法&#xff1a;結構體變量.成員變量 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> struct hotal…

代碼隨想錄訓練營Day57

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、X的平方根二、有效的完全平方數 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 今天是跟著代碼隨想錄刷題的第57天&#xff0c;繼…

Prompt-Free Diffusion: Taking “Text” out of Text-to-Image Diffusion Models

CVPR2024 SHI Labshttps://arxiv.org/pdf/2305.16223https://github.com/SHI-Labs/Prompt-Free-Diffusion 問題引入 在SD模型的基礎之上&#xff0c;去掉text prompt&#xff0c;使用reference image作為生成圖片語義的指導&#xff0c;optional structure image作為生成圖片…

安裝Linux虛擬機

點擊創建新的虛擬機 選擇高級 系統自定義推薦 選擇稍后安裝 選擇Linux 虛擬機命名并且選擇創建位置 系統自定義 系統自定義推薦 系統自定義推薦 選擇安裝好的iOS文件 點擊完成 選擇編輯虛擬機設置 進入后選擇第一個Install red hat enterprise 選擇常用語言 設置…

2024.8月28號杭州電商博覽會,在杭州國博舉辦

2024杭州電商新渠道博覽會暨集脈電商節 時間&#xff1a;2024年08月28-30日 地點&#xff1a;杭州國際博覽中心&#xff08;G20&#xff09; 主辦單位&#xff1a;浙江集脈展覽有限公司、杭州華維展覽有限公司 承辦單位&#xff1a;浙江集脈展覽有限公司 報名參展&#xf…

測試幾個 ocr 對日語的識別情況

測試幾個 ocr 對日語的識別情況 1. EasyOCR2. PaddleOCR3. Deepdoc&#xff08;識別pdf中圖片&#xff09;4. Deepdoc&#xff08;識別pdf中文字&#xff09;5. Nvidia neva-22b6. Claude 3.5 sonnet 識別圖片中的文字7. Claude 3.5 sonnet 識別 pdf 中表格8. OpenAI gpt-4o 識…

網頁計算器的實現

簡介 該項目實現了一個功能完備、交互友好的網頁計算器應用。只使用了 HTML、CSS 和 JavaScript &#xff0c;用于檢驗web前端基礎水平。 開發環境&#xff1a;Visual Studio Code開發工具&#xff1a;HTML5、CSS3、JavaScript實現效果 功能設計和模塊劃分 顯示模塊&#…

Bean類的設計規范:Bean規范

Bean規范 類要求必須含有無參&#xff0c;公共的構造方法屬性必須私有化&#xff0c;然后提供公共的 set 和 get 方法

anaconda命令大全

目錄 查看所有虛擬環境查看某虛擬環境安裝的包創建虛擬環境激活創建好的虛擬環境回到之前的環境刪除創建的虛擬環境查看conda所在的位置、虛擬環境位置等信息conda修改虛擬環境所在的位置 查看所有虛擬環境 conda env list查看某虛擬環境安裝的包 激活要查看的虛擬環境之后&a…

Android 性能優化之啟動優化

文章目錄 Android 性能優化之啟動優化啟動狀態冷啟動溫啟動熱啟動 耗時檢測檢測手段TraceView使用方式缺點 Systrace環境配置使用方式TraceView和Systrace比較 AOP統計耗時環境配置使用 優化白屏優化異步加載優化環境配置使用 延遲加載優化AppStartup 源碼下載 Android 性能優化…

Reid系列論文學習——無人機場景下基于 Transformer 的輕量化行人重識別

今天介紹的一篇論文是針對無人機場景下的行人重識別&#xff0c;論文題目為&#xff1a;"無人機場景下基于 Transformer 的輕量化行人重識別"。該論文針對無人機場景下行人呈現多角度多尺度的特點、以及傳統CNN網絡在行人重識別任務中受限于感受野和下采樣導致的無法…

力扣1895.最大的幻方

力扣1895.最大的幻方 求前綴和暴力枚舉幻方邊長 求行列前綴和 class Solution {public:int largestMagicSquare(vector<vector<int>>& grid) {int n grid.size() , m grid[0].size();vector<vector<int>> rowsum(n,vector<int>(m));for…