基于LLM大模型的股票基金周预测Agent

利用大语言模型,将复杂的宏观经济、市场情绪与量化数据转化为可执行的交易洞察,打造你的私人AI投资分析师。在这个AI重塑金融的时代,掌握代码+模型+金融逻辑的复合能力,将是量化投资者的终极护城河。

1 系统架构:从数据孤岛到AI决策

1.1 痛点分析与解决方案

传统量化的局限性

在金融市场中,传统的量化模型擅长处理结构化数据(如价格、成交量),但面对非结构化信息(如新闻舆情、政策风向)往往束手无策。同时,普通投资者难以在短时间内综合处理PMI数据、美债收益率、北向资金流向以及技术面形态等异构信息。

LLM驱动的Agent架构

本项目旨在构建一个全维度市场分析助手。它不仅仅是一个预测工具,更是一个自动化ETL(提取、转换、加载)与推理系统。系统采用模块化设计,核心流程如下:

  1. 数据层:通过AKShare接口聚合基金日线、宏观经济(PMI/CPI)、资金面(北向/融资)、衍生品(期权波动率QVIX/股指期货基差)及新闻文本。
  2. 处理层:执行严格的时间对齐与清洗,将不同频率(日频、月频)的数据统一降维至周频,以过滤短期噪音。
  3. 认知层:将清洗后的多维数据构建为结构化Prompt,投喂给LLM(如OpenAI模型)。
  4. 决策层:输出JSON格式的预测结果(上涨/下跌)及深度逻辑分析,并进行历史回测验证。

1.2 核心技术决策

在构建此系统时,做出了三个关键的技术决策,以确保预测的科学性与可用性:

决策点 方案选择 理由
时间周期 周频聚合 (Weekly) 日频噪音过大,月频滞后严重。周频在信号稳定性与反应速度间取得了最佳平衡。
数据对齐 Merge Asof (Backward) 宏观数据(如PMI)按月发布,必须严格防止未来函数,确保预测时只能看到已发布的数据。
输出格式 JSON结构化 强制LLM输出JSON,便于程序解析prediction(结论)和reason(逻辑),实现自动化回测。

2 数据工程:清洗与多频数据对齐

2.1 高级重采样:周频数据的聚合艺术

金融数据具有不同的物理含义,不能简单地取最后一条数据。实现了一个通用的聚合函数 aggregate_to_weekly,它支持针对不同字段采用不同的聚合策略:

  • Last(收盘价/指标):取本周最后一个交易日的数据。
  • Sum(成交量/额):累加本周所有交易日的数值,反映一周的活跃度。
  • Mean(情绪/广度):取本周平均值,平滑波动。
def aggregate_to_weekly(
    df: pd.DataFrame, 
    date_col: str, 
    value_col: str | list[str], 
    method: str = "last"
) -> pd.DataFrame:
    """
    功能:将日频数据重采样为周频(以周五为锚点)。
    核心逻辑:利用pandas强大的resample功能,处理金融时间序列。
    """
    if df.empty:
        return pd.DataFrame()
        
    df = df.copy()
    df[date_col] = pd.to_datetime(df[date_col])
    df.set_index(date_col, inplace=True)
    
    # 'W-FRI' 表示重采样周期为每周,结束于周五
    if method == "last":
        weekly = df.resample("W-FRI")[value_col].last()
    elif method == "mean":
        weekly = df.resample("W-FRI")[value_col].mean()
    elif method == "sum":
        weekly = df.resample("W-FRI")[value_col].sum()
    else:
        raise ValueError("Unsupported method")
    
    # 格式化重置索引,便于后续合并
    if isinstance(weekly, pd.Series):
        weekly_df = weekly.to_frame(name=value_col if isinstance(value_col, str) else None)
    else:
        weekly_df = weekly
        
    weekly_df.index.name = "date"
    weekly_df = weekly_df.reset_index()
    return weekly_df

2.2 严防未来函数:宏观数据异步合并

这是量化回测中最容易踩的坑。例如,10月份的PMI数据通常在10月31日发布。当我们站在11月3日(周五)进行预测时,我们应该能看到10月31日的数据。如果简单的按月份Join,可能会导致日期错位。

使用了 pd.merge_asof,这是处理非同步时间序列的神器。设置 direction='backward' 确保对于每一个周频时间点,系统只能回头看最近一次发布的宏观数据。

def merge_macro_data(weekly_df: pd.DataFrame, macro_df: pd.DataFrame, date_col: str, value_col: str) -> pd.DataFrame:
    """
    使用 merge_asof 高效合并宏观数据 (月频 -> 周频)
    防止引入未来数据 (Look-ahead Bias)
    """
    if macro_df.empty:
        return weekly_df
        
    w_df = weekly_df.sort_values("date").copy()
    m_df = macro_df.sort_values(date_col).copy()
    
    # 确保时间列格式统一
    w_df["date"] = pd.to_datetime(w_df["date"])
    m_df[date_col] = pd.to_datetime(m_df[date_col])
    
    # 核心:direction="backward" 
    # 寻找 <= current_date 的最近一条宏观记录进行填充
    merged = pd.merge_asof(w_df, m_df, left_on="date", right_on=date_col, direction="backward")
    
    # 清理多余的时间列,保持DataFrame整洁
    if date_col != "date":
        merged.drop(columns=[date_col], inplace=True)
        
    return merged

2.3 舆情处理:非结构化文本的降维

新闻数据极其嘈杂。将一周内散乱的新闻标题进行聚合与去重,生成一个简短的周度新闻摘要。

这为LLM提供了一个定性的市场环境背景,使其能理解为何下跌(例如:突发利空 vs 正常回调)。

3 特征工程:构建全维度市场感知

3.1 关键特征因子的选择

为了让LLM做出准确判断,需要投喂具有高解释力的因子。本项目集成了以下几类核心数据:

资金博弈指标

  • 北向资金 (Northbound):Smart Money的动向,周累计净流入是核心看点。
  • 融资余额 (Margin Balance):代表杠杆资金(散户/激进游资)的情绪。高位回落通常是危险信号。

衍生品情绪指标

  • QVIX (期权波动率):类似美股VIX。低位(15-20)代表情绪稳定,高位(>30)代表恐慌。
  • IC基差率 (IC Basis):中证500股指期货的升贴水。深贴水收敛通常是利好,贴水突然扩大则暗示机构在疯狂对冲。

宏观与外围锚点

  • 美债10Y & USD/CNH:定义了全球资产定价的地心引力。汇率贬值往往压制A股估值。
  • 铜/黄金比价:铜代表经济需求,黄金代表避险。两者的背离隐含了经济周期的位置。

3.2 动态Prompt构建策略

仅仅有数据是不够的,我们需要将数据转化为LLM能理解的叙事。系统将清洗好的DataFrame切片,提取最近 LOOKBACK_WEEKS(如20周)的数据,并结合特定的角色设定构建Prompt。

Prompt的设计遵循了 CoT (Chain of Thought) 思维链模式:

  1. 角色设定:量化交易专家。
  2. 数据说明:解释每个指标的含义(如不要见到IC贴水就看空)。
  3. 分析原则:硬性规则(如趋势优先原则、宏观权重 > 技术权重)。
  4. 数据输入:JSON格式的历史行情。
  5. 输出约束:强制要求先给出 reason 再给出 prediction

4 智能预测:LLM推理与回测闭环

4.1 预测主循环逻辑

系统的核心在于回测循环。它模拟了真实的时间流逝:对于每一个历史时间点,模型只能看到该点之前的数据。

    # ... (前序数据聚合代码) ...
    
    # 模拟回测最近 20 周
    test_indices = range(len(merged) - 20, len(merged))
    
    for i in test_indices:
        # 切片:只获取当前时间点之前的数据
        history_df = merged.iloc[:i] 
        
        # 1. 构建Prompt
        prompt = build_prompt(history_df, lookback=20, freq="周")
        
        # 2. 调用LLM API
        prediction_text = call_openai_chat(prompt)
        
        # 3. 解析JSON结果
        # 使用正则表达式提取JSON,增强鲁棒性
        # ... (JSON解析逻辑) ...
        
        # 4. 对比实际涨跌幅
        actual_change = merged.iloc[i]['fund_change']
        actual_type = "上涨" if actual_change > 0 else "下跌"
        
        # 5. 打印实时日志
        print(f"预测: {prediction_type} | 实际: {actual_type} | {'✅' if is_correct else '❌'}")

4.2 LLM的深度推理能力展示

实际运行可以看到LLM并非简单的猜涨跌,而是展现了惊人的多维度逻辑交叉验证能力。

案例分析:

2025-09-05 这一周,市场大跌1.84%,技术面看似走坏。但LLM在预测下一周(09-12)走势时,给出了 上涨 的预测,并给出了极具说服力的理由:

LLM Reasoning:
"综合分析显示趋势处于强劲的主升浪阶段。
1. **趋势与技术面**:价格收复失地重回MA5之上,均线多头排列完好。
2. **资金与情绪**:最显著的利好信号是 **IC基差率收敛至-0.11%(几近转正)**,显示市场极度乐观,空头对冲需求极弱;同时 **融资余额逆势增加**,杠杆资金大举进场。
3. **宏观环境**:美债收益率下行减轻外部压力,铜价上涨配合PMI回升,基本面复苏预期增强。
综上,资金面狂热配合宏观边际改善,看好下周惯性上冲。

实际结果:下一周确实上涨了3.32%。这一案例证明了LLM能够识别出缩量回调和基差异动等高级信号,通过宏观与微观的共振判断,过滤了单纯K线形态的欺骗性。

5 总结与展望

本文展示了一个完整的、生产级的AI量化分析Agent的实现过程。通过Python强大的数据处理生态(pandas, AKShare)与LLM的推理能力结合,成功将原本分散的、异构的金融数据转化为可解释的投资决策。

该系统的核心价值在于:

  1. 全维度视角的自动化:机器不会疲劳,能够每周例行检查数十个维度的指标。
  2. 逻辑的可解释性:相比黑盒的神经网络,LLM输出的文本逻辑让投资者敢于参考。
  3. 防过拟合的设计:通过周频聚合和宏观数据对齐,最大限度地还原了真实的决策场景。

未来优化方向

  • 引入RAG (检索增强生成),连接实时财经新闻库,增强对突发事件的感知。
  • 引入向量数据库,存储历史相似K线形态,让LLM具备历史类比的能力。
  • 细化仓位管理,让Agent不仅输出涨跌,还能建议具体的加减仓比例(如凯利公式结合)。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐