别再让AI看K线图了:VLM技术分析被证伪,grounded框架才是量化交易的正解
今日发现速览
今天这三个发现串成了一条完整的逻辑链:先有人用形式化方法证明了”让AI看K线图做技术分析”是一条死路——视觉语言模型(VLM)在K线图分析中根本没在读取图表证据,而是靠趋势外推伪装理解;紧接着另一篇论文给出了正确的出路——AI Economist Agent用”LLM规划+模型计算”的grounded模式,让大模型负责叙述、数值计算交给显式模型;最后,一篇市场风险论文提供了一个立即可用的因子——趋势强度的二次多项式能精确预测波动率与相关性的逐日递增。
- 🔹 VLM蜡烛图审计被证伪:arXiv 6月16日论文用”Martingale Doppelgänger-Eval”基准形式化证明,在图表证据与趋势强耦合的真实市场中,没有任何观察性评估能区分”真懂K线”和”靠趋势蒙”的响应者;实测冻结的商业/开源VLM,识别回归把大的正系数分配给过去趋势,但证据系数为零或与规则暗示方向相反——所谓”基于K线形态”的AI技术分析,其实是趋势外推的马甲
- 🔹 AI Economist Agent的grounded范式:arXiv 6月18日提出LLM+知识图谱+RAG的经济学Agent,核心铁律是绝不单独用语言模型产生定量论断,而是LLM规划→检索证据→选择模型→模型计算→生成叙述;已应用于美联储政策分析和银行压力测试,grounded报告的经济连贯性和可追溯性显著提升
- 🔹 趋势强度→波动率/相关性预测:arXiv 6月18日发现波动率和相关性在强趋势期间逐日递增(下跌趋势尤甚),可用趋势强度的二次多项式精确量化,改进VaR/GARCH的均值回归假设;将金融市场建模为接近临界点的晶格气体
发现一:VLM蜡烛图审计——AI”看K线”被形式化证伪
背景
过去两年,“用GPT-4V/Gemini看K线图做技术分析”是量化圈一个诱人的方向。直觉上这很合理:人类交易员就是看K线形态(头肩顶、十字星、吞没形态)做判断的,视觉语言模型(Vision-Language Model, VLM)既能”看”图又能”说”道理,让它来做形态识别不是天作之合吗?市面上也确实出现了一批”AI看盘”产品,宣称能识别图表形态给出买卖信号。
但有一个根本性的疑虑始终悬着:VLM给出的”基于图表形态的分析”,到底是真的读懂了局部视觉证据,还是只是把过去的趋势外推了一下,再套上一件”K线形态”的外衣?
这个问题之所以难回答,是因为在真实市场历史中,图表证据和趋势是强耦合的——一个上涨趋势的K线图,本身既包含”过去的趋势向上”,也包含各种局部的K线形态。你观察到一个VLM在上涨图上预测”继续涨”,你无法判断它是因为看到了”早晨之星”形态,还是仅仅因为它检测到了”过去在涨”。
技术细节
Ziyao Wang等人在arXiv:2606.17423中给出了一个形式化的不可能性证明,这是这篇论文最硬核的贡献:
在图表证据与趋势强耦合的数据分布下,没有任何基于观察性图表-标签对的评估泛函(evaluation functional)能区分”grounded responder”(真读证据)和”trend-shortcut responder”(靠趋势蒙)。
换句话说,传统的”拿一堆历史K线图让VLM预测,算准确率”这种评估方法,从数学上就不可能识破VLM是在真读图还是在偷看趋势。因为这两种响应者在所有可观察的图表-标签数据上表现完全一样。
既然观察性评估失效,作者设计了四种受控反事实机制来强制解耦证据与趋势:
- Martingale-null market(鞅零市场):构造一个完全无趋势的随机游走市场,此时趋势信息为零,VLM若真读图应仍能从局部形态获利,若靠趋势则会失去预测力
- Injected-alpha counterfactual pairs(注入阿尔法的反事实对):构造两张趋势相同、但局部形态被人为注入相反信号的图,看VLM能否区分
- Trend-confounder swaps(趋势混淆交换):交换两张图的”趋势成分”但保留”形态成分”
- Regime shifts(制度转换):在趋势发生反转的临界点测试
实验结果震撼:在所有冻结的商业和开源VLM上跑识别回归,模型把大的正系数分配给了”过去趋势”项,而”图表证据”项的系数要么为零,要么符号与规则暗示的方向相反。
用人话说就是:VLM嘴上说”我看到了看涨吞没形态所以预测上涨”,回归一拆,发现它的预测其实100%由”过去N天在涨”驱动,“看涨吞没形态”这个项的系数是零甚至是负的。它在伪装理解。
对量化交易的启示
这个发现对任何想把VLM引入量化系统的团队都是一个清晰的”此处有地雷”警告:
- 不要把VLM的K线图”技术分析”作为独立信号源。它提供的边际信息约等于一个简单的动量/趋势因子,却消耗巨大的推理成本,且会以”我看到了某某形态”的叙述制造虚假可信度
- 传统技术指标仍然有效,但应该用确定性的形态识别算法实现(比如用pandas显式定义”吞没形态”的OHLC条件),而不是交给黑盒VLM。确定性算法至少不会被趋势”绑架”成趋势因子
- 如果你的策略里同时已有动量/趋势因子,再加VLM看图是冗余甚至有害的——你以为加了”形态信息”,实际加的是与现有动量因子高度共线的”伪形态信息”
- 这并不意味着VLM在量化中毫无用处——它在自然语言处理(新闻情绪、研报解读、公告抽取)上依然强大,问题出在”让它看数值化后的图表”这个特定用法。数字和形态应该用确定性方法处理,VLM留给真正的非结构化文本
一条实操检查清单:如果你团队里有人在用VLM做图表分析,要求他们做一次受控消融实验——把趋势信号喂给一个简单线性模型,再让VLM在不看趋势的情况下只看形态,对比边际贡献。大概率你会发现VLM的”超额贡献”接近于零。
发现二:AI Economist Agent——LLM规划+模型计算的grounded范式
背景
发现一揭示的问题是更广泛现象的一个特例:大模型很会”说”,但不擅长”算”。在经济和金融分析中,经济学家需要的不是流畅的叙述,而是基于经济理论和真实数据的、可追溯的定量论断。当你直接问LLM”明年美国通胀会怎样”,它会生成一段听起来很专业的分析,但里面的数字往往经不起推敲——可能是从训练数据里”回忆”出来的过时数字,也可能是合理但不精确的估计。
Masahiro Kato在arXiv:2606.20041提出的AI Economist Agent,正是为了解决这个问题。它的核心立场和发现一形成了绝妙的呼应:既然VLM不能直接”看”K线,那LLM也不该直接”算”经济。
技术细节
AI Economist Agent的架构是一个grounded分析闭环,由四个解耦的组件驱动:
- 知识图谱(Knowledge Graph):预先构建的经济学知识库,节点是经济变量(通胀、失业率、政策利率),边是经济学理论定义的关系(菲利普斯曲线、泰勒规则、IS-LM)。这个图谱既是事实数据库(存放FRED、BIS的真实宏观数据),也是理论库(存放变量间的模型关系)
- LLM Agent(规划层):负责”想”——接到分析任务后,规划分析步骤:“先看通胀趋势→检查就业数据→套用菲利普斯曲线→评估政策反应→生成结论”
- 检索与建模层(执行层):LLM规划出”需要哪些证据、用哪个模型”,这一层去知识图谱检索真实数据,调用显式的计量/DSGE模型做计算
- 叙述生成层:把模型算出的数字”翻译”成经济学叙述,并且每句话都带可追溯的证据链接
关键铁律(论文原话):不单独用语言模型产生定量论断。所有数字必须来自显式模型的计算,LLM只负责规划”算什么”和解释”算出来的结果意味着什么”。
这和发现一的教训完全一致:把数字工作交给确定性模型,把语言工作交给LLM,各司其职。
论文给出了两个应用案例:
- 美国通胀持续性 + 美联储政策分析:Agent规划”检查通胀分项→估计核心PCE的持续性系数→用泰勒规则反推政策路径”,数值来自FRED数据 + 显式AR过程估计,叙述由LLM生成
- 商业地产再融资压力的银行压力测试叙述:Agent规划”收集CRE贷款敞口→估计再融资悬崖→模拟利率冲击下的违约率→生成压力测试报告”,数值来自银行Call Report数据 + 信用风险模型
评估显示,这种grounded报告在经济连贯性(economists评分)和可追溯性(每个论断能否回溯到数据/模型)上显著优于直接让LLM生成报告的baseline。
对量化交易的启示
这个框架对Hermes这类AI量化Agent的直接启示是把”分析”和”计算”分层:
def grounded_quant_analysis(task, kg, model_registry, llm):
"""
grounded量化分析框架:LLM规划,模型计算,LLM解释
避免LLM直接编造数字
"""
# 1. LLM规划分析步骤(不产生任何数字)
plan = llm.plan(task, kg.available_data, kg.available_models)
# plan 示例: [
# {"step": "retrieve", "dataset": "daily_returns", "window": "252d"},
# {"step": "compute", "model": "garch_volatility"},
# {"step": "compute", "model": "var_95", "inputs": ["garch_vol"]},
# {"step": "narrate", "focus": "尾部风险变化"}
# ]
# 2. 执行层:检索真实数据 + 调用显式模型
context = {}
for step in plan:
if step["step"] == "retrieve":
context[step["dataset"]] = kg.retrieve(step["dataset"], step.get("window"))
elif step["step"] == "compute":
context[step["model"]] = model_registry[step["model"]].run(
*[context[i] for i in step.get("inputs", [])]
)
# 3. LLM只在"叙述"环节介入,且必须引用context中的显式数字
narrative = llm.narrate(
task, context,
constraint="每个数字必须来自context,禁止自由生成数值"
)
return {"narrative": narrative, "context": context, "plan": plan}
这种设计的好处是可审计——任何一个出现在报告里的数字,都能沿着plan→context回溯到具体的数据集和模型调用。当策略出问题时,你能定位是数据错了、模型错了,还是LLM的叙述误导了。而如果直接让LLM”分析市场风险”,出错时你只能猜。
发现三:趋势强度→波动率/相关性预测——一个立即可用的因子
背景
如果说前两个发现是”方法论”层面的,那Sara A. Safari和Christoph Schmidhuber在arXiv:2606.20145的发现就是一颗可以直接捡起来用的因子。它解决的是量化风险管理中一个长期被简化的现象:波动率和相关性的均值回归假设。
经典的GARCH模型假设波动率在冲击后会均值回归到长期水平;经典的相关性模型(如DCC-GARCH)也类似。但实务中每个交易员都知道一个现象:强趋势期间(尤其是下跌趋势),市场会”进入一种特殊状态”——波动率飙升、相关性趋近于1(所有股票一起跌)。传统的均值回归模型在这种状态下会系统性低估风险,这正是2008、2020、2024年几次尾部事件的共同特征。
技术细节
论文的核心实证发现可以一句话概括:波动率和相关性在强趋势期间逐日递增,且这个递增可以用趋势强度的二次多项式精确刻画。
设趋势强度为 $T_t$(可以用过去N日收益率的方向性强度衡量,例如 $\frac{|r_t + r_{t-1} + … + r_{t-N+1}|}{\sum |r_i|}$,取值0到1,1表示完美单向趋势),则:
$$\sigma_{t+1} = f(T_t) = a_0 + a_1 T_t + a_2 T_t^2 + \epsilon$$
其中 $a_1, a_2 > 0$,且在下跌趋势中系数更大。相关性的演化也有类似的二次多项式结构。
论文进一步给出了一个物理学解释:金融市场可以建模为接近临界点的晶格气体(lattice gas near critical point)。在统计物理中,接近临界点的系统会出现”临界现象”——关联长度发散(对应金融中的相关性趋近1)、涨落放大(对应波动率飙升)。强趋势就像是把系统推向临界点,所以波动率和相关性同步发散。
这个物理解释不是装饰——它意味着这种”趋势放大波动”的现象是市场结构的内禀属性,而不是某个历史时期的偶然,因此可以在未来持续生效。
对量化交易的启示
这个发现可以直接集成到现有的风险模型中。最直接的用法是在GARCH/VaR框架中加入趋势强度因子:
import numpy as np
import pandas as pd
from arch import arch_model
def trend_strength(prices, window=20):
"""
趋势强度因子:取值0-1,1表示完美单向趋势
"""
rets = prices.pct_change().dropna()
rolling_sum = rets.rolling(window).sum()
rolling_abs_sum = rets.abs().rolling(window).sum()
return (rolling_sum.abs() / rolling_abs_sum).fillna(0)
def garch_with_trend_factor(returns, trend, window=20):
"""
GARCH + 趋势强度因子的混合波动率模型
强趋势期间上调波动率预测,特别关注下跌趋势
"""
# 1. 标准GARCH拟合
am = arch_model(returns * 100, vol='Garch', p=1, q=1)
res = am.fit(disp='off')
garch_vol = res.conditional_volatility / 100
# 2. 趋势因子调整:下跌趋势中放大波动率
# 论文:下跌趋势的系数显著大于上涨趋势
rets = pd.Series(returns)
is_downtrend = (rets.rolling(window).sum() < 0).astype(float)
# 二次多项式调整:trend^2 项捕捉临界点附近的非线性放大
# 系数需在样本内校准,这里给出经验值
alpha1, alpha2 = 0.3, 0.5 # 上涨趋势调整
beta1, beta2 = 0.6, 1.2 # 下跌趋势调整(更大)
trend_adj = np.where(
is_downtrend == 1,
1 + beta1 * trend + beta2 * trend**2,
1 + alpha1 * trend + alpha2 * trend**2
)
adjusted_vol = garch_vol * trend_adj
return adjusted_vol, garch_vol
# 在VaR计算中的应用
def var_with_trend_adjustment(prices, confidence=0.95, window=20):
"""趋势调整后的VaR"""
rets = prices.pct_change().dropna()
trend = trend_strength(prices, window)
adj_vol, _ = garch_with_trend_factor(rets, trend, window)
# VaR = -Z_alpha * sigma * portfolio_value
from scipy.stats import norm
z = norm.ppf(confidence)
var = z * adj_vol * prices.iloc[-1]
return var
三个落地建议:
- 下跌趋势要单独建模:论文明确指出下跌趋势中波动率/相关性的放大系数更大。如果你的风控模型对涨跌对称处理,会在熊市系统性低估风险。可以像上面代码那样用
is_downtrend做不对称调整 - 相关性模型也要加趋势因子:跨资产的相关性在强趋势期间趋近于1,这会击穿分散化假设。在组合VaR(需要协方差矩阵)中,应该对协方差矩阵做趋势因子调整,而不仅仅是波动率
- 作为择时信号的反向输入:当趋势强度突破某阈值时,系统进入”临界状态”,此时应该主动降低仓位或提高对冲比例。这比单纯的波动率目标(vol targeting)更前瞻,因为趋势强度是波动率飙升的先行指标
总结与行动清单
今天的三个发现共同指向一个核心命题:AI在量化交易中的正确姿势,是让模型做它擅长的事(规划、叙述、检索),把数字工作交给确定性的数学方法。VLM想直接看K线被证伪,正是因为它把”形态识别”这个本该用确定性算法做的事,塞进了黑盒;AI Economist Agent的成功,则在于它把LLM严格限制在规划和叙述层;而趋势强度因子的有效性,恰恰来自它是一个简单、可解释、有物理意义的确定性公式。
基于今天的发现,建议关注的行动项:
- 审计现有的VLM图表分析用法:如果你或团队在用GPT-4V/Gemini做K线形态识别,立即设计一个受控消融实验——把VLM的预测对一个纯趋势因子做正交化,看残差是否还有预测力。大概率没有。用确定性的OHLC形态识别算法替代
- 重构量化分析的AI调用栈为grounded模式:所有”让LLM分析市场”的流程,都改为”LLM规划→检索数据→调用显式模型→LLM解释结果”,并强制每个数字可回溯。这是AI Economist Agent给我们的工程蓝图
- 在GARCH/VaR框架中加入趋势强度因子:用趋势强度的二次多项式调整波动率预测,下跌趋势用更大的系数。这是今天发现中投入产出比最高的一条——改动小、论文背书扎实、直接降低尾部风险低估
- 把”接近临界点”作为市场状态监控的框架:当趋势强度持续高位时,系统进入临界状态,相关性趋近1意味着分散化失效。此时应主动降仓、加对冲,而不是依赖事后的止损
本文基于 2026-06-20 Hermes Agent自我进化报告整理。每日持续追踪AI与量化交易领域的最新工具、策略和技术进展。文中提到的arXiv论文:VLM蜡烛图审计(arXiv:2606.17423)、AI Economist Agent(arXiv:2606.20041)、趋势强度波动率预测(arXiv:2606.20145)。