西安做网站朋朋网络,wordpress 正文宽度,怎样建立个人网站,做神马网站快零基础玩转时序大模型#xff1a;用Lag-Llama快速实现股票价格预测#xff08;附Colab代码#xff09; 最近和几个做量化研究的朋友聊天#xff0c;发现他们都在讨论一个叫“时序大模型”的新玩意儿。说实话#xff0c;刚开始听到这个词我也有点懵——时间序列分析不是ARI…零基础玩转时序大模型用Lag-Llama快速实现股票价格预测附Colab代码最近和几个做量化研究的朋友聊天发现他们都在讨论一个叫“时序大模型”的新玩意儿。说实话刚开始听到这个词我也有点懵——时间序列分析不是ARIMA、Prophet这些传统方法的天下吗什么时候也冒出“大模型”了直到我亲手用Lag-Llama跑了一遍股票价格预测才真正感受到这股技术浪潮带来的冲击原来预测未来走势真的可以像让模型“读”一段历史数据然后直接“生成”未来一样简单。这篇文章就是为你准备的无论你是刚接触机器学习的在校学生还是对金融科技感兴趣的开发者甚至是好奇AI如何应用于投资分析的爱好者。我们不会深究复杂的数学公式也不会堆砌令人望而生畏的学术术语。我的目标很明确带你从零开始手把手在Google Colab上用Lag-Llama这个开源时序大模型完成一个端到端的股票价格预测项目。你会发现借助“零样本预测”的能力你甚至不需要准备海量的标注数据来训练模型直接用预训练好的模型就能得到不错的结果这简直是快速原型开发和想法验证的利器。准备好了吗我们这就开始这场既有趣又实用的技术探险。1. 环境准备与数据获取在开始任何模型工作之前搭建一个稳定、可复现的环境是第一步。对于初学者来说最友好的方式莫过于使用Google Colab。它提供了一个免费的、带GPU的云端Jupyter Notebook环境我们无需在本地安装复杂的依赖点开链接就能直接编码。首先我们需要确保Colab运行时使用的是GPU这能显著加快模型推理的速度。在Colab的菜单栏中依次点击“运行时” - “更改运行时类型”在“硬件加速器”下拉菜单中选择“GPU”然后保存。接下来我们就可以在第一个代码单元格中安装必要的Python库了。# 安装核心依赖库 !pip install -q transformers datasets accelerate pandas numpy matplotlib yfinance scikit-learn这里我们安装了几个关键的库transformersHugging Face的模型库我们将通过它来加载Lag-Llama模型。datasets同样来自Hugging Face用于方便地加载和处理数据集。accelerate用于优化模型在GPU上的推理。pandas numpy数据处理的黄金搭档。matplotlib用于结果可视化。yfinance一个非常方便的库用于从雅虎财经获取股票历史数据。scikit-learn用于一些基础的数据标准化操作。安装完成后我们导入这些库并获取股票数据。为了让实验更具象我们选择苹果公司AAPL的股票日度收盘价作为预测目标。import yfinance as yf import pandas as pd import numpy as np import matplotlib.pyplot as plt from datetime import datetime, timedelta # 设置时间范围获取过去3年的数据 end_date datetime.today() start_date end_date - timedelta(days3*365) # 下载苹果公司股票数据 ticker AAPL df yf.download(ticker, startstart_date, endend_date, progressFalse) # 查看数据前几行 print(f数据形状: {df.shape}) print(df.head())运行上述代码你会看到一个包含Open,High,Low,Close,Adj Close,Volume列的DataFrame。对于初次的单变量预测我们只关心Close收盘价这一列。让我们把它提取出来并绘制其走势图对数据有一个直观的感受。# 提取收盘价序列 close_series df[Close].reset_index(dropTrue) dates df.index # 绘制股价走势图 plt.figure(figsize(14, 5)) plt.plot(dates, close_series, labelf{ticker} Close Price, linewidth1.5) plt.title(f{ticker} Stock Closing Price ({start_date.date()} to {end_date.date()})) plt.xlabel(Date) plt.ylabel(Price (USD)) plt.legend() plt.grid(True, alpha0.3) plt.show()提示使用yfinance获取数据非常便捷但它依赖于网络请求。如果遇到连接问题可以尝试重新运行单元格或者检查Colab的网络环境。此外雅虎财经的数据格式偶尔会有微调如果遇到列名错误可以打印df.columns来确认正确的列名。2. 理解Lag-Llama与数据预处理在把数据喂给模型之前我们有必要花几分钟了解一下Lag-Llama到底是个什么模型以及它希望数据以何种格式“进食”。这能帮助我们避免很多后续的坑。Lag-Llama本质上是一个基于Transformer解码器架构的时序预测基础模型。你可以把它想象成一个专门为时间序列数据训练的“语言模型”。就像GPT看完一段文字能接着写下去一样Lag-Llama看完一段历史股价序列就能预测接下来的价格走势。它的一个核心创新是引入了“滞后特征”。简单来说模型不仅看最近的价格还会自动关注像“一天前”、“一周前”、“一个月前”同期的价格这些历史同期点就是“滞后点”。模型通过学习这些滞后点与当前点的关系来捕捉序列中的周期、趋势等模式。明白了这个原理我们的数据预处理目标就清晰了我们需要把一长条时间序列切割成许多个“历史上下文窗口”和对应的“预测目标窗口”。对于Lag-Llama一个常见的设置是使用过去512个时间点作为历史来预测未来96个时间点。下面我们开始对苹果股价数据进行预处理。关键步骤包括序列标准化、滑动窗口切割、以及转换为模型接受的张量格式。from sklearn.preprocessing import StandardScaler import torch # 1. 数据标准化将价格缩放至均值为0方差为1有助于模型稳定训练 scaler StandardScaler() close_values close_series.values.reshape(-1, 1) close_scaled scaler.fit_transform(close_values).flatten() # 2. 定义窗口参数 context_length 512 # 历史长度 prediction_length 96 # 预测长度 stride 7 # 滑动步长避免窗口重叠太多节省内存 # 3. 创建滑动窗口数据集 def create_sliding_windows(series, context_len, pred_len, stride): windows [] total_len len(series) for i in range(0, total_len - context_len - pred_len 1, stride): context series[i:icontext_len] target series[icontext_len : icontext_lenpred_len] windows.append((context, target)) return windows windows create_sliding_windows(close_scaled, context_length, prediction_length, stride) print(f共创建了 {len(windows)} 个样本窗口。) # 4. 将最后一个窗口作为测试集模拟预测未来 train_windows windows[:-1] test_context, test_target windows[-1] # 最后一段历史数据及其对应的真实未来值用于评估 # 转换为PyTorch张量 test_context_tensor torch.tensor(test_context, dtypetorch.float32).unsqueeze(0) # 增加batch维度 test_target_tensor torch.tensor(test_target, dtypetorch.float32)为了更直观地理解我们切割出来的数据是什么样子我们可以用表格来对比一下不同窗口的起止索引窗口编号历史窗口起始索引历史窗口结束索引预测窗口起始索引预测窗口结束索引说明00511512607第一个训练样本17518519614第二个训练样本步长为7..................N-1-575-64-6332倒数第二个训练样本N (测试)-512-1095最后一个窗口用于模拟预测“未知”未来这个表格清晰地展示了滑动窗口的机制。我们用第N个窗口的历史部分索引-512到-1作为输入让模型预测索引0到95的未来值然后将预测结果与test_target_tensor即真实的未来值进行比较就能评估模型效果。3. 加载模型与执行零样本预测这是最令人兴奋的一步我们将直接从Hugging Face模型库加载预训练好的Lag-Llama模型并让它对我们准备好的测试数据进行预测。所谓“零样本”就是指模型在没有针对苹果股价数据进行任何额外训练微调的情况下直接进行预测。这充分展示了基础模型强大的泛化能力。Lag-Llama在Hugging Face上提供了多个规模的模型我们选择time-series-foundation-models/Lag-Llama这个约2亿参数的基础版本它在精度和推理速度之间取得了不错的平衡。from transformers import AutoModelForProbabilisticTimeSeriesForecasting, AutoConfig import warnings warnings.filterwarnings(ignore) # 指定模型ID model_id time-series-foundation-models/Lag-Llama # 加载模型配置和模型 print(正在加载Lag-Llama模型...) config AutoConfig.from_pretrained(model_id) model AutoModelForProbabilisticTimeSeriesForecasting.from_pretrained(model_id, configconfig) # 将模型设置为评估模式并移动到GPU如果可用 device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) model.eval() print(f模型已加载至 {device}。) # 准备模型输入 # Lag-Llama的输入需要是一个字典包含past_values和past_time_features这里我们用占位符 # 对于单变量预测我们可以忽略复杂的时间特征用零填充 batch_size test_context_tensor.shape[0] past_time_features torch.zeros((batch_size, context_length, 1)) # 时间特征占位符 inputs { past_values: test_context_tensor.to(device), past_time_features: past_time_features.to(device), future_time_features: torch.zeros((batch_size, prediction_length, 1)).to(device), # 未来时间特征占位符 } # 执行预测关闭梯度计算以节省内存 print(正在进行预测...) with torch.no_grad(): outputs model(**inputs) # 输出是一个分布我们取其均值作为点预测 prediction outputs.prediction_mean.cpu().squeeze() # 形状应为 (prediction_length,) print(f预测完成预测序列长度为: {len(prediction)})代码运行后如果一切顺利你会看到模型加载和预测的过程。这里有几个关键点需要注意时间特征在更复杂的多变量预测中past_time_features可以包含小时、星期几、月份等信息。为了简化我们这里用了全零占位符对于股价这种日度数据模型主要依赖其内部的滞后特征机制。概率预测outputs对象包含了预测的分布信息如均值和方差我们取prediction_mean得到最可能的预测值。如果你想分析预测的不确定性可以进一步研究prediction_distribution。内存2亿参数的模型在Colab的免费GPU上运行良好但如果加载更大的模型或处理更长的序列可能会遇到内存不足的问题。4. 结果可视化、评估与优化思路模型预测出了一串数字但这些数字意味着什么我们需要将其还原到原始的价格尺度并与真实情况对比。同时一个合格的预测项目不能只看图形“像不像”还需要一些定量的评估指标。首先我们将标准化后的预测值反向转换回原始股价# 将标准化后的预测值逆变换回原始价格尺度 # 注意scaler需要接收二维数组预测值需要reshape prediction_reshaped prediction.numpy().reshape(-1, 1) prediction_original scaler.inverse_transform(prediction_reshaped).flatten() # 同样处理真实的未来值test_target target_original scaler.inverse_transform(test_target_tensor.numpy().reshape(-1, 1)).flatten() # 生成未来日期的索引用于绘图 last_date dates[-1] future_dates pd.date_range(startlast_date pd.Timedelta(days1), periodsprediction_length, freqB) # B代表工作日接下来我们绘制对比图将历史数据、模型预测的未来数据以及真实的未来数据放在一起plt.figure(figsize(16, 6)) # 绘制历史数据最后200个点以便清晰显示 historical_to_plot -200 plt.plot(dates[historical_to_plot:], close_series[historical_to_plot:], b-, labelHistorical Close Price, linewidth2, alpha0.7) # 绘制模型预测的未来数据 plt.plot(future_dates, prediction_original, r--, labelLag-Llama Forecast, linewidth2.5, markersize8) # 绘制真实的未来数据如果我们有的话在真实应用中这是未知的 plt.plot(future_dates, target_original, g-, labelActual Future Price (Ground Truth), linewidth2, alpha0.9) plt.axvline(xlast_date, colork, linestyle:, linewidth1, labelForecast Start) plt.title(f{ticker} Stock Price: History vs. Lag-Llama Zero-Shot Forecast, fontsize14) plt.xlabel(Date) plt.ylabel(Price (USD)) plt.legend(locupper left) plt.grid(True, alpha0.3) plt.xticks(rotation45) plt.tight_layout() plt.show()这张图会直观地告诉你预测效果。红色的虚线是模型的预测轨迹绿色的实线是真实的股价走势在真实预测任务中这部分是不可见的。观察两者之间的贴合程度你能快速判断模型是否抓住了主要的趋势和波动。除了看图我们还需要用数字说话。常用的时间序列预测评估指标有MAE (平均绝对误差)预测值与真实值绝对差的平均值单位与原始数据相同非常直观。RMSE (均方根误差)对误差进行平方再开方对大误差惩罚更重。MAPE (平均绝对百分比误差)误差相对于真实值的百分比便于比较不同量级的数据。让我们计算一下from sklearn.metrics import mean_absolute_error, mean_squared_error def mean_absolute_percentage_error(y_true, y_pred): y_true, y_pred np.array(y_true), np.array(y_pred) # 避免除以零 non_zero_idx y_true ! 0 return np.mean(np.abs((y_true[non_zero_idx] - y_pred[non_zero_idx]) / y_true[non_zero_idx])) * 100 mae mean_absolute_error(target_original, prediction_original) rmse np.sqrt(mean_squared_error(target_original, prediction_original)) mape mean_absolute_percentage_error(target_original, prediction_original) print(预测性能评估:) print(f MAE: ${mae:.2f}) print(f RMSE: ${rmse:.2f}) print(f MAPE: {mape:.2f}%)看到评估结果后你可能会想“这个误差能接受吗还有办法让预测更准吗” 这正是机器学习的魅力所在——迭代优化。以下是一些可以尝试的优化方向调整上下文长度我们使用了512但对于日度数据也许包含更多历史如1024能捕捉更长周期的规律或者更少如256能让模型更关注近期变化。你可以修改context_length参数进行实验。引入时间特征之前我们用零填充了时间特征。实际上可以构造更有信息量的特征比如“是否周一”、“是否季度末”等这能帮助模型理解日历效应。尝试微调如果零样本预测的结果不理想而你又有一些该股票的历史数据可以考虑对Lag-Llama进行轻量级的微调。这需要将之前创建的train_windows作为训练集使用Hugging Face的TrainerAPI进行少量epoch的训练。微调能显著提升模型在特定序列上的表现。模型集成不要只相信一个模型。可以同时运行多个不同的时序大模型如TimesFM、Chronos或者将Lag-Llama的预测结果与传统统计模型如Prophet的结果进行加权平均往往能获得更稳健的预测。注意股票价格预测是金融领域著名的难题受无数复杂因素影响。任何模型包括大模型的预测都应被视为辅助分析工具而非投资决策的唯一依据。在实际应用中必须结合风险管理、基本面分析等多维度信息。当你完成第一次预测并看到图表和数字时那种亲手让AI“预见”未来的感觉是非常奇妙的。我最初跑通这个流程时盯着那条预测曲线看了好久虽然知道它远非完美但那种将前沿技术快速落地的成就感是实实在在的。更重要的是这套基于Colab和开源模型的流程为你打开了一扇门。你可以轻易地将代码中的ticker AAPL换成MSFT、GOOGL或者其他任何你感兴趣的标的立刻开始新的探索。你也可以尝试用同样的框架去预测网站流量、能源消耗、销售额等其他时序数据。