爱建证券 ETF 轮动选基策略
下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-07epl2hq--aijian-etf-rotation.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-07epl2hq/aijian-etf-rotation。爱建证券 ETF 轮动选基策略——基于多因子动量的 ETF 轮动筛选与仓位管理。当用户询问 ETF 选基、轮动交易、动量打分、市场状态识别(正常期/震荡期/阴跌期)、仓位管理、止盈止损、ETF 组合配置、防御切换等问题时激活本技能。覆盖 39 只跨资产 ETF(黄金/商品/QDII 海外/A 股宽基/红利低波/证券金融/债券货币),通过对数线性拟合动量打分、拉普拉斯/高斯双滤波器切换、三态市场识别和七层风控过滤,给出每日轮动选基建议。
行情数据三源取数(参照 aijian-stock-analysis 双源口径扩展):westock-data(腾讯自选股)结构化主源 + neodata(融智)补充源 + akshare(纯 Python 自动抓取,兜底);westock/neodata 不可用时由 akshare 自动兜底,无需手工导数据。
阅读全文 (展开查看完整说明)
概述
爱建证券 · ETF 轮动选基
概述
本技能实现一套「多因子 ETF 轮动选基策略」:通过对数线性拟合(log-linear regression)计算年化动量并乘以 R² 作为质量修正,叠加均线排列因子,再经七层风控过滤与双滤波器趋势确认,从 ETF 池中筛选出当前最具上涨潜力的标的,并给出仓位与调仓建议。
两种运行模式(按使用次数自动选择):
- 首用模式(默认,全市场一体化):客户第一次使用时,不依赖任何预置池,直接跑
scripts/first_use_market.py—— 全市场搜索(新浪链路 1700+ 只)→ 流动性过滤 → 动量粗筛打分 → 主题去重自动选池(默认 42 只)→ 轮动分析 → 输出「首用全市场轮动报告.html」(含首用·全市场筛选模块)。 - 日常模式(固定池轮动):非首次、或客户已有偏好范围时,在人工精选的 42 只跨资产「维护池」内做每日轮动(
fetch_westock.py/fetch_akshare.py→rotation_analysis.py→generate_report.py),池子维护见references/rotation_sop.md§4。
决策哲学:动量为王、趋势确认、风险先于收益。不追求抓底逃顶,而追求趋势确认后顺势而为,市场转弱时果断防御。
⚠️ 合规声明(2026-10-24 合规改造后固化):所有分析仅为策略研究输出,不构成投资建议,亦不构成任何收益承诺;报告内“年化/动量年化”均为历史动量测算值(对数线性拟合),不代表未来表现与已实现回报,基金过往业绩不代表未来表现。报告未考虑您的个人风险承受能力、投资目标与资产状况,请结合自身适当性评估审慎决策,并咨询您的投资顾问。爱建证券投顾落地时应结合客户风险等级、账户类型与适当性要求。数据需以爱建证券研究终端、交易所与基金公司公告为准。
核心能力
- 多因子动量打分:对数线性拟合年化动量 × R²(拟合优度)× 均线排列因子(MA5>MA10>MA20 → 1.3,MA5>MA10 → 1.1,MA10>MA20 → 1.0,否则 0.7)。
- 三态市场识别:基于沪深300(510300.SH)的乖离率、RSI、回撤、20日收益,判断「正常期/震荡期/阴跌期」,据此切换选股逻辑与仓位策略。
- 双滤波器趋势确认:正常期用拉普拉斯滤波器(s=0.05,斜率>0.001);震荡期切高斯滤波器(σ=1.2,斜率>0.002),价格须高于滤波值。
- 七层风控过滤:R²阈值→近3日跌幅→成交量放量→短期动量→盈利保护→卖出冷却→低相关守卫。
- 防御性仓位管理:阴跌期全仓转入货币ETF(511880.SH);震荡期无标的可空仓;止盈+30%,止损-10%。
- 跨资产轮动视野:覆盖贵金属、商品、QDII海外、A股宽基、红利低波、证券金融、债券货币 7 大类 42 只 ETF(首用模式自动选池同样按主题去重保证跨资产覆盖)。
资源说明
本技能包含以下可复用资源,执行流程中按需加载:
references/(策略知识库,按需加载)
references/etf_pool.md—— 42 只 ETF 维护池(7 大类清单;日常模式标的范围,维护两处同步点之一)。首用模式无需预置此池,由全市场自动选池生成。references/parameters.md—— 核心参数表(基础/R²/跌幅/成交量/短动量/盈利保护/卖出冷却/相关性/拉普拉斯/高斯/震荡/阴跌/止盈止损)。调整任何参数前必读。references/strategy_details.md—— 三态市场识别机制、选股打分算法伪代码、交易执行规则、策略性能与风险点详解。执行选基与状态判断时加载。references/compliance_review.md—— 合规闭环方法论(审查→修复→复核):四步审查法、整改落点对照表(M1-M4/L5-L9 修什么改哪里)、24 项综合校验清单、渲染级文案提取工具用法、校验避坑。合规作业/大版本变更后必读。
scripts/(量化计算脚本,可直接执行,依赖 numpy)
scripts/momentum_score.py—— 对数线性拟合动量打分核心算法。输入收盘价序列,输出年化收益、加权 R²、综合得分、均线排列因子。python scripts/momentum_score.py --help查看用法。scripts/market_state.py—— 三态市场状态识别。输入沪深300行情,输出正常期/震荡期/阴跌期及判断依据。动作文案不带「策略信号:」前缀(前缀由模板 action-box 标签承担;2026-10-26 修 L9,避免渲染"策略信号:策略信号:"双重前缀)——不输出"满仓/清仓"等指挥语。scripts/filters.py—— 七层风控过滤 + 拉普拉斯/高斯双滤波器实现。输入候选标的行情,输出通过/拦截结果与原因。scripts/rotation_analysis.py—— 主入口,整合全流程:数据获取→状态判断→打分→过滤→排名→仓位建议。支持--format json/report。python scripts/rotation_analysis.py --help查看用法。风险提示内建合规要素(2026-10-24 固化,勿删):收益口径声明(R1)/适当性提示(R2)/QDII 点名(C3,_is_qdii扩展判定)/集中度提示(C7)——见「输出规范·合规要素内建」。scripts/generate_report.py—— 将rotation_analysis.py --format json的输出渲染为爱建证券品牌 HTML 看板(含数据新鲜度横幅、口径与用途声明条、市场状态研判+指标条、动量排名+合格比例环、图表分析【动量得分条形图/年化收益对比(红涨绿跌)/价格走势+MA20折线图】、风险提示)。所有图表均为纯 SVG/HTML/CSS、零外部依赖(离线可用);渲染时自带合规要素(模板含声明条/脚注/页脚免责/「动量年化(测算)」口径,见「输出规范·合规要素内建」)。scripts/extract_visible_text.js—— 合规复核辅助:报告「真实可见文案」渲染级提取(Node 零依赖)。stub Document 执行报告内联 JS,还原用户实际看到的各板块拼接文本(能抓到"策略信号:策略信号:"这类源码 grep 不到的运行时重复)。node scripts/extract_visible_text.js <报告.html> [--json],详见references/compliance_review.md§4。scripts/fetch_akshare.py—— akshare 兜底取数:自动抓取 42 只 ETF + 沪深300 的日线(东财→新浪自动回退),生成rotation_analysis.py所需的market_data.json,无需手工导数据;写入meta(data_as_of/stale_days/休市标签)供下游做数据新鲜度约束。python scripts/fetch_akshare.py --output market_data.json一键生成。scripts/fetch_westock.py—— westock 主源取数:取池内 42 只 K 线生成market_data.json(3 线程 + 限频重试;复用 fetch_akshare 的CODE_NAME与新鲜度逻辑)。scripts/pool_market_scan.py—— 全市场扫描(新浪链路,42s 扫 1700+ 只):全市场清单 → 流动性过滤 → 动量打分 → 现池对比,产出market/all_sina.csv/market/candidates.csv/market/pool_health.json,供池子维护决策。scripts/first_use_market.py—— 🎯 首用·全市场一体化(首用模式入口):全市场搜索 → 流动性/数据过滤 → 动量粗筛 → 主题去重自动选池(默认 42 只)→ 轮动分析 → 生成「首用全市场轮动报告.html」(首用模块仅显式渲染,向后兼容;零外部依赖)。python scripts/first_use_market.py --size 42 --top 5 --outdir first_use。v1.1:主题规则经排序铁律修正(债券/货币前置,宽基关键词精确——"科创债ETF/消费50ETF"不再误判);内置断点续跑(崩溃重跑自动复用已完成标的,--no-checkpoint强制全新)。run.bat/run.sh—— 一键流水线(日常模式):fetch → rotation_analysis → generate_report 三步串跑(用%~dp0/相对路径规避参数路径坑),输出market_data.json/result.json/轮动选基报告.html到当前目录。
工作流程
当用户提出 ETF 选基、轮动、仓位管理等相关问题时,按以下流程执行:
Step 0:模式选择(先判定,再执行)
路由规则(2026-10-24 固化):只要用户请求语义命中「重新全市场筛选入池 / 重新入池 / 全市场重新筛一遍 / 换一批标的 / 重选池子」(即"想从全市场重新生成/刷新轮动池"),无需再问,直接执行
scripts/first_use_market.py。
- 首次使用 / 客户无既有偏好 / 想从全市场找机会 / 主动要求重新全市场筛选入池 → 走 首用模式:一条命令完成「全市场搜索 → 筛选 → 自动选池 → 轮动推荐 → 报告」,无需预置池:
python scripts/first_use_market.py --size 42 --top 5 --outdir first_use内部流程:新浪全市场清单 → 流动性过滤(≥5000万)→ 动量粗筛打分 → 主题去重自动选池(默认42只,实操流动性≥1亿,另计 7 大类跨资产覆盖)→ 轮动分析 → 生成「首用全市场轮动报告.html」(首用·全市场筛选模块:扫描漏斗 KPI + 自动选池清单 + 强势候选 Top15)。
- 非首次 / 已有维护池 / 只想做每日轮动 → 走 日常模式(固定 42 只维护池),继续 Step 1 及以下。
Step 1:数据获取(参照 aijian-stock-analysis 双源口径)
本技能统一通过 westock-data(腾讯自选股) + neodata(融智金融数据) + akshare(纯 Python 自动抓取,兜底) 三源取数,不混用其它金融 Skill / 网页抓取(避免口径不一致产生幻觉)。三个源各司其职,同一指标只从一个源取:
- westock-data(腾讯自选股,结构化数据权威入口)—— 主结构化源
- 覆盖:ETF 实时行情/市值/规模/溢价率(
quote)、历史日 K 线 收盘价/最高价/成交量(kline)、ETF 持仓与净值(etf profile)、技术指标(technical) - 调用(⚠️ 关键):westock-data 是 Go 编译的 CLI,不在 PATH,以绝对路径调用(默认安装到
~/.local/bin/westock.exe):
- 覆盖:ETF 实时行情/市值/规模/溢价率(
“bashWESTOCK=~/.local/bin/westock.exe # 你机器上的实际绝对路径"$WESTOCK" kline sh510300 --period day --limit 120 # 沪深300 基准"$WESTOCK" kline sh518880 --period day --limit 120 # 42 只池每只各一条"$WESTOCK" quote sh518880 # 实时行情/规模/溢价率"$WESTOCK" etf profile sh518880 # 持仓/净值"$WESTOCK" technical sh518880 # 技术指标“
- A 股用
sh/sz前缀(如sh510300);命令不清先"$WESTOCK" --help - ⚠️ 首次使用需完成 APIKey 鉴权:
"$WESTOCK" auth status→ 若返回AUTH_REQUIRED:<url>,浏览器扫码授权后轮询"$WESTOCK" auth fetch至TOKEN_READY - 适配:模型所需
closes/highs/volumes首选此源kline(每只 ≥120 交易日,最新价在末尾) - neodata(融智金融数据,自然语言补充源)
- 覆盖七大类:股票/指数/板块/基金/宏观/外汇/大宗;含行情、资金流向、研报评级、公告、行业与产业链数据
- 调用(⚠️ 关键):用 WorkBuddy 托管 managed python3 运行其
scripts/query.py(须先在可写目录运行,token 缓存于.neodata_token):
“bash ND=~/.workbuddy/skills/neodata-financial-search/scripts/query.py python3 "$ND" --query "沪深300ETF 510300.SH 最近120个交易日日K线 每日收盘价 最高价 成交量" “
- 适配:westock-data 缺失/被限流的回溯段、跨市场行业数据、资金流向,优先 neodata
- akshare(纯 Python 免费源,兜底自动取数)
- 覆盖:A 股/港股/海外上市 ETF 与 LOF 的历史日线(东方财富
fund_etf_hist_em/fund_lof_hist_em),含收盘价/最高价/成交量,无需 APIKey、无二进制、不受沙箱执行策略拦截 - 调用(⚠️ 关键):用托管 python3 + 已装
akshare直接跑,自动落地market_data.json:
- 覆盖:A 股/港股/海外上市 ETF 与 LOF 的历史日线(东方财富
“bashpython scripts/fetch_akshare.py --output market_data.json # 默认回溯500天(约2年交易日)python scripts/fetch_akshare.py --output market_data.json --adjust qfq # 前复权“
- 脚本自动遍历 42 只池 + 沪深300,翻转为升序(最新价在末尾)、标
source: akshare;单只不足 80 交易日自动跳过并提示 - 适用:westock-data / neodata 均不可用时的唯一自动路径,免去任何手工导数据
数据分工原则:结构化行情/K线/ETF持仓 优先 westock-data;自然语言合成 / 跨市场历史 / 资金流向优先 neodata;二者皆不可用 → akshare 自动兜底;仍缺的极端缺口,才降级到 WebFetch 抓交易所与巨潮原文(且须告知用户数据来源)。
数据要求:每只标的需 closes/highs/volumes 各 ≥80 个交易日(推荐 ≥120),时间升序、最新价在末尾;新上市 ETF 数据不足应跳过。日常模式加载 references/etf_pool.md 确认 42 只标的范围;首用模式由 first_use_market.py 自动确定。
📎 数据溯源(重要):每条外部数据记录来源,构造 market_data.json 时在各标的下以 source 字段引用(westock-data / neodata / akshare);缺失则填 null,禁止编造。推荐用 scripts/fetch_akshare.py 一键自动生成 market_data.json(含 source 标注),再直接喂 rotation_analysis.py,无需任何手工填数。
Step 2:市场状态判断
基于沪深300(510300.SH)计算:20日均线、乖离率、RSI(14)、20日回撤、20日收益。判断当前处于「正常期/震荡期/阴跌期」,并向用户说明判断依据。详细判断条件见 references/strategy_details.md 第三节。
快速判断规则:
- 阴跌期(最强防御):回撤 ≥ 12% 或 20日收益 ≤ -8%,且价格 < 20日均线 → 清仓转 511880.SH
- 震荡期:乖离率 > 10%,或 RSI 从 >75 回落至 <60 → 切高斯滤波器,可空仓
- 正常期:默认状态 → 拉普拉斯滤波器,满仓单标的轮动
可执行 scripts/market_state.py 辅助计算。
Step 3:标的筛选与打分
对 ETF 池标的依次执行(日常模式 42 只维护池;首用模式为自动选池结果,详见 references/strategy_details.md 第四节):
- 前置过滤:数据充足性 → 卖出冷却(2日)→ 盈利保护(近1日最高价回撤>5%剔除)
- 动量计算:对数线性拟合(线性递增权重)→ 年化收益 × 加权R² → 可执行
scripts/momentum_score.py - 风控过滤(按顺序):R²<0.35剔除 → 近3日单日跌幅>3%剔除 → 量比>2且年化>100%剔除 → 10日年化<0剔除 → 滤波器确认
- 质量加权:乘以均线排列因子(1.3/1.1/1.0/0.7)
- 低相关守卫:与持仓/近期卖出/沪深300的20日收益相关性 ≥ 0.88 剔除
可执行 scripts/filters.py 与 scripts/rotation_analysis.py 辅助计算。
Step 4:排名与推荐
按综合得分降序排列,推荐 Top 1-3 标的。说明每只标的的:动量得分、年化收益、R²、均线排列状态、通过/未通过的过滤器。
Step 5:仓位建议
根据市场状态给出仓位建议:
- 阴跌期 → 全仓 511880.SH(货币ETF)防御,最小防御期5天
- 震荡期有标的 → 按排名买入;无标的 → 空仓等待
- 正常期有标的 → 满仓 Top 1(holdings_num=1);无标的 → 转 511880.SH 防御
- 止盈位 +30%,止损位 -10%
Step 6:风险提示与报告
说明当前策略潜在风险点:滤波器切换信号、阴跌期触发条件、相关性集中度、QDII 溢价率(>3% 慎入)、参数敏感性等,并生成可交付的 HTML 看板报告。
# 生成 JSON 结果
python scripts/rotation_analysis.py --input market_data.json --top 5 --format json > result.json
# 渲染为爱建证券品牌 HTML 看板
python scripts/generate_report.py result.json --output 轮动选基报告.html输出规范(HTML 看板结构,强制对齐)
生成 轮动选基报告.html 必须严格包含以下顺序的模块(与 assets/report_template.html 一致):
🕒 数据新鲜度横幅 ← 顶部,过期/休市强提示(约束 C1)
📌 口径与用途声明条 ← 页头警示条,统一收口 4 条口径(收益测算/动量得分/研究定位/数据基准日指引)
📊 市场状态研判 ← 状态徽章 + KPI(乖离率/RSI/回撤/20日收益/现价MA20) + 判断依据/策略信号(单前缀)
└ 市场研判指标条 ← RSI/乖离率/20日收益/20日回撤,带零基线,红涨绿跌
🏆 ETF动量排名(Top) ← 表格 + 合格标的比例环(合格 X / 全池 Y,占池通过率 Z%)
📈 图表分析 ← ①动量得分横向条形图 ②动量年化对比(历史测算·红涨绿跌) ③价格走势+MA20折线图(归一化%)
🔔 风险提示 ← 新鲜度/震荡期/QDII溢价率/集中度等已按要求移除:报告中不得再出现「过滤器拦截情况」明细列表与「仓位建议」板块(用户于 2026-10-07 明确要求去除)。rejected / position_advice 仍保留在 result.json 数据层(供风险逻辑与下游复用),但看板不渲染、文本报告也不输出(约束 C10)。
合规要素内建(2026-10-24 固化 · 勿删勿弱化):以下合规要素已内建到生成链(rotation_analysis.py 风险提示 + market_state.py 动作文案 + report_template.html),任何一次报告输出必须自动保留,不得因后续重构删除或弱化,也不得在最终交付时手动去掉:
| # | 合规要素 | 落地位置 | 说明 |
|---|---|---|---|
| R1 | 收益口径声明 | rotation_analysis 风险提示 + 模板脚注 | 「年化/动量年化」=历史动量测算值(对数线性拟合),不代表未来表现与已实现回报;表头写「动量年化*」并加脚注;页脚含完整免责 |
| R2 | 适当性提示 | rotation_analysis 风险提示 | 「未考虑个人风险承受能力/投资目标/资产状况,不构成个性化投资建议,请咨询投资顾问」 |
| R3 | 策略信号措辞 | market_state 动作文案 + 模板 action-box 标签 | 「策略信号:」前缀由模板 action-box 标签承担;market_state.py action 一律不带前缀(2026-10-26 修 L9 避免"策略信号:策略信号:"重复);禁用「满仓/清仓/买入/卖出」等指挥语 |
| R4 | QDII 点名(C3) | rotation_analysis 风险提示 | 实际入选 QDII 时点名:⚠️ 推荐标的 {code}({name})为 QDII 类,实盘先查溢价率,>3% 慎入 |
| R5 | AI 标识/研究定位 | 页脚免责 | 「本报告由 AI 基于历史数据生成,仅供爱建证券策略研究与内部演练使用,不构成投资建议,亦不构成任何收益承诺」 |
校验口径:合规检查后新增/改动任何文案都不得引入新的承诺性表述(如"保证收益/稳赚/必涨");
_is_qdii()、_QDII_THEME_KW、C7 文案、R1/R2 文案在rotation_analysis.py中均有出处,勿删。首用·全市场筛选模块的候选扫描表沿用「年化收益」列,为粗筛打分口径、非最终推荐收益(对应合规检查 R4 首用模块边界),交付口径仍以排名表「动量年化*」为准。
语言与风格:
- 价格涨跌遵循中国市场惯例:涨用红色,跌用绿色(爱建证券品牌一致)
- 货币单位默认人民币 ¥
- 专业术语首次出现给出中英文对照
关键口径约束
- 币种统一:价格/收益以人民币计;QDII 类 ETF 以本币净值折算,需标注溢价率。
- 利润/收益口径:动量年化基于对数收益,250 交易日年化,与 R² 加权。
- 参数敏感性:核心参数(r2_threshold、loss、bias_threshold 等)已回测优化,调整时需重新回测。详见
references/parameters.md。 - 不荐股:仅输出策略研究与选基建议,不带买卖评级;最终决策由客户/投顾结合适当性作出。
- 禁止编造:ETF 净值、规模、溢价率等以数据源为准;缺失则标注"数据不足"并跳过该标的。
运行约束与护栏(硬约束)
以下约束为强制纪律,任何一次选基输出都不得违反;违反任一条即视为技能误用。
- C1 · 数据新鲜度约束(最重要):
fetch_akshare.py自动写入market_data.meta(data_as_of / stale_days / market_status)。rotation_analysis.py会透传并在risk_warnings首行给出强提示,报告看板顶部也会渲染「数据新鲜度」横幅:stale_days > 7且非休市 → 标数据过期,首行红字「信号可能失真,请重跑」;- 执行日落在 A 股休市区间(国庆/春节等)→ 标
休市,提示「节后首个交易日重跑」; - 绝不允许把过期/休市数据当作"当前信号"静默输出。
- C2 · 三源全失败即停:westock-data / neodata / akshare 三源都取不到(网络全阻断、无依赖)→ 必须停止并明确告知用户"无法获取行情,建议人工导出",禁止用旧数据凑数或编造任何字段继续出结论。
- C3 · QDII 溢价率硬门槛:凡最终推荐含 QDII 类(
rotation_analysis.py::_is_qdii判定——代码513xxx开头一律视为 QDII;159xxx开头且名称含海外主题特征词 标普/纳指/纳斯达克/美股/美国/道琼斯/日经/日本/恒生/H股/港股通/中概/互联网30/沙特/印度/东南亚/亚太/新兴市场/法国/德国/CAC/油气/原油/石油 也视为 QDII),必须显式提示「实盘先查溢价率,>3% 慎入」并在报告风险项列出;实际入选的 QDII 要逐一点名(⚠️ 推荐标的 xxx(名称)为 QDII 类…),不得静默推荐。 - C4 · 阴跌期防御强制:市场状态=阴跌期时,最终推荐只允许 511880.SH 货币ETF(或空仓),禁止输出权益/商品/QDII ETF 作为买入建议;且须提示最小防御期 5 天。
- C5 · 最少数据约束:任意标的
len(closes) < 80必须跳过并计入失败列表,不得用不足数据参与打分(代码已强制)。 - C6 · 禁止编造:溢价率/规模/某字段缺失填
null并标注"数据不足",不得估算或编造(QDII 溢价率等 westock/基金公告未覆盖时尤须遵守)。 - C7 · 集中度提示:正常期
holdings_num=1满仓单标的时,必须在风险提示显式提示「满仓单标的集中度高,风险偏好低者可分散至 2-3 只」。 - C8 · 图表零外部依赖:报告看板内所有图表(指标条 / 比例环 / 条形图 / 折线图)必须为纯 SVG/HTML/CSS 实现,不引用任何 CDN、JS 库或外部字体,确保内网/离线双击即可正确渲染。新增图表时禁止引入 echarts/d3/Chart.js 或任何外链依赖。
- C9 · 图表配色遵循涨红跌绿:所有表示收益的图表(年化收益对比条、指标条正收益段、走势图涨幅区)必须红涨绿跌,与 A 股惯例和爱建品牌一致;不得反置为绿涨红跌。
- C10 · 报告结构纪律(已移除板块不得回归):报告看板禁止重新出现「过滤器拦截情况」明细列表与「仓位建议」板块(用户于 2026-10-07 明确要求去除)。允许保留的高阶统计仅限:合格标的比例环(组合覆盖度,非拦截明细)。任何新增模块不得变相恢复被移除的两块内容。
- C11 · 走势图数据契约:价格走势图所用
series由rotation_analysis.py的_norm_series()生成,为各标的最近 60 个收盘价的归一化涨跌幅(%)(基点=序列首点=0%);MA20 由前端按 20 日窗口实时计算,不得在 JSON 中预存 MA 序列。新增走势类图表须复用此series,不得另存原始closes到结果。
资源内置与导入安全(2026-10-26 固化)
问题:技能包走导入/上传通道时,平台会做「文件路径不安全」安全校验,实测会跳过 assets/report_template.html、assets/rotation_dark_style.css、examples/build_sample.py 三个文件(前两者是渲染命门——缺失则 generate_report.py 无模板、报告直接生成失败)。
解决方案:把资源烘焙进内置模块并改渲染逻辑做兜底。
scripts/bake_assets.py:把assets/report_template.html+assets/rotation_dark_style.css以 base64(含换行归一化 CRLF→LF) 烘焙进scripts/bundled_assets.py(自动生成,勿手改)。base64 存储确保模块文件本身不含<script/<style字面量,不会被内容扫描判掉。scripts/generate_report.py/scripts/restyle_rotation.py:加载策略为「磁盘文件优先,缺失自动回退bundled_assets.py」,因此即使三个文件被导入通道跳过,技能仍完整可用、报告照常生成。scripts/export_skill.py:导出分发包时主动排除上述三个文件(不再进包),由内置副本兜底 → 导入零跳过、零告警;并自动先烘焙,保证内置副本与磁盘资源同步。
维护纪律:修改 assets/report_template.html 或 assets/rotation_dark_style.css 后,必须重跑 python scripts/bake_assets.py(或导出时用 python scripts/export_skill.py,会自动烘焙)重新生成 bundled_assets.py,否则分发包内的内置副本会滞后于源模板。
合规闭环作业(审查 → 修复 → 复核)
任何报告交付前/后,或大版本(样式/口径/参数/新增模块)变更后,执行三阶段合规闭环(完整方法论见 references/compliance_review.md,含 24 项综合校验清单与落点对照表):
- 审查:①渲染级提取可见文案(
node scripts/extract_visible_text.js <报告.html> --json)+源码交叉核对 → ②核对 R1-R5/C1-C11 就地渲染 → ③对照监管规则(基金宣传推介材料管理规定/证券法85条/广告法9条/适当性)定性分级 → ④出「关键风险点表+逐条深挖+汇总+行动清单」(HTML 审查意见书 + Word + CSV 三件套)。 - 修复:问题一律落回技能链(模板/CSS/数据层脚本)再重跑生成,不得只改单份输出 HTML。2026-10-26 已固化的整改落点:页头口径声明条(M1/M2/M3/L7)、
renderHeader数据截至 meta(M3)、表头[测算]标签+动量得分脚注(M1/M2)、--disclosure高对比色+footer 13px(M4)、占池通过率(L5)、market_state action 中性化且不带「策略信号:」前缀**(L6/L9)、title 内部命名(L8 外发前去除)。 - 复核:重跑生成后再次渲染级提取 → 逐项对照上轮审查项 → 排查新风险(改模板看拼接、改 CSS 看对比度、改数据层看措辞)→ 跑 24 项校验确认 R1-R5/C1-C11 保持 → 出复核意见书(含修复后状态与风险分布计数)。
校验收支:
extract_visible_text.js校验时注意措辞逐字一致(例:适当性提示原文为"…并咨询您的投资顾问",校验串勿写成"请咨询…");「覆盖」残留于 CSS 注释与首用模块「覆盖主题」KPI 属合法,勿误判。改动本技能文件(模板/CSS/脚本/文档)请用 Edit/Write 或 PowerShell(Bash 写技能目录会被沙箱拦截)。
触发示例
| 用户输入 | 触发 |
|---|---|
| "帮我选几只近期动量强的 ETF" | ✅(首用→全市场一体化;已有池→日常轮动) |
| "第一次用这个技能,从全市场给我筛一下" | ✅(首用模式,first_use_market.py) |
| "全市场哪些 ETF 最近最强,帮我自动选个池子" | ✅(首用模式) |
| "现在市场是什么状态,适合轮动吗" | ✅ |
| "黄金和纳指 ETF 哪个动能更好" | ✅ |
| "现在是不是该防御了,转货币 ETF" | ✅ |
| "港股/红利低波 ETF 轮动信号怎么样" | ✅ |
| "给我做个 ETF 轮动选基报告" | ✅(输出 HTML 看板) |
资源索引
| 文件 | 用途 |
|---|---|
references/rotation_sop.md | 全流程操作手册(SOP):取数→分析→报告→池维护→全市场扫描→首用模式→排障;含 §3a 输出合规要素内建、§4d 数据治理双源核验,首次跑通必读 |
references/etf_pool.md | 42 只 ETF 维护池(7 大类清单;维护两处同步点之一) |
references/parameters.md | 核心参数表 |
references/strategy_details.md | 三态市场识别、打分算法、执行规则、风险点 |
references/compliance_review.md | 合规闭环方法论(审查→修复→复核):整改落点对照表、24 项校验清单、渲染级提取工具用法、校验避坑 |
assets/report_template.html | HTML 看板模板(爱建蓝、涨红绿跌,含可选首用模块、零依赖;内建合规脚注/页脚免责/「动量年化(测算)」口径) |
scripts/momentum_score.py | 动量打分核心算法 |
scripts/market_state.py | 三态市场状态识别 |
scripts/filters.py | 七层风控 + 双滤波器 |
scripts/rotation_analysis.py | 轮动分析主入口 |
scripts/generate_report.py | JSON → 爱建品牌 HTML 看板 |
scripts/first_use_market.py | 🎯 首用·全市场一体化(搜索→筛选→自动选池→轮动→报告,一条命令) |
scripts/pool_market_scan.py | 全市场扫描(池维护体检) |
scripts/fetch_westock.py | westock 主源取数(日常模式) |
scripts/fetch_akshare.py | akshare 兜底取数(日常模式) |
scripts/extract_visible_text.js | 合规复核:报告真实可见文案渲染级提取(Node 零依赖) |
注意事项
- 策略边界:基于历史动量,不保证未来收益。急速反转、政策突变、黑天鹅事件可能导致失效,需结合基本面判断。
- 数据依赖:至少需 80 个交易日历史数据才能稳定计算,新上市 ETF 跳过。
- 参数敏感性:核心参数已回测优化,调整时需重新回测。详见
references/parameters.md。 - 阴跌期纪律:一旦触发必须执行防御,不可因主观判断提前退出。最小防御期5天,退出需满足反弹+站上均线双重条件。
- 单标的满仓风险:holdings_num=1 集中度高,风险偏好低可调整为 2-3 只分散。
- 溢价率限制:QDII 类 ETF(513xxx)可能存在溢价,实盘交易需检查溢价率,>3% 慎入。
- 回测与实盘差异:回测假设开盘价成交、无滑点,实盘需考虑流动性、滑点、冲击成本,建议资金量 < 标的日均成交额 5%。
- 合规声明:所有分析仅为策略研究输出,不构成投资建议。用户据此交易风险自负。