嘿!各位股票小白和未来的股市大神们,今天我们一起“预测”一下股票走势吧!🎉 我们将使用Python中的一些神奇库来创建一个预测股票价格的模型。而且,我们会见证一下作为数据科学家的乐趣。😎
代码概览
这是一个关于如何利用Python对股票市场进行一些简单的预测的例子。我们主要使用了时间序列分析(AR模型)和卡尔曼滤波器,以提高预测效果。不用担心,如果这些听起来有点复杂,我会一步步来解释的。🚀
步骤一:获取数据
首先,我们得有数据才能预测,对吧?我这段代码获取了指定时间范围内的股票数据。它使用了Tushare API来获取股票的日线数据:
# 获取时间范围参数
time_range = request.GET.get('time_range', '3Y')
# 设置Tushare API Token
ts.set_token('你的token')
pro = ts.pro_api()
# 获取当前时间
end_date = datetime.now()
# 根据选择的时间范围计算起始日期
start_date = end_date - {
'4M': relativedelta(months=4),
'1Y': relativedelta(years=1),
'3Y': relativedelta(years=3)
}.get(time_range, relativedelta(months=4))
以上步骤告诉Python抓取过去一定时间内(默认4个月)的股票价格数据。注意要确保你已经拿到了Tushare的API Token。
步骤二:模型训练
拿到数据后,我们需要训练一下模型。我们用的是AutoRegressive (AR) 模型。这是一个非常经典的时间序列模型。模型通过历史数据来预测未来数据的趋势:
# 拟合AR模型 - 使用30阶滞后项
ar_model = AutoReg(train_data, lags=30)
ar_result = ar_model.fit()
# 使用AR模型预测未来值
n_days_to_predict = 30
ar_predictions = ar_result.predict(start=len(train_data),
end=len(train_data) + n_days_to_predict - 1)
我们使用30阶滞后项,这意味着模型会根据最多前30天的数据预测未来的走向。
步骤三:优化预测
为了让我们的预测更加靠谱,我们使用了一种叫做卡尔曼滤波器的小技巧。简单来说,它是一种优化手段,可以帮助减少预测误差:
# 应用卡尔曼滤波器优化AR预测结果
# 卡尔曼滤波器参数
R = 1.0
Q = 0.1
A = 1.0
C = 1.0
# 用第一个预测值初始化卡尔曼滤波器
x_hat = ar_predictions[0]
P = 1.0
kalman_predictions = [x_hat]
这部分代码就像在告诉预测模型:“嘿,别担心,我知道数据有点吵,但我信任你,让我们把那吵闹的部分过滤掉!”🤖
步骤四:输出预测结果
最后,我们计算出了30天的预测数据,准备为每一天提供一个预测价格范围,以及核心的基础预测值:
# 准备预测结果数据
prediction_results = []
for i in range(n_days_to_predict):
result = {
"date": pred_dates[i].strftime("%Y-%m-%d"),
"ar_predicted_price": float(ar_predictions[i]),
"kalman_predicted_price": float(kalman_predictions[i]),
"lower_bound": float(kalman_predictions[i] - z_score * std_change),
"upper_bound": float(kalman_predictions[i] + z_score * std_change)
}
prediction_results.append(result)
完整代码如下(仅供参考)
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
import tushare as ts
import numpy as np
import json
from statsmodels.tsa.ar_model import AutoReg
from django.http import JsonResponse
def predicting_stocks(request, ts_code):
# 获取时间范围参数
time_range = request.GET.get('time_range', '3Y')
# 设置Tushare API Token
ts.set_token('你的token')
pro = ts.pro_api()
# 获取当前时间
end_date = datetime.now()
# 根据选择的时间范围计算起始日期
start_date = end_date - {
'4M': relativedelta(months=4), # 4个月
'1Y': relativedelta(years=1), # 1年
'3Y': relativedelta(years=3) # 3年
}.get(time_range, relativedelta(months=4)) # 默认是4个月
# 格式化日期为字符串
start_date_str = start_date.strftime('%Y%m%d')
end_date_str = end_date.strftime('%Y%m%d')
# 获取日线股票数据
rixian = pro.daily(ts_code=ts_code, start_date=start_date_str, end_date=end_date_str)
data = json.loads(rixian.to_json(orient='records'))
data = sorted(data, key=lambda x: datetime.strptime(x["trade_date"], "%Y%m%d"))
# 提取日期和收盘价
dates = [datetime.strptime(item["trade_date"], "%Y%m%d") for item in data]
close_prices = np.array([item["close"] for item in data])
# 确定训练集和预测集
train_size = int(len(close_prices) * 0.75)
train_data = close_prices[:train_size]
# 拟合AR模型 - 使用30阶滞后项
ar_model = AutoReg(train_data, lags=30)
ar_result = ar_model.fit()
# 使用AR模型预测未来值
n_days_to_predict = 30
ar_predictions = ar_result.predict(start=len(train_data),
end=len(train_data) + n_days_to_predict - 1)
# 应用卡尔曼滤波器优化AR预测结果
R = 1.0 # 观测噪声
Q = 0.1 # 过程噪声
A = 1.0 # 状态转移矩阵
C = 1.0 # 观测矩阵
x_hat = ar_predictions[0] # 状态估计初始值
P = 1.0 # 误差协方差初始值
kalman_predictions = [x_hat] # 保存卡尔曼滤波结果的列表
for i in range(1, len(ar_predictions)):
x_hat_minus = A * x_hat
P_minus = A * P * A + Q
K = P_minus * C / (C * P_minus * C + R)
x_hat = x_hat_minus + K * (ar_predictions[i] - C * x_hat_minus)
P = (1 - K * C) * P_minus
kalman_predictions.append(x_hat)
# 为预测生成未来日期
pred_dates = [dates[-1] + timedelta(days=i) for i in range(1, n_days_to_predict + 1)]
# 计算预测标准差用于置信区间
std_change = np.std(np.diff(close_prices))
z_score = 1.96 # 95%置信度对应的Z分数
prediction_results = []
for i in range(n_days_to_predict):
result = {
"date": pred_dates[i].strftime("%Y-%m-%d"),
"ar_predicted_price": float(ar_predictions[i]),
"kalman_predicted_price": float(kalman_predictions[i]),
"lower_bound": float(kalman_predictions[i] - z_score * std_change),
"upper_bound": float(kalman_predictions[i] + z_score * std_change)
}
prediction_results.append(result)
model_info = {
'ar_order': ar_result.model.ar_lags.tolist() if hasattr(ar_result.model, 'ar_lags') else [],
'ar_params': ar_result.params.tolist() if hasattr(ar_result, 'params') else []
}
if model_info['ar_order'] is None:
model_info['ar_order'] = []
if model_info['ar_params'] is None:
model_info['ar_params'] = []
return JsonResponse({
'prediction_results': prediction_results,
'model_info': model_info
})```
总结
这就是一个非常简单的使用时间序列分析和滤波器技术来预测股票价格的过程。当然,现实中的市场比这复杂得多,但这对初学者来说是个不错的入门项目。📊
如果你有任何疑问或者建议,欢迎留言,一起交流。祝大家都能成为股票预测的高手,离自己的小目标更进一步!💸💰