系统架构和边界
本节介绍 Stock MCP 在投研场景下的数据体系及其能力边界,阐明 DolphinDB 数据底座如何支撑 AI 投研能力,以及 Stock MCP 工具在系统中的实际作用与限制。
数据体系
本项目数据存储在 DolphinDB 中,包括原始行情数据、财务数据与衍生指标,并面向量化投研场景重新组织成统一的因子化数据体系。该体系以“因子”为核心,将所有宽表结构(如日线、利润表、资产负债表等)的字段抽象为标准化的因子,并存放于结构统一的因子窄表中。同时,结合元数据表与向量语义检索机制,使 AI 能够理解因子含义、进行自然语言映射,并高效检索分析。
数据源
当前平台已经接入如下数据内容:
| 一级分类 | 二级分类 | 具体表 |
|---|---|---|
| 沪深股票 | 基础数据 | 股票列表 |
| 每日股本 | ||
| 股票曾用名 | ||
| IPO 新股列表 | ||
| 指数成分和权重 | ||
| ST股票列表 | ||
| 行情数据 | 日线行情 | |
| 周线行情 | ||
| 月线行情 | ||
| 每日指标 | ||
| 每日涨跌停价格 | ||
| 每日停复牌信息 | ||
| 个股资金流向 | ||
| 行业资金流向 | ||
| 财务数据 | 利润表 | |
| 资产负债表 | ||
| 现金流量表 | ||
| 利润表 | ||
| 资产负债表 | ||
| 现金流量表 | ||
| 指数数据 | 基础数据 | 股票列表 |
| 行情数据 | 日线行情 |
因子窄表(Narrow Factor Table)
因子窄表以统一格式存放全部指标,仅包含四列核心字段:tradetime、securityid、factorname 和 value。
所有宽表(如日线行情、利润表、资产负债表)中的字段会被转换为上述窄表结构,统一写入因子窄表。
这样做的好处包括:
- 模型无需关心指标来源表
- 查询格式统一(例如:按 securityid + factorname 查询即可)
- 支持上千个因子,表结构依然稳定
例如“净利润”、“ROE”、“市值”、“PB”、“营业收入同比”、均按统一格式记录在因子窄表中。
元数据表(Metadata Table)
元数据表记录了每个因子的基本信息,包括因子名和中文描述(如“净利润”、“毛利率”、“滚动市盈率”)。
这让系统能够把用户用自然语言表达的指标需求(比如“净利润”)映射到具体的因子名。
向量语义检索(VectorDB)
为了让 AI 能根据自然语言找到最可能的指标,我们将因子的中文描述和对应的 Embedding 向量结合起来,构建了一个语义检索器。
例如,档用户说:“净利润”时,系统会从 5000+ 因子里挑出最相关的 20 个候选:
- net_profit
- net_profit_growth
- pe(市值/净利润)
- roe
- ……
然后再让 AI 基于这些候选做更精确的判断。
这样做的原因很简单:
- 所有因子一次性发送给大模型会超出 Token 限制
- 筛选最相关的候选既提高准确度,也更快、更不容易混淆
因子体系的作用
这套体系让 AI 可以稳定地完成三类任务:
- 根据 securityID 查指标(单股票、单指数)
- 按指标筛选股票(构造 WHERE 条件)
- 进行单因子评价和多因子回测(因子名完全一致,便于引用)
简而言之,因子窄表统一了所有指标的存储方式,元数据表和向量检索统一了自然语言理解方式。
这样,AI 才能在整个投研链条里稳定地理解用户的意图,并找到正确的数据。
现有的指标名列表
| 指标名 | 指标描述 |
|---|---|
| S | 是否停牌(1=是,0=否) |
| circ_mv | 流通市值(万元) |
| LN | 收盘价的自然对数;常用于对数收益、稳定方差变换 |
| ASI_26 | 振动升降指标 ASI(M1=26) |
| TRMA_20_of_TRIX | TRIX 的 20 日均线 |
| BR_26 | BRAR 指标中的 BR(买卖强弱对比) |
| HHV_10_close | 收盘价10日滚动最高值(近10日最高收盘价) |
| WR1_6 | 威廉指标 WR1(N1=6) |
| TAQ_DOWN_10 | 唐安奇通道下轨(N=10) |
| turnover_rate | 换手率(%) |
| dv_ttm | 股息率(TTM,%) |
| ma_v_5 | 5日均量 |
| HHVBARS_10_close | 距离近10日滚动最高值的“期数距离”(高点到当前的间隔) |
| DMI_ADXR_14_6 | DMI 的 ADXR(ADX 的再平滑) |
| MAEMV_9_of_EMV | EMV 的 9 日均线 |
| ROC_12 | 价格变动率(N=12,%) |
| pe_ttm | 市盈率(TTM) |
| volume_ratio | 量比 |
| ma_v_20 | 20日均量 |
| ma_v_50 | 50日均量 |
| up_limit | 涨停价 |
| star_market_board | 是否创业板(1=是,0=否) |
| net_profit | 净利润 |
| STD_5_close | 收盘价5日滚动标准差(短期波动率近似) |
| LLVBARS_10_close | 距离近10日滚动最低值的“期数距离”(低点到当前的间隔) |
| WMA_10_close | 收盘价10日加权移动平均(越近权重越大) |
| AVEDEV_10_close | 收盘价10日平均绝对偏差(另一种波动刻画) |
| MACD_DEA | MACD 的 DEA 信号线(DIF 的 EMA 平滑) |
| BIAS1_6 | 乖离率1(与 MA6 的相对偏离,%) |
| DPO_20_10_6 | 区间震荡线 DPO(M1=20,M2=10,M3=6) |
| EXPMA_N1_12 | EXPMA 的第一条指数均线(N1=12) |
| net_profit_margin | 环比净利润增长率 |
| DIFF_1_close | 收盘价与其1期滞后的差分(近似当日价格变动量) |
| DMA_close_0_5 | 动态加权移动平均(alpha=0.5),对收盘价做指数平滑 |
| KDJ_K | KDJ 指标的 K 值(N=9,M1=3,M2=3) |
| KDJ_D | KDJ 指标的 D 值 |
| KDJ_J | KDJ 指标的 J 值(3K-2D,放大震荡) |
| BOLL_UPPER_20_2 | 布林带上轨(N=20,P=2) |
| PSYMA_6_of_PSY12 | PSY 的 6 日均线(M=6) |
| DMI_ADX_14_6 | DMI 的 ADX(趋势强度,不分方向) |
| TAQ_UP_10 | 唐安奇通道上轨(N=10) |
| TAQ_MID_10 | 唐安奇通道中线(N=10) |
| MTM_12 | 动量 MTM(CLOSE - REF(CLOSE,12)) |
| pct_chg | 涨跌幅(%) |
| close | 收盘价 |
| change | 涨跌额 |
| ma50 | 50日均价 |
| down_limit | 跌停价 |
| pb | 市净率(总市值/净资产) |
| ps | 市销率 |
| MAX_CO | 逐元素比较收盘价与开盘价,取较大者(当日高位代表性近似) |
| MIN_CO | 逐元素比较收盘价与开盘价,取较小者(当日低位代表性近似) |
| SUM_5_vol | 成交量5日滚动求和(短期累计成交量) |
| EMA_10_close | 收盘价10日指数移动平均(更重视近端数据) |
| SLOPE_11_close | 收盘价在11日窗口的一元线性回归斜率(趋势强弱) |
| MADPO_6_of_DPO | DPO 的 6 日均线 |
| EXPMA_N2_50 | EXPMA 的第二条指数均线(N2=50) |
| list_days | 上市天数 |
| pre_close | 昨收盘价 |
| amount | 成交额(千元) |
| adj_factor | 复权因子 |
| free_share | 自由流通股本(万股) |
| vol | 成交量(手) |
| ST | 退市风险标记(0=非ST,无退市风险;1=ST,有退市风险) |
| is_down_limit | 是否跌停(1=是,0=否) |
| POW_2 | 收盘价的平方(N=2 的 POW),用于二次变换或方差相关计算 |
| WR_10 | 威廉指标 WR(N=10) |
| BIAS2_12 | 乖离率2(与 MA12 的相对偏离,%) |
| BIAS3_24 | 乖离率3(与 MA24 的相对偏离,%) |
| PSY_12 | PSY 心理线(N=12),统计近 N 日上涨天数占比 |
| TRIX_12_20 | TRIX 三重指数平滑的变化率(%)(M1=12, M2=20) |
| DFMA_DIF_10_50_10 | DFMA 的差值线 DIF(MA10 - MA50) |
| MASS_9_25 | 梅斯线 MASS(N1=9,N2=25) |
| MAMASS_6 | MASS 的6日均线 |
| MAROC_6 | ROC 的6日均线 |
| debt_ratio | 资产负债率 |
| is_up_limit | 是否涨停(1=是,0=否) |
| MA_10_close | 收盘价10日简单移动平均(短期均线) |
| BOLL_LOWER_20_2 | 布林带下轨(N=20,P=2) |
| AR_26 | BRAR 指标中的 AR(M1=26) |
| pe | 市盈率(总市值/净利润) |
| ps_ttm | 市销率(TTM) |
| dv_ratio | 股息率(%) |
| total_mv | 总市值(万元) |
| ABS | 收盘价的绝对值(常用于差值/收益等中间量) |
| SMA_10_1_close | 收盘价的通达信风格平滑均线(N=10,M=1 的 SMA) |
| MACD_BAR | MACD 柱线((DIF-DEA)*2),正负反映多空强弱 |
| EMV_14 | EMV 简易波动(N=14) |
| MTMMA_6 | MTM 的6日均线 |
| ma20 | 20日均价 |
| turnover_rate_f | 换手率(自由流通股) |
| REF_1_close | 收盘价向后平移1期(上一交易日的收盘价) |
| LLV_10_close | 收盘价10日滚动最低值(近10日最低收盘价) |
| DMI_MDI_14_6 | DMI 指标的 MDI |
| DFMA_DIFMA_10_50_10 | DFMA 的 DIF 平滑线(M=10) |
| total_share | 总股本(万股) |
| high | 最高价 |
| main_board | 是否主板(1=是,0=否) |
| chi_next_board | 是否科创板(1=是,0=否) |
| ROE | 净资产收益率 |
| SQRT | 收盘价平方根;用于尺度变换 |
| FORCAST_12_close | 收盘价在12日窗口的一元线性回归预测值(线性外推) |
| MACD_DIF | MACD 的 DIF 线(快慢 EMA 之差,SHORT_=12,LONG_=26,M=9) |
| BOLL_MID_20 | 布林带中轨(MA20) |
| DMI_PDI_14_6 | DMI 指标的 PDI(M1=14,M2=6) |
| ASIT_10_of_ASI | ASI 的10日均线(M2=10) |
| open | 开盘价 |
| low | 最低价 |
| ma5 | 5日均价 |
| float_share | 流通股本(万股) |
能力边界
Stock MCP 工具能帮助用户在投研工作中完成因子查询、选股和回测配置生成等任务,但每类场景有明确的能力边界。以下按四个主要场景说明 MCP 的能力与限制。
场景一:股票 / 指数信息查询
快速获取单只股票或指数的各类指标和基础信息,MCP 会自动理解用户意图,将自然语言映射到对应因子。
功能范围
- 通过股票代码或名称获取该股票的:
- 基础信息(行业、市值、上市日期等)
- 行情信息(多频行情)
- 财务指标(利润表 / 资产负债表 / 现金流量表)
- 每日指标(估值、成长、盈利能力、风险指标等)
- 通过指数代码查询:
- 指数基本信息
- 指数日线行情
- 结合元数据表自动识别用户意图:例如,用户说“给我看下茅台的盈利能力”,系统自动选出净利润、ROE、毛利率等相关因子
功能限制
无法跨标的自动聚合或推断多个指标:例如:“给我总结 A 股盈利能力最强的行业”属于统计任务,不在该查询范围。
场景二:按指标筛选股票(选股工具)
使用自然语言筛选股票,Stock MCP 会将条件映射到具体因子,并返回符合条件的股票列表,支持共享表写入方便后续回测。
功能范围
- 根据用户提供的自然语言筛选条件,通过元数据表找到对应因子:
例如“选 PB 小于 1 且 ROE 大于 10% 的股票”,系统会自动映射到 pb、roe 因子
- 支持的筛选维度包括:
- 指标条件(filter_expr)
- 行业过滤(industry)
- 指数成分过滤(base_index:CSI 1000 / SZ50 / HS300)
- 时间区间过滤
- 必要因子校验(factors 列表与表达式匹配)
- 返回内容:
- 符合条件的股票列表
- 选股数量
- 写入共享内存表(用于后续回测)
- 统一因子频率为日频,与因子窄表自然对齐
功能限制
- 不支持连续满足条件的选股逻辑
- “过去一周每天市值都 > 100 亿”
- “连续 20 天收盘价 > MA20”
当前仅支持:
- “过去一周至少一天市值 > 100 亿”
- 不支持月频/周频因子的筛选
例如财报类因子 yoy、qoq 不支持直接出现在 filter_expr 中
- 不支持自然语言自动推断因子本体,例如:“找增速快的股票”,必须提供可解析的条件(如 net_profit_growth > 0)
- 不支持跨市场/跨指数组合筛选:同一条规则仅在一个指数成分池或行业内执行
场景三:单因子评价(因子测试)
对单个因子进行全面评价,包括因子收益、分层收益和行业分组回测等,用于验证因子有效性。
功能范围
- 支持对任意单个因子进行全面评价,包括:
- 因子收益(RankIC、PearsonIC)
- IC 分布与稳定性
- 分层收益
- 多空组合收益
- 行业分组回测
- 支持自定义持有期(holdingPeriod)
- 支持行业过滤
- 支持任意时间区间(历史数据完备)
功能限制
- 不支持多因子联合 IC 或多因子组合排序评价:单因子评价必须只有一个因子名
- 不支持分钟级或高频因子测试:当前全部因子均为日频
- 不自动推断因子归一化方式/收益计算方式:需要明确给定因子名称,winsorize、zscore、neutralize 需用户明确
场景四:多因子策略回测(回测配置生成)
使用自然语言描述多因子策略,Stock MCP 会生成完整的回测配置,便于后续直接运行回测。
功能范围
- 根据用户输入的自然语言策略要求生成完整回测配置,包括:
- 回测基础设定(日期、初始资金、benchmark)
- 多因子列表(factors)
- 因子权重
- 仓位规则(如 max_stocks、equal/score 加权)
- 调仓规则(按周几、最少持有天数)
- 交易规则(手续费率)
- 股票池来源(选股工具生成的共享表)
- 自动生成唯一回测 ID 并写入回测配置
- 检查所有参数合法性并返回完整配置 JSON
功能限制
- 不运行回测,也不计算回测收益:MCP 只生成配置,不执行回测
- 不自动推断因子、权重、调仓频率:用户必须明确告诉 MCP 使用哪些因子与权重。
- 不支持除了日频多因子选股策略之外的复杂交易逻辑策略,如:
- 趋势过滤
- 动态仓位(如凯利比例)
- CTA / 高频策略
