🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
目录
1.项目背景
2.数据集介绍
3.技术工具
4.实验过程
4.1导入数据
4.2数据探索
4.3数据可视化
4.4ADF检验
4.5构建SARIMA模型
源代码
1.项目背景
在当今日益复杂的金融市场环境中,对股票价格的准确预测成为了投资者、分析师以及市场研究机构关注的焦点。Netflix(NFLX)作为全球领先的流媒体娱乐服务提供商,其股价波动不仅反映了公司自身的经营状况,也深受市场环境、消费者偏好、技术革新等多重因素的影响。因此,开发一种能够有效预测Netflix股票未来趋势的模型,对于指导投资决策、优化风险管理具有重要意义。
随着数据科学和机器学习技术的快速发展,时间序列分析在股票预测领域的应用日益广泛。时间序列分析是一种基于时间序列数据的统计方法,旨在揭示数据随时间变化的规律和趋势。其中,SARIMA(Seasonal Autoregressive Integrated Moving Average)模型作为一种强大的时间序列预测工具,不仅考虑了数据间的自相关性和依赖性,还充分考虑了季节性因素对股价波动的影响。这对于Netflix这样的具有明显季节性特征的上市公司来说尤为重要。
Netflix的股价波动往往受到节假日、季度财报发布等季节性因素的影响。例如,在节假日期间,消费者可能更倾向于观看流媒体内容,从而带动Netflix的用户活跃度和收入增长;而在季度财报发布前后,市场对Netflix的盈利预期和业绩展望也会对其股价产生显著影响。因此,通过引入SARIMA模型来捕捉这些季节性因素对股价的影响,有望提高预测的准确性和可靠性。
综上所述,本研究旨在利用SARIMA时间序列模型对Netflix股票的未来趋势进行预测。通过对Netflix股价历史数据的分析,结合市场环境、公司基本面等因素,建立适合Netflix的SARIMA预测模型,以期为投资者提供有价值的参考信息,帮助他们做出更加明智的投资决策。
2.数据集介绍
该数据集对 Netflix 过去十年的股票表现进行了深入分析,并结合了众多技术指标来检查其价格波动。它包括记录日期和一些重要统计数据:每个交易日的开盘价、最高价、最低价和收盘价,以及交易量。它还包含 7 天和 14 天相对强度指数 (RSI) 等动量指标,以确定股票是否超买或超卖。还包括 7 天和 14 天的商品通道指数 (CCI),通过将当前价格与历史平均值进行比较,帮助识别短期和中期市场趋势。该数据集整合了 50 天和 100 天简单移动平均线 (SMA) 和指数移动平均线 (EMA),揭示了股票的趋势方向。其他重要指标包括移动平均收敛分歧 (MACD)、用于评估价格波动性的布林线、真实波动幅度以及 7 天和 14 天平均真实波动幅度 (ATR),这些指标可衡量市场波动性。该数据集旨在预测第二天的收盘价,使其成为预测 Netflix 股票未来走势的重要工具。
数据集中各变量含义如下:
date:日期
open:股票在交易日交易所开盘时首次交易的价格。
high:股票在交易日内交易的最高价格。
low:股票在交易日内交易的最低价格。
close:股票在交易日内交易的最终价格。
volume:一个交易日内交易的股票总数。
RSI_7 / RSI_14:相对强弱指数 (RSI) 是衡量价格变动速度和变化的动量振荡器。 RSI_7 和 RSI_14 分别表示在 7 天和 14 天内计算的 RSI。
CCI_7 / CCI_14:商品通道指数 (CCI) 是一种多功能指标,可用于识别新趋势或警告极端情况。 CCI_7 和 CCI_14 分别在 7 天和 14 天内计算。
SMA_50 / SMA_100:简单移动平均线 (SMA) 是通过计算特定天数内股票价格的平均值来计算的。 SMA_50 和 SMA_100 分别是 50 天和 100 天的平均值。
EMA_50 / EMA_100:指数移动平均线 (EMA) 更加重视最近的价格,因此比 SMA 对价格变化的反应更快。 EMA_50 和 EMA_100 分别根据 50 天和 100 天计算。
MACD:移动平均线收敛分歧(MACD)是一种趋势跟踪动量指标,显示股票价格的两条移动平均线之间的关系。
布林线 (Bollinger):一组线条绘制了与股票价格简单移动平均线 (SMA) 的两个标准差(正向和负向)。
真实波动范围:以下中的最大者:当前最高价减去当前最低价、当前最高价的绝对值减去前一个收盘价,或当前最低价的绝对值减去前一个收盘价。
ATR_7 / ATR_14:平均真实波动幅度 (ATR) 是波动率的衡量标准,显示股票在给定时期内的平均波动程度。 ATR_7 和 ATR_14 分别按 7 天和 14 天计算。
次日收盘价:未来价格。股票下一个交易日的收盘价。可用作回归预测的目标变量。
3.技术工具
Python版本:3.9
代码编辑器:jupyter notebook
4.实验过程
4.1导入数据
import matplotlib as mpl
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.seasonal import seasonal_decompose
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('nflx_2014_2023.csv')
df
4.2数据探索
查看数据大小
查看数据基本信息
查看数据描述性统计
4.3数据可视化
创建股票价格时间序列数据帧
该数据集包含4种不同的股票价格:开盘价、最高价、最低价和收盘价。股票价格一词指的是股票在市场上交易的当前价格。当天的平均价格是典型的股票价格。投资者更喜欢使用典型价格而不是收盘价;典型的价格被看作是一条纯粹的简单移动平均线。典型的价格是最低价、最高价和收盘价除以3。我为日期和典型股票价格创建了一个时间序列数据框架。
典型的股价在2019冠状病毒病期间达到顶峰,并在2022年下跌。我按月重新采样时间序列数据;这是为了确保数据以一致的频率分布。正如我们在本笔记本前面看到的,所有周末都从数据中排除。一年大约有252个交易日。我按月重新抽样数据。
4.4ADF检验
结论是时间序列不是平稳的。增广Dickey-Fuller (ADF)检验是一种常用的统计检验,用于确定给定的时间序列是否平稳。如果ADF统计量的绝对值大于临界值,则拒绝该时间序列是非平稳的原假设。在这种情况下,我们不能拒绝零假设。现在,让我们看一下数据的一个小子集。我去掉了2018年之前的所有日期。所以数据范围从2018年到2023年底。
尽管如此,我还是不能拒绝非平稳性的零假设。与以前的结果相比,有一些证据表明趋于平稳性。
让我们看一下自相关函数图。该图评估了一个序列的当前值在多大程度上依赖于它的过去值。这幅图显示了一个衰减模式,直到达到10个滞后点。前4个滞后的系数在阴影区域之外;这表明统计上显著的相关性。
4.5构建SARIMA模型
SARIMA(Seasonal Autoregressive Integrated Moving Average)模型和ARIMA(Autoregressive Integrated Moving Average)模型在时序数据预测领域都是重要的工具,但它们之间存在一些显著的区别:
- 模型适应范围:ARIMA模型主要用于处理非季节性的时间序列数据,而SARIMA模型则更适用于具有明显季节性变化的时间序列数据。SARIMA模型通过加入季节性因素,能够更好地拟合具有季节性特征的时间序列数据。
- 模型复杂度:相对于ARIMA模型,SARIMA模型更为复杂。这是因为SARIMA模型需要考虑季节性因素的影响,因此需要在模型中引入季节性差分,并加入季节性项。这使得SARIMA模型在参数设置和模型构建方面需要更多的注意和技巧。
- 参数设置:ARIMA和SARIMA模型都有三个主要参数:p(自回归阶数)、d(差分阶数)和q(滑动平均阶数)。然而,在SARIMA模型中,还需要设置额外的季节性参数P、D、Q。这些参数可以通过样本数据的自相关图和偏自相关图来确定。因此,SARIMA模型的参数设置相对于ARIMA模型来说更为复杂。
- 预测性能:由于SARIMA模型考虑了季节性因素,因此在处理具有季节性变化的时间序列数据时,其预测性能通常优于ARIMA模型。然而,如果时间序列数据没有明显的季节性变化,那么ARIMA模型可能会提供更好的预测结果。
总的来说,SARIMA和ARIMA模型在时序数据预测领域各有优势,选择哪种模型取决于具体的数据特征和预测需求。
预测是2024-2025年股价会上涨。
源代码
import matplotlib as mpl
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.seasonal import seasonal_decompose
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('nflx_2014_2023.csv')
df
df.shape
df.info()
df.describe().T
#t 典型的股票价格等于最高、最低和收盘价格的平均值
df['typical'] = df[['high', 'low','close']].mean(axis=1)
df_timeseries = df[['date','typical']]
df_timeseries
df_timeseries['date'] = pd.to_datetime(df_timeseries['date'])
df_timeseries.set_index('date', inplace=True)
plt.plot(df_timeseries)
plt.ylabel('Typical Price')
plt.title('Typical Stock Price Over Time')
plt.show()
# 按月重新抽样数据
monthly_data = df_timeseries.resample('M').mean()
plt.plot(monthly_data)
plt.ylabel('Typical Price')
plt.title('Typical Stock Price Over Time by Month')
plt.show()
# 提取时间序列值
ts_values = monthly_data['typical'].values
# 执行ADF检验
result = adfuller(ts_values)
# 打印测试结果
print('ADF Statistic:', result[0])
print('p-value:', result[1])
print('Critical Values:')
for key, value in result[4].items():
print(f'\t{key}: {value}')
start_date = "2018-01-01"
end_date = "2023-12-31"
mask = (df_timeseries.index > start_date)
df_timeseries_filtered = df_timeseries[mask]
df_timeseries_filtered
# 按月重新抽样数据
df_timeseries_filtered_monthly = df_timeseries_filtered.resample('M').mean()
plt.plot(df_timeseries_filtered_monthly)
plt.ylabel('Typical Price')
plt.title('Typical Stock Price Over Time by Month')
plt.show()
# 提取时间序列值
ts_values_2 = df_timeseries_filtered_monthly['typical'].values
# 执行ADF检验
reslt = adfuller(ts_values_2)
# 打印测试结果
print('ADF Statistic:', reslt[0])
print('p-value:', reslt[1])
print('Critical Values:')
for key, value in reslt[4].items():
print(f'\t{key}: {value}')
# 假设您的时间序列数据存储在名为“ts”的系列中。
# Plot ACF
plot_acf(ts_values_2, lags=15)
plt.title('Autocorrelation Function (ACF)')
plt.show()
# 进行季节性分解
decomposition = seasonal_decompose(df_timeseries_filtered_monthly, model='additive')
plt.figure(figsize=(10, 8))
# 原始时间序列
plt.subplot(411)
plt.plot(df_timeseries_filtered_monthly, label='Original')
plt.legend()
# 趋势组件
plt.subplot(412)
plt.plot(decomposition.trend, label='Trend')
plt.legend()
# 季节性的组件
plt.subplot(413)
plt.plot(decomposition.seasonal, label='Seasonal')
plt.legend()
# 残差分量
plt.subplot(414)
plt.plot(decomposition.resid, label='Residual')
plt.legend()
plt.tight_layout()
plt.show()
ts = df_timeseries_filtered_monthly['typical']
# 定义并拟合SARIMA模型
model = SARIMAX(ts, order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
results = model.fit()
# 预测未来值
forecast = results.forecast(steps=12) # 预测未来一年
# 绘制原始数据和预测
plt.plot(ts.index, ts, label='Original Data')
plt.plot(forecast.index, forecast, label='Forecast')
plt.xlabel('Date')
plt.ylabel('Typical Stock Price')
plt.title('Time Series Forecasting with SARIMA')
plt.legend()
plt.show()
资料获取,更多粉丝福利,关注下方公众号获取