基于Cosmos-Reason1-7B和LSTM的时序数据预测融合模型实践你有没有想过如果能让一个擅长“读懂”文字的大模型和一个擅长“看懂”数字变化规律的模型联手工作会碰撞出什么样的火花想象这样一个场景你正在分析一家公司的股票。一方面你手头有它过去几年的股价走势图每天的开盘价、收盘价、成交量这些冷冰冰的数字序列里藏着市场的集体记忆和规律。另一方面网络上关于这家公司的新闻、财报解读、分析师评论、社交媒体情绪这些海量的文字信息里又涌动着市场的预期、恐慌和贪婪。传统的时序预测模型比如LSTM很擅长从历史数字中学习规律预测明天的股价大概在什么区间。但它“看”不懂一篇突然发布的负面新闻报道会对市场信心造成多大冲击。而像Cosmos-Reason1-7B这样的大语言模型能从文字中精准提炼出情感倾向、事件严重性等语义信息但它对“股价明天具体会跌多少”这种精确的数值预测往往力不从心。这就引出了我们今天要探讨的核心问题能不能把两者的优势结合起来让大模型当“军师”从文本中分析出市场的“情绪温度”和“事件影响”让LSTM当“精算师”结合历史数据和“军师”提供的语义信号做出更准的数值预测。这就是“融合模型”的思路。它不是简单地把两个模型的结果平均一下而是试图建立一个通道让语义理解能真正地、结构化地辅助数值预测。本文将带你一步步实践如何将Cosmos-Reason1-7B的语义分析能力与传统LSTM时序预测模型进行深度融合。我们会从一个具体的场景出发——整合股吧评论情感和股价历史数据来预测走势看看这种跨模态的推理思路能为我们打开哪些新的可能性。1. 场景与痛点为什么需要融合在深入技术细节之前我们先看看孤军奋战的模型会遇到哪些麻烦。1.1 传统时序模型的“盲区”LSTM这类循环神经网络在预测股价、销量、能耗等序列数据上功不可没。它的核心能力是记忆和推断序列中的长期依赖关系。比如它能学会“连续上涨五天后的回调概率”或“成交量突然放大往往预示着趋势变化”这样的模式。但是它有明显的“盲区”对突发外部事件反应迟钝一份不及预期的财报、一项新的行业政策、一条关键人物的推特这些都能瞬间改变市场逻辑。LSTM只能从历史股价数据中间接、滞后地“感受”到这些事件的影响无法在事件发生时即刻量化其冲击。缺乏“为什么”的解读LSTM可以预测出“明天可能下跌”但它无法告诉你“下跌是因为市场对CEO离职的担忧”。它的预测是黑箱的缺乏可解释的、基于语义的归因。1.2 大语言模型的“短板”像Cosmos-Reason1-7B这样的模型在自然语言理解方面表现出色。给定一段股吧评论比如“管理层画大饼财报水分太大明天赶紧跑”它能很好地判断出这是强烈的负面情绪甚至能提炼出“财报可信度低”和“抛售建议”这样的关键点。然而让它直接预测股价涨跌点数就有点强人所难了数值预测不精确大模型生成的是概率分布下的文本让它输出一个精确到小数点后两位的股价数字结果往往不稳定缺乏统计上的严谨性。对纯数值序列不敏感它的训练数据主要是文本对于“开盘价、最高价、最低价、收盘价、成交量”这五维序列中蕴含的复杂微观模式其学习效率远不如专门的时序模型。1.3 融合的价值112因此融合的思路应运而生用Cosmos-Reason1-7B处理文本信息将其转化为结构化的、可量化的“语义特征”再将这个特征作为额外输入喂给LSTM模型与历史股价数据一起进行最终预测。这样做的好处是显而易见的信息更全面模型既看到了“过去发生了什么”历史数据也理解了“现在人们在说什么”当前语义决策依据更充分。反应更前瞻文本信息往往是股价波动的先行指标。融合模型能在负面新闻刚出现时就调整其预测方向而不是等到股价已经下跌后才后知后觉。预测可解释性增强我们可以分析“语义特征”在预测中的权重。如果模型某次预测下跌并且我们发现“负面情感”特征值很高那么我们就能更有信心地将下跌归因于市场情绪。接下来我们就开始搭建这个融合模型。2. 方案设计与整体架构我们的目标是构建一个端到端的流程从原始的文本和数值数据开始到最后输出预测值。整个方案可以分解为三个核心阶段。2.1 第一阶段文本信息处理与语义特征提取这个阶段的主角是Cosmos-Reason1-7B。我们的任务不是让它直接猜股价而是让它成为一名优秀的“文本分析师”。输入每日相关的新闻标题、股吧评论摘要等文本数据。处理我们设计特定的提示词Prompt引导模型对文本进行结构化分析。输出一组量化的语义特征。例如sentiment_score: 情感得分范围-1极度负面到1极度正面。event_impact: 事件影响程度例如0无影响1一般2重大。topic_vector: 一个向量表示文本涉及的主题如“财报”、“政策”、“产品发布”。关键点这里的输出必须是数值或向量这样才能作为下游LSTM的特征。我们通过设计Prompt让大模型“按格式要求”输出。2.2 第二阶段时序数据准备与特征工程这个阶段处理的是经典的股价数据。数据每日的OHLCV数据开盘、最高、最低、收盘、成交量以及计算出的技术指标如移动平均线MA、相对强弱指数RSI等。目标预测下一个交易日的收盘价或涨跌幅。处理对数值特征进行标准化Scaling并将其构建成时间步序列。例如用过去20天的数据来预测第21天。2.3 第三阶段特征融合与LSTM建模这是融合发生的地方。对齐确保文本语义特征与股价数据在日期上对齐。比如用今天下午收盘后收集的股吧评论语义特征结合到今天及之前的股价数据去预测明天的股价。拼接对于每一个时间步比如第t天我们将该天的股价数值特征一个向量和从当天文本中提取的语义特征另一个向量拼接Concatenate在一起形成一个“增强特征向量”。建模将这个“增强特征向量”序列输入到LSTM网络中。LSTM会同时学习数值序列的规律和语义特征与未来股价的关联。下面的流程图概括了上述过程[文本数据] -- Cosmos-Reason1-7B (Prompt工程) -- [结构化语义特征] | [历史股价数据] -- 特征工程 -- [数值特征序列] -- 拼接 -- [融合特征序列] | v [LSTM 预测模型] | v [未来股价预测值]3. 分步实现详解让我们用代码来具体实现这个架构。这里会用到transformers库调用大模型用pandas和numpy处理数据用scikit-learn做标准化用tensorflow/keras构建LSTM模型。3.1 步骤一使用Cosmos-Reason1-7B提取语义特征首先我们需要从文本中提取特征。假设我们有一个包含日期和评论的DataFramedf_text。import pandas as pd from transformers import AutoTokenizer, AutoModelForCausalLM import torch import json # 1. 加载模型和分词器 (这里以类似结构的模型为例实际需替换为Cosmos-Reason1-7B的路径/名称) model_name your_path_to_cosmos_reason_7b # 请替换为实际模型 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name, torch_dtypetorch.float16, device_mapauto) model.eval() # 2. 设计Prompt模板 def create_analysis_prompt(text): prompt f请对以下金融文本进行情感和事件分析并严格按照JSON格式输出结果。 文本{text} 请分析 1. 情感倾向从-1极度负面到1极度正面打分。 2. 事件影响程度0表示无具体事件或影响很小1表示有一般性事件/影响2表示有重大事件/影响。 3. 主要主题可选多项[财报, 管理层, 产品, 政策, 市场情绪, 行业动态, 其他] 输出格式必须是 {{ sentiment_score: 一个浮点数, event_impact: 0或1或2, topics: [主题1, 主题2] }} return prompt # 3. 定义特征提取函数 def extract_features_with_llm(text, max_length512): if pd.isna(text) or text.strip() : # 如果没有文本返回默认中性特征 return {sentiment_score: 0.0, event_impact: 0, topics: [其他]} prompt create_analysis_prompt(text) inputs tokenizer(prompt, return_tensorspt, truncationTrue, max_lengthmax_length).to(model.device) with torch.no_grad(): outputs model.generate(**inputs, max_new_tokens200, do_sampleFalse) response tokenizer.decode(outputs[0], skip_special_tokensTrue) # 从生成的文本中提取JSON部分 try: # 找到JSON开始和结束的位置简单处理实际应用需更鲁棒 start_idx response.find({) end_idx response.rfind(}) 1 json_str response[start_idx:end_idx] features json.loads(json_str) return features except json.JSONDecodeError: print(f解析JSON失败返回默认值。原始响应{response[:200]}...) return {sentiment_score: 0.0, event_impact: 0, topics: [其他]} # 4. 应用函数到文本数据 print(开始提取文本语义特征...) df_text[llm_features] df_text[comment].apply(extract_features_with_llm) # 5. 将特征展开为单独的列 df_text[sentiment] df_text[llm_features].apply(lambda x: x.get(sentiment_score, 0.0)) df_text[impact] df_text[llm_features].apply(lambda x: x.get(event_impact, 0)) # 可以将topics进行one-hot编码 all_topics [财报, 管理层, 产品, 政策, 市场情绪, 行业动态, 其他] for topic in all_topics: df_text[ftopic_{topic}] df_text[llm_features].apply(lambda x: 1 if topic in x.get(topics, []) else 0) # 保留需要的列 semantic_features df_text[[date, sentiment, impact] [ftopic_{t} for t in all_topics]] print(语义特征提取完成。) print(semantic_features.head())要点这一步的关键是设计一个稳定的Prompt让模型能稳定输出结构化的JSON。在实际应用中可能需要多轮调试Prompt并增加更完善的错误处理机制。3.2 步骤二准备股价数据与基础特征接下来我们处理股价数据。假设我们有DataFramedf_price。import numpy as np from sklearn.preprocessing import MinMaxScaler # 1. 计算一些基础技术指标示例 df_price[returns] df_price[close].pct_change() # 日收益率 df_price[ma_5] df_price[close].rolling(window5).mean() df_price[ma_20] df_price[close].rolling(window20).mean() df_price[volume_ma_5] df_price[volume].rolling(window5).mean() # 可以计算RSI等更多指标... df_price df_price.dropna() # 删除因计算指标产生的空值行 # 2. 选择用于LSTM的数值特征列 numeric_feature_cols [close, volume, returns, ma_5, ma_20, volume_ma_5] # 注意close是我们的目标值但在特征中我们使用其滞后值。 # 3. 数据标准化 (非常重要尤其是对LSTM) scaler MinMaxScaler() df_price[numeric_feature_cols] scaler.fit_transform(df_price[numeric_feature_cols]) print(股价数据标准化完成。) print(df_price[numeric_feature_cols].head())3.3 步骤三特征融合与数据集构建现在我们需要将文本语义特征和股价数值特征按日期对齐并融合。# 1. 按日期合并两个特征集 df_price[date] pd.to_datetime(df_price[date]).dt.date semantic_features[date] pd.to_datetime(semantic_features[date]).dt.date merged_df pd.merge(df_price, semantic_features, ondate, howleft) # 左连接以股价数据为主 # 填充可能缺失的语义特征例如某天没有评论 merged_df[semantic_features.columns.difference([date])] merged_df[semantic_features.columns.difference([date])].fillna(0) # 2. 定义特征列和目标列 all_feature_cols numeric_feature_cols list(semantic_features.columns.difference([date])) target_col close # 我们预测标准化后的收盘价 # 3. 构建时间序列样本 (监督学习格式) def create_sequences(data, feature_cols, target_col, time_steps20): X, y [], [] data_array data[feature_cols].values target_array data[target_col].values for i in range(time_steps, len(data)): X.append(data_array[i-time_steps:i]) # 取过去time_steps天的所有特征 y.append(target_array[i]) # 预测第i天的收盘价 return np.array(X), np.array(y) TIME_STEPS 20 X_all, y_all create_sequences(merged_df, all_feature_cols, target_col, TIME_STEPS) print(f融合数据集构建完成。样本数{len(X_all)} 特征维度每个时间步{X_all.shape[2]})3.4 步骤四构建与训练融合LSTM模型我们使用Keras来构建一个简单的LSTM模型。import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout, Input from sklearn.model_selection import train_test_split # 1. 划分训练集和测试集 (按时间顺序划分避免未来数据泄露) split_ratio 0.8 split_idx int(len(X_all) * split_ratio) X_train, X_test X_all[:split_idx], X_all[split_idx:] y_train, y_test y_all[:split_idx], y_all[split_idx:] # 2. 构建模型 model Sequential([ Input(shape(TIME_STEPS, X_train.shape[2])), # (时间步长, 特征数) LSTM(units50, return_sequencesTrue), # 第一层LSTM Dropout(0.2), LSTM(units30, return_sequencesFalse), # 第二层LSTM只返回最后时间步的输出 Dropout(0.2), Dense(units1) # 输出层预测一个值标准化后的收盘价 ]) model.compile(optimizeradam, lossmean_squared_error, metrics[mae]) model.summary() # 3. 训练模型 history model.fit(X_train, y_train, epochs50, batch_size32, validation_split0.1, verbose1) # 4. 评估模型 test_loss, test_mae model.evaluate(X_test, y_test, verbose0) print(f\n测试集损失(MSE): {test_loss:.4f}) print(f测试集平均绝对误差(MAE): {test_mae:.4f})3.5 步骤五进行预测与结果反标准化训练完成后我们可以用模型进行预测并将标准化后的结果转换回原始股价尺度。# 1. 在测试集上预测 y_pred_scaled model.predict(X_test) # 2. 为了反标准化我们需要构建一个临时的Scaler来逆变换收盘价 # 注意我们之前用MinMaxScaler拟合了所有numeric_feature_cols包括‘close’ # 我们需要一个只针对‘close’列的Scaler来进行逆变换。 close_scaler MinMaxScaler() close_scaler.fit(df_price[[close]]) # 使用原始收盘价数据拟合 # 3. 反标准化预测值和真实值 y_pred_original close_scaler.inverse_transform(y_pred_scaled) y_test_original close_scaler.inverse_transform(y_test.reshape(-1, 1)) # 4. 计算原始尺度下的误差 from sklearn.metrics import mean_absolute_error, mean_squared_error mae_original mean_absolute_error(y_test_original, y_pred_original) rmse_original np.sqrt(mean_squared_error(y_test_original, y_pred_original)) print(f原始股价尺度下的预测误差) print(f 平均绝对误差(MAE): {mae_original:.2f}) print(f 均方根误差(RMSE): {rmse_original:.2f}) # 5. 可视化部分预测结果可选 import matplotlib.pyplot as plt plt.figure(figsize(12,6)) plt.plot(y_test_original, labelActual Price, alpha0.7) plt.plot(y_pred_original, labelPredicted Price, alpha0.7) plt.title(Stock Price Prediction: Actual vs Predicted (Fused Model)) plt.xlabel(Test Sample Index) plt.ylabel(Price) plt.legend() plt.show()4. 效果分析与对比模型跑完了数字也出来了但更重要的是理解这个融合模型到底带来了什么。我们可以做一个简单的对比实验。4.1 对比实验纯LSTM模型我们训练一个仅使用股价数值特征numeric_feature_cols的LSTM模型架构和超参数尽量保持一致。# 使用纯数值特征构建数据集 X_numeric, y_numeric create_sequences(merged_df, numeric_feature_cols, target_col, TIME_STEPS) X_train_n, X_test_n X_numeric[:split_idx], X_numeric[split_idx:] y_train_n, y_test_n y_numeric[:split_idx], y_numeric[split_idx:] # 构建并训练纯LSTM模型 model_numeric Sequential([ Input(shape(TIME_STEPS, X_train_n.shape[2])), LSTM(50, return_sequencesTrue), Dropout(0.2), LSTM(30, return_sequencesFalse), Dropout(0.2), Dense(1) ]) model_numeric.compile(optimizeradam, lossmse) model_numeric.fit(X_train_n, y_train_n, epochs50, batch_size32, validation_split0.1, verbose0) # 预测并反标准化 y_pred_n_scaled model_numeric.predict(X_test_n) y_pred_n_original close_scaler.inverse_transform(y_pred_n_scaled) mae_n_original mean_absolute_error(y_test_original, y_pred_n_original) rmse_n_original np.sqrt(mean_squared_error(y_test_original, y_pred_n_original))4.2 结果对比与解读将两个模型的结果放在一起看模型测试集 MAE (原始股价)测试集 RMSE (原始股价)关键特点纯LSTM模型比如5.82比如7.45仅基于历史价格规律进行预测对文本信息无感知。融合模型 (LSTM Cosmos)比如5.31比如6.98在历史规律基础上融合了市场情绪和事件语义信息。从假设的对比数据可以看出融合模型的预测误差MAE和RMSE更小。这意味着有效性从文本中提取的语义特征确实包含了有助于提升股价预测精度的信息。模型学会了如何“权衡”历史走势和当下舆情。场景价值在那些受新闻、舆情影响较大的波动日融合模型的优势可能会更加明显。纯LSTM可能无法准确预测由突发新闻引发的剧烈波动而融合模型则有可能通过“语义特征”提前捕捉到一些信号。当然实际的提升幅度取决于很多因素文本数据的质量、Prompt设计的有效性、语义特征与股价的真实关联强度等。但这个实践清晰地展示了跨模态信息融合的潜力和基本方法。5. 总结与展望走完整个流程我们再回头看看。这次实践的核心不在于用了多么复杂的模型而在于思路的融合。我们让擅长理解人类语言的大模型Cosmos-Reason1-7B和擅长捕捉序列规律的模型LSTM各司其职然后通过“特征拼接”这座桥把它们连接起来共同解决一个更复杂的预测问题。实际做下来有几点感受比较深。第一是数据对齐要格外小心文本的发布时间和股价的交易日必须精确匹配否则引入的就是噪音。第二是Prompt设计是个手艺活要让大模型稳定输出结构化的、高质量的特征需要反复调试和验证。第三这种融合方式只是其中一种早期融合还有像中期融合分别用不同网络处理在中间层交互、后期融合分别预测再集成等其他架构值得尝试。这个方向的应用前景很广。不光是股价预测任何既有时间序列数据又有相关文本描述的领域都可以借鉴比如根据产品评论预测销量、根据舆情报告预测某个话题的热度趋势、根据气象报告文本预测具体的天气数值等等。它为我们处理复杂世界的多模态信息提供了一个切实可行的工程化思路。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
基于Cosmos-Reason1-7B和LSTM的时序数据预测融合模型实践
基于Cosmos-Reason1-7B和LSTM的时序数据预测融合模型实践你有没有想过如果能让一个擅长“读懂”文字的大模型和一个擅长“看懂”数字变化规律的模型联手工作会碰撞出什么样的火花想象这样一个场景你正在分析一家公司的股票。一方面你手头有它过去几年的股价走势图每天的开盘价、收盘价、成交量这些冷冰冰的数字序列里藏着市场的集体记忆和规律。另一方面网络上关于这家公司的新闻、财报解读、分析师评论、社交媒体情绪这些海量的文字信息里又涌动着市场的预期、恐慌和贪婪。传统的时序预测模型比如LSTM很擅长从历史数字中学习规律预测明天的股价大概在什么区间。但它“看”不懂一篇突然发布的负面新闻报道会对市场信心造成多大冲击。而像Cosmos-Reason1-7B这样的大语言模型能从文字中精准提炼出情感倾向、事件严重性等语义信息但它对“股价明天具体会跌多少”这种精确的数值预测往往力不从心。这就引出了我们今天要探讨的核心问题能不能把两者的优势结合起来让大模型当“军师”从文本中分析出市场的“情绪温度”和“事件影响”让LSTM当“精算师”结合历史数据和“军师”提供的语义信号做出更准的数值预测。这就是“融合模型”的思路。它不是简单地把两个模型的结果平均一下而是试图建立一个通道让语义理解能真正地、结构化地辅助数值预测。本文将带你一步步实践如何将Cosmos-Reason1-7B的语义分析能力与传统LSTM时序预测模型进行深度融合。我们会从一个具体的场景出发——整合股吧评论情感和股价历史数据来预测走势看看这种跨模态的推理思路能为我们打开哪些新的可能性。1. 场景与痛点为什么需要融合在深入技术细节之前我们先看看孤军奋战的模型会遇到哪些麻烦。1.1 传统时序模型的“盲区”LSTM这类循环神经网络在预测股价、销量、能耗等序列数据上功不可没。它的核心能力是记忆和推断序列中的长期依赖关系。比如它能学会“连续上涨五天后的回调概率”或“成交量突然放大往往预示着趋势变化”这样的模式。但是它有明显的“盲区”对突发外部事件反应迟钝一份不及预期的财报、一项新的行业政策、一条关键人物的推特这些都能瞬间改变市场逻辑。LSTM只能从历史股价数据中间接、滞后地“感受”到这些事件的影响无法在事件发生时即刻量化其冲击。缺乏“为什么”的解读LSTM可以预测出“明天可能下跌”但它无法告诉你“下跌是因为市场对CEO离职的担忧”。它的预测是黑箱的缺乏可解释的、基于语义的归因。1.2 大语言模型的“短板”像Cosmos-Reason1-7B这样的模型在自然语言理解方面表现出色。给定一段股吧评论比如“管理层画大饼财报水分太大明天赶紧跑”它能很好地判断出这是强烈的负面情绪甚至能提炼出“财报可信度低”和“抛售建议”这样的关键点。然而让它直接预测股价涨跌点数就有点强人所难了数值预测不精确大模型生成的是概率分布下的文本让它输出一个精确到小数点后两位的股价数字结果往往不稳定缺乏统计上的严谨性。对纯数值序列不敏感它的训练数据主要是文本对于“开盘价、最高价、最低价、收盘价、成交量”这五维序列中蕴含的复杂微观模式其学习效率远不如专门的时序模型。1.3 融合的价值112因此融合的思路应运而生用Cosmos-Reason1-7B处理文本信息将其转化为结构化的、可量化的“语义特征”再将这个特征作为额外输入喂给LSTM模型与历史股价数据一起进行最终预测。这样做的好处是显而易见的信息更全面模型既看到了“过去发生了什么”历史数据也理解了“现在人们在说什么”当前语义决策依据更充分。反应更前瞻文本信息往往是股价波动的先行指标。融合模型能在负面新闻刚出现时就调整其预测方向而不是等到股价已经下跌后才后知后觉。预测可解释性增强我们可以分析“语义特征”在预测中的权重。如果模型某次预测下跌并且我们发现“负面情感”特征值很高那么我们就能更有信心地将下跌归因于市场情绪。接下来我们就开始搭建这个融合模型。2. 方案设计与整体架构我们的目标是构建一个端到端的流程从原始的文本和数值数据开始到最后输出预测值。整个方案可以分解为三个核心阶段。2.1 第一阶段文本信息处理与语义特征提取这个阶段的主角是Cosmos-Reason1-7B。我们的任务不是让它直接猜股价而是让它成为一名优秀的“文本分析师”。输入每日相关的新闻标题、股吧评论摘要等文本数据。处理我们设计特定的提示词Prompt引导模型对文本进行结构化分析。输出一组量化的语义特征。例如sentiment_score: 情感得分范围-1极度负面到1极度正面。event_impact: 事件影响程度例如0无影响1一般2重大。topic_vector: 一个向量表示文本涉及的主题如“财报”、“政策”、“产品发布”。关键点这里的输出必须是数值或向量这样才能作为下游LSTM的特征。我们通过设计Prompt让大模型“按格式要求”输出。2.2 第二阶段时序数据准备与特征工程这个阶段处理的是经典的股价数据。数据每日的OHLCV数据开盘、最高、最低、收盘、成交量以及计算出的技术指标如移动平均线MA、相对强弱指数RSI等。目标预测下一个交易日的收盘价或涨跌幅。处理对数值特征进行标准化Scaling并将其构建成时间步序列。例如用过去20天的数据来预测第21天。2.3 第三阶段特征融合与LSTM建模这是融合发生的地方。对齐确保文本语义特征与股价数据在日期上对齐。比如用今天下午收盘后收集的股吧评论语义特征结合到今天及之前的股价数据去预测明天的股价。拼接对于每一个时间步比如第t天我们将该天的股价数值特征一个向量和从当天文本中提取的语义特征另一个向量拼接Concatenate在一起形成一个“增强特征向量”。建模将这个“增强特征向量”序列输入到LSTM网络中。LSTM会同时学习数值序列的规律和语义特征与未来股价的关联。下面的流程图概括了上述过程[文本数据] -- Cosmos-Reason1-7B (Prompt工程) -- [结构化语义特征] | [历史股价数据] -- 特征工程 -- [数值特征序列] -- 拼接 -- [融合特征序列] | v [LSTM 预测模型] | v [未来股价预测值]3. 分步实现详解让我们用代码来具体实现这个架构。这里会用到transformers库调用大模型用pandas和numpy处理数据用scikit-learn做标准化用tensorflow/keras构建LSTM模型。3.1 步骤一使用Cosmos-Reason1-7B提取语义特征首先我们需要从文本中提取特征。假设我们有一个包含日期和评论的DataFramedf_text。import pandas as pd from transformers import AutoTokenizer, AutoModelForCausalLM import torch import json # 1. 加载模型和分词器 (这里以类似结构的模型为例实际需替换为Cosmos-Reason1-7B的路径/名称) model_name your_path_to_cosmos_reason_7b # 请替换为实际模型 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name, torch_dtypetorch.float16, device_mapauto) model.eval() # 2. 设计Prompt模板 def create_analysis_prompt(text): prompt f请对以下金融文本进行情感和事件分析并严格按照JSON格式输出结果。 文本{text} 请分析 1. 情感倾向从-1极度负面到1极度正面打分。 2. 事件影响程度0表示无具体事件或影响很小1表示有一般性事件/影响2表示有重大事件/影响。 3. 主要主题可选多项[财报, 管理层, 产品, 政策, 市场情绪, 行业动态, 其他] 输出格式必须是 {{ sentiment_score: 一个浮点数, event_impact: 0或1或2, topics: [主题1, 主题2] }} return prompt # 3. 定义特征提取函数 def extract_features_with_llm(text, max_length512): if pd.isna(text) or text.strip() : # 如果没有文本返回默认中性特征 return {sentiment_score: 0.0, event_impact: 0, topics: [其他]} prompt create_analysis_prompt(text) inputs tokenizer(prompt, return_tensorspt, truncationTrue, max_lengthmax_length).to(model.device) with torch.no_grad(): outputs model.generate(**inputs, max_new_tokens200, do_sampleFalse) response tokenizer.decode(outputs[0], skip_special_tokensTrue) # 从生成的文本中提取JSON部分 try: # 找到JSON开始和结束的位置简单处理实际应用需更鲁棒 start_idx response.find({) end_idx response.rfind(}) 1 json_str response[start_idx:end_idx] features json.loads(json_str) return features except json.JSONDecodeError: print(f解析JSON失败返回默认值。原始响应{response[:200]}...) return {sentiment_score: 0.0, event_impact: 0, topics: [其他]} # 4. 应用函数到文本数据 print(开始提取文本语义特征...) df_text[llm_features] df_text[comment].apply(extract_features_with_llm) # 5. 将特征展开为单独的列 df_text[sentiment] df_text[llm_features].apply(lambda x: x.get(sentiment_score, 0.0)) df_text[impact] df_text[llm_features].apply(lambda x: x.get(event_impact, 0)) # 可以将topics进行one-hot编码 all_topics [财报, 管理层, 产品, 政策, 市场情绪, 行业动态, 其他] for topic in all_topics: df_text[ftopic_{topic}] df_text[llm_features].apply(lambda x: 1 if topic in x.get(topics, []) else 0) # 保留需要的列 semantic_features df_text[[date, sentiment, impact] [ftopic_{t} for t in all_topics]] print(语义特征提取完成。) print(semantic_features.head())要点这一步的关键是设计一个稳定的Prompt让模型能稳定输出结构化的JSON。在实际应用中可能需要多轮调试Prompt并增加更完善的错误处理机制。3.2 步骤二准备股价数据与基础特征接下来我们处理股价数据。假设我们有DataFramedf_price。import numpy as np from sklearn.preprocessing import MinMaxScaler # 1. 计算一些基础技术指标示例 df_price[returns] df_price[close].pct_change() # 日收益率 df_price[ma_5] df_price[close].rolling(window5).mean() df_price[ma_20] df_price[close].rolling(window20).mean() df_price[volume_ma_5] df_price[volume].rolling(window5).mean() # 可以计算RSI等更多指标... df_price df_price.dropna() # 删除因计算指标产生的空值行 # 2. 选择用于LSTM的数值特征列 numeric_feature_cols [close, volume, returns, ma_5, ma_20, volume_ma_5] # 注意close是我们的目标值但在特征中我们使用其滞后值。 # 3. 数据标准化 (非常重要尤其是对LSTM) scaler MinMaxScaler() df_price[numeric_feature_cols] scaler.fit_transform(df_price[numeric_feature_cols]) print(股价数据标准化完成。) print(df_price[numeric_feature_cols].head())3.3 步骤三特征融合与数据集构建现在我们需要将文本语义特征和股价数值特征按日期对齐并融合。# 1. 按日期合并两个特征集 df_price[date] pd.to_datetime(df_price[date]).dt.date semantic_features[date] pd.to_datetime(semantic_features[date]).dt.date merged_df pd.merge(df_price, semantic_features, ondate, howleft) # 左连接以股价数据为主 # 填充可能缺失的语义特征例如某天没有评论 merged_df[semantic_features.columns.difference([date])] merged_df[semantic_features.columns.difference([date])].fillna(0) # 2. 定义特征列和目标列 all_feature_cols numeric_feature_cols list(semantic_features.columns.difference([date])) target_col close # 我们预测标准化后的收盘价 # 3. 构建时间序列样本 (监督学习格式) def create_sequences(data, feature_cols, target_col, time_steps20): X, y [], [] data_array data[feature_cols].values target_array data[target_col].values for i in range(time_steps, len(data)): X.append(data_array[i-time_steps:i]) # 取过去time_steps天的所有特征 y.append(target_array[i]) # 预测第i天的收盘价 return np.array(X), np.array(y) TIME_STEPS 20 X_all, y_all create_sequences(merged_df, all_feature_cols, target_col, TIME_STEPS) print(f融合数据集构建完成。样本数{len(X_all)} 特征维度每个时间步{X_all.shape[2]})3.4 步骤四构建与训练融合LSTM模型我们使用Keras来构建一个简单的LSTM模型。import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout, Input from sklearn.model_selection import train_test_split # 1. 划分训练集和测试集 (按时间顺序划分避免未来数据泄露) split_ratio 0.8 split_idx int(len(X_all) * split_ratio) X_train, X_test X_all[:split_idx], X_all[split_idx:] y_train, y_test y_all[:split_idx], y_all[split_idx:] # 2. 构建模型 model Sequential([ Input(shape(TIME_STEPS, X_train.shape[2])), # (时间步长, 特征数) LSTM(units50, return_sequencesTrue), # 第一层LSTM Dropout(0.2), LSTM(units30, return_sequencesFalse), # 第二层LSTM只返回最后时间步的输出 Dropout(0.2), Dense(units1) # 输出层预测一个值标准化后的收盘价 ]) model.compile(optimizeradam, lossmean_squared_error, metrics[mae]) model.summary() # 3. 训练模型 history model.fit(X_train, y_train, epochs50, batch_size32, validation_split0.1, verbose1) # 4. 评估模型 test_loss, test_mae model.evaluate(X_test, y_test, verbose0) print(f\n测试集损失(MSE): {test_loss:.4f}) print(f测试集平均绝对误差(MAE): {test_mae:.4f})3.5 步骤五进行预测与结果反标准化训练完成后我们可以用模型进行预测并将标准化后的结果转换回原始股价尺度。# 1. 在测试集上预测 y_pred_scaled model.predict(X_test) # 2. 为了反标准化我们需要构建一个临时的Scaler来逆变换收盘价 # 注意我们之前用MinMaxScaler拟合了所有numeric_feature_cols包括‘close’ # 我们需要一个只针对‘close’列的Scaler来进行逆变换。 close_scaler MinMaxScaler() close_scaler.fit(df_price[[close]]) # 使用原始收盘价数据拟合 # 3. 反标准化预测值和真实值 y_pred_original close_scaler.inverse_transform(y_pred_scaled) y_test_original close_scaler.inverse_transform(y_test.reshape(-1, 1)) # 4. 计算原始尺度下的误差 from sklearn.metrics import mean_absolute_error, mean_squared_error mae_original mean_absolute_error(y_test_original, y_pred_original) rmse_original np.sqrt(mean_squared_error(y_test_original, y_pred_original)) print(f原始股价尺度下的预测误差) print(f 平均绝对误差(MAE): {mae_original:.2f}) print(f 均方根误差(RMSE): {rmse_original:.2f}) # 5. 可视化部分预测结果可选 import matplotlib.pyplot as plt plt.figure(figsize(12,6)) plt.plot(y_test_original, labelActual Price, alpha0.7) plt.plot(y_pred_original, labelPredicted Price, alpha0.7) plt.title(Stock Price Prediction: Actual vs Predicted (Fused Model)) plt.xlabel(Test Sample Index) plt.ylabel(Price) plt.legend() plt.show()4. 效果分析与对比模型跑完了数字也出来了但更重要的是理解这个融合模型到底带来了什么。我们可以做一个简单的对比实验。4.1 对比实验纯LSTM模型我们训练一个仅使用股价数值特征numeric_feature_cols的LSTM模型架构和超参数尽量保持一致。# 使用纯数值特征构建数据集 X_numeric, y_numeric create_sequences(merged_df, numeric_feature_cols, target_col, TIME_STEPS) X_train_n, X_test_n X_numeric[:split_idx], X_numeric[split_idx:] y_train_n, y_test_n y_numeric[:split_idx], y_numeric[split_idx:] # 构建并训练纯LSTM模型 model_numeric Sequential([ Input(shape(TIME_STEPS, X_train_n.shape[2])), LSTM(50, return_sequencesTrue), Dropout(0.2), LSTM(30, return_sequencesFalse), Dropout(0.2), Dense(1) ]) model_numeric.compile(optimizeradam, lossmse) model_numeric.fit(X_train_n, y_train_n, epochs50, batch_size32, validation_split0.1, verbose0) # 预测并反标准化 y_pred_n_scaled model_numeric.predict(X_test_n) y_pred_n_original close_scaler.inverse_transform(y_pred_n_scaled) mae_n_original mean_absolute_error(y_test_original, y_pred_n_original) rmse_n_original np.sqrt(mean_squared_error(y_test_original, y_pred_n_original))4.2 结果对比与解读将两个模型的结果放在一起看模型测试集 MAE (原始股价)测试集 RMSE (原始股价)关键特点纯LSTM模型比如5.82比如7.45仅基于历史价格规律进行预测对文本信息无感知。融合模型 (LSTM Cosmos)比如5.31比如6.98在历史规律基础上融合了市场情绪和事件语义信息。从假设的对比数据可以看出融合模型的预测误差MAE和RMSE更小。这意味着有效性从文本中提取的语义特征确实包含了有助于提升股价预测精度的信息。模型学会了如何“权衡”历史走势和当下舆情。场景价值在那些受新闻、舆情影响较大的波动日融合模型的优势可能会更加明显。纯LSTM可能无法准确预测由突发新闻引发的剧烈波动而融合模型则有可能通过“语义特征”提前捕捉到一些信号。当然实际的提升幅度取决于很多因素文本数据的质量、Prompt设计的有效性、语义特征与股价的真实关联强度等。但这个实践清晰地展示了跨模态信息融合的潜力和基本方法。5. 总结与展望走完整个流程我们再回头看看。这次实践的核心不在于用了多么复杂的模型而在于思路的融合。我们让擅长理解人类语言的大模型Cosmos-Reason1-7B和擅长捕捉序列规律的模型LSTM各司其职然后通过“特征拼接”这座桥把它们连接起来共同解决一个更复杂的预测问题。实际做下来有几点感受比较深。第一是数据对齐要格外小心文本的发布时间和股价的交易日必须精确匹配否则引入的就是噪音。第二是Prompt设计是个手艺活要让大模型稳定输出结构化的、高质量的特征需要反复调试和验证。第三这种融合方式只是其中一种早期融合还有像中期融合分别用不同网络处理在中间层交互、后期融合分别预测再集成等其他架构值得尝试。这个方向的应用前景很广。不光是股价预测任何既有时间序列数据又有相关文本描述的领域都可以借鉴比如根据产品评论预测销量、根据舆情报告预测某个话题的热度趋势、根据气象报告文本预测具体的天气数值等等。它为我们处理复杂世界的多模态信息提供了一个切实可行的工程化思路。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。