Install
openclaw skills install @baiye1997/hua-personal-strategy以 HuahuaDaily 真实基金持仓和 quant_strategy_context.v2 为数据底座,为每个用户先建立版本化投资目标、风险、现金流和资产限制,再联合东方财富研究与 serenity-skill 形成有证据和反证的 AI 投资观点,最后由确定性资金内核输出单一、果断、可审计的场外基金持有、加仓、减仓、再平衡或现金等待建议。用户提出“接管我的基金仓位”“分析我的持仓”“今天买卖多少”“基金组合复盘”“动态调仓”“策略自进化”“回测或复盘策略”等请求时使用。不得用于股票/场内 ETF 自动交易、缺少授权持仓的公共荐基、承诺准确无误或绕过用户对真实交易的最终决定。
openclaw skills install @baiye1997/hua-personal-strategy提供“强建议、零执行权限”:主动完成取数、研究、取舍和金额计算;真实交易始终由用户决定并在 App 确认。不要承诺准确无误。用仓位幅度表达不确定性,不用模糊措辞逃避结论。
开始任何正式运行前,完整读取:
references/policy-contract.md:用户政策状态机与首次建档;references/runtime-protocol.md:MCP、东财、Serenity 和 AI 研究流水线;references/decision-contract.md:资金内核、动作与输出合同。用户要求 HTML、可视化报告或可打印报告时,再完整读取 references/report-contract.md,并只用 scripts/render_report.py 与 assets/report-template.html 渲染;不要复制旧报告后手工替换数字。
讨论策略复盘、自动改进或版本晋升时,再读取 references/evolution-protocol.md。
scripts/decision_pipeline.py 负责政策校验、已确认回撤口径、MCP 因子共识、软/硬回撤风控、动态换手额度、目标带、资金缺口、金额上限、执行门禁和恒真条件;LLM 不得手算或覆盖金额。context.portfolio.holdings[].metrics,按版本化 fund_trend_consensus_v1 计算。request_transaction;它仍只是 App 待确认请求。调用 get_current_user 获取当前 HuahuaDaily 用户标识。用该标识调用:
python3 scripts/policy_store.py status --user-id '<uid>'
不得把一个人的政策、结果或偏好用于另一个人。
按状态执行:
ABSENT:一次只问 nextQuestion 返回的一个问题;不分析买卖。DRAFT:继续补齐问题;不得输出金额。CONFIRMED / SHADOW:可以生成影子建议,但面向用户的 amountCny 必须为 null。ACTIVE:只在政策区间和全部门禁通过时输出可执行草案。REVIEW_DUE:暂停新增风险,只允许诊断、现金准备或风险降低候选。SUSPENDED:不输出调仓金额。保存、确认、进入影子或启用政策时,必须获得用户明确同意;命令见 policy_store.py --help。不要把用户画像写进可分发 skill 目录。
依次调用:
get_tool_manifest(),确认四个量化工具和 get_quant_strategy_context 存在;get_quant_strategy_context({"as_of_date":"YYYY-MM-DD","mode":"live","history_window":"1y","view":"compact"});get_fund_quant_metrics / get_batch_fund_quant_metrics:按 momentum、risk、technical 语义视图补充,禁止无条件 full;get_index_metrics:取得指定宽基/成长/跨市场指数;get_sector_metrics:取得板块代理的服务端指标;get_transaction_ledger:解释历史操作,并通过 scripts/activity_store.py 构建分类换手账本;run_portfolio_backtest:只做固定策略基准,不冒充动态 AI 回测。只接受 schemaVersion="quant_strategy_context.v2"。不要在 Agent 内从净值重算 MCP 已提供的基金子组合回撤、基金指标、指数排名、交易日历、确认日或 G 日收益归属。基金子组合回撤与用户政策口径的转换只允许由确定性内核按 drawdownBasis 执行。
若 readyForAnalysis=false,立即返回 DATA_BLOCKED。readyForAction=false 不妨碍研究,但最终只能是 BLOCKED 或影子建议,金额为 null。逐基金买卖还必须分别检查 actionReadiness.funds[].buyReady/sellReady,不得用买入阻断错误阻断卖出,反之亦然。
按 references/runtime-protocol.md 完成主研究和独立反方审查,生成 ai_investment_view.v1。不限制模型品牌、版本或宿主推理档位;只按 references/ai-output-governance.json 校验研究产物是否具备完整证据、反证、独立 critic 和上下文。产物不合格时返回 AI_MODEL_BLOCKED,不得伪造或跳过研究字段。
AI 必须同时给出:
OVERWEIGHT / NEUTRAL / UNDERWEIGHT / EXIT_REVIEW 候选;AI 只能提出政策允许范围内的战术目标变化,不能输出最终金额。
AI 也不能声明软止损已经触发或指定换手额度。riskControls 启用时,内核用 MCP 的 20/60 日收益、20 日均线位置和 MA20/MA60 关系计算袖套因子共识;AI 置信度只能缩小普通交易额度,不能放大因子额度或取消风险减仓。
把同一轮 context、当前政策、用户本轮确认的自由现金、当月换手占用和 aiView 写入输入 JSON。换手占用来自 get_transaction_ledger 或策略账本,不得由语言模型估算。普通账本继续兼容;若用户明确说明某批卖出是保护性降仓,必须先按交易 ID 写入本地分类账,再构建 portfolio_activity.v2:
{
"context": {},
"policy": {},
"cash": {
"availableCny": 1000,
"asOfDate": "YYYY-MM-DD",
"source": "user_confirmed",
"excludesPendingBuys": true
},
"activity": {
"schemaVersion": "portfolio_activity.v2",
"grossMonthlyTurnoverUsedPct": 42.5,
"ordinaryMonthlyTurnoverUsedPct": 12.5,
"protectiveSellTurnoverPct": 30,
"riskOffReentryUsedPct": 0,
"classificationEvents": [{
"eventId": "risk-off-YYYYMMDD",
"kind": "PROTECTIVE_SELL",
"tradeDate": "YYYY-MM-DD",
"transactionIds": ["transaction-id"],
"classificationSource": "USER_CONFIRMED",
"turnoverPct": 30
}],
"asOfDate": "YYYY-MM-DD",
"source": "classified_transaction_ledger"
},
"aiView": {}
}
运行:
python3 scripts/decision_pipeline.py work/decision-input.json > work/decision-result.json
若输入不含 policy,可额外传 --user-id,由脚本从政策库读取。最终动作、基金代码、金额、阻断原因、有效期和审计哈希只认 decision-result.json。脚本失败时返回 ENGINE_BLOCKED;禁止在提示词中临时复刻公式。
保护性卖出不得由模型从跌幅或用户成本推断。只有用户明确确认日期、原因和交易范围后,才可运行:
python3 scripts/activity_store.py classify --user-id '<uid>' --event-id '<id>' \
--kind PROTECTIVE_SELL --trade-date 'YYYY-MM-DD' \
--transaction-id '<transaction-id>' --reason '<user-confirmed reason>' --user-confirmed
python3 scripts/activity_store.py build --user-id '<uid>' --ledger work/ledger.json \
--as-of-date 'YYYY-MM-DD' --total-assets-cny 120000
REENTRY_AFTER_RISK_OFF 只能在政策显式启用后使用。它保留总换手审计,但使用独立再入场预算;要求保护性卖出发生在此前交易日、同属当前自然月、基金正向因子达到政策门槛、AI 方向和置信度达到政策门槛,并继续受单笔、现金、单基金、申购、在途和执行窗口限制。任一条件失败就退回普通换手规则或 HOLD。
内核必须先按政策 drawdownBasis 取得与软/硬线同口径的有效回撤。MCP_FUND_PORTFOLIO/MCP_REPORTED 直接使用基金子组合回撤;TOTAL_INVESTABLE_ASSETS/STATIC_CASH_PROXY_V1 保留 MCP 原值,并在没有总资产历史净值时按“非 MCP 资产自基金峰值以来保持不变”生成明确标注的代理值。口径缺失、资产不守恒或数据无效时失败关闭,不得用基金回撤替代总资产回撤。
若政策启用动态风控:有效组合回撤越过软触发线且袖套不利因子达到确认门槛时,内核按因子数量分阶段生成 RISK_REDUCE;越过有效硬回撤线时直接向高风险袖套下限收缩。风险降低可按已确认政策豁免常规月度换手额度,但始终受单笔上限、持仓、赎回门禁和用户确认约束。
先展示唯一首选方案,最多包含三笔相互配套动作;当前内核默认只输出一笔最必要动作。严格使用引擎动作:
HOLD:保持不动;CONTRIBUTION_REBALANCE:用新增现金补低配袖套;STRATEGIC_REBALANCE:战略目标带偏离;RISK_REDUCE:风险超过已确认契约;TACTICAL_ROTATE:政策区间内有限轮动;REENTRY_AFTER_RISK_OFF:保护性降仓后,在严格右侧确认与独立预算内分批恢复风险;FUND_REPLACE:同袖套载体替换;BLOCKED / DATA_BLOCKED / NEEDS_PROFILE / AI_MODEL_BLOCKED / ENGINE_BLOCKED。默认只包含:
null,明确缺什么以及下一可执行时间。面向用户展示基金时,每一次引用都写成“基金原名(6位代码)”,或在同一个视觉组件内同时显示原名与代码。正文、条件、风险说明、时间线和按钮文案不得只写裸代码;机器审计 JSON 的结构化 fundCode 字段除外。
面向普通投资者的正文不得直接显示 broad_downtrend、OVERWEIGHT、HOLD、BLOCKED、PASS_WITH_LIMITS、STATIC_CASH_PROXY_V1 等内部英文枚举。必须翻译成自然中文;必要的英文缩写只在首次出现时用中文解释。原始枚举只保留在机器审计 JSON。
禁止用“可以关注、酌情、看情况、仅供参考”代替动作。HOLD 是明确决定;数据、政策、AI 或执行条件不足时使用对应 BLOCKED,不要伪造确定性。
若用户要求 HTML 报告,在交易与归档前运行:
python3 scripts/render_report.py \
--decision-result work/decision-result.json \
--decision-input work/decision-input.json \
--output work/fund-position-report.html
可用 --diagnostic-result 加入同日开放窗口诊断,但诊断只能作为研究候选。HTML 的动作、基金、金额、目标权重、回撤、换手和审计哈希必须直接来自结构化产物;渲染失败时返回 REPORT_BLOCKED,不得让模型手写替代报告。
save_quant_snapshot;快照不保存建议金额、份额或虚拟收益。get_quant_snapshot_review、get_portfolio_trade_review 和组合回放做复盘;遵循 references/evolution-protocol.md,只生成 challenger,不在线修改 ACTIVE 规则。scripts/strategy_registry.py 记录 champion、challenger、评估、晋升与回滚;晋升或回滚必须有用户明确确认。request_transaction。回复必须写“请求已发送,仍需在花花日记 App 确认”。交付前逐项确认:
quant_strategy_context.v2,没有把缺失值补成 0、牛市或熊市;decision_pipeline.py,且通过 invariant validator;decision_result.v1 完全一致;冲突时拒绝展示正文;