PA Agent增量分析实现原理:K线序号偏移与决策连续性(decision_continuity)设计
【免费下载链接】PA_Agent项目地址: https://gitcode.com/gh_mirrors/pa/PA_Agent
PA Agent 是一个面向 K 线市场的 AI 分析助手,其核心能力是增量分析:每当有 1 根新的已收盘 K 线出现,程序不必从头分析几百根 K 线,而是复用上一轮诊断结论,只做"增量更新"。这篇文章将带你彻底看懂它的两大支柱设计——K 线序号偏移(机械平移,让 AI 零换算引用上一轮结论)与decision_continuity 决策连续性(程序强制校验上一轮交易方案是否失效、是否允许反手),以及两者如何协同工作。
一、增量分析要解决什么问题?
K 线图表永远把"最新的一根"放在最左边。PA Agent 内部也采用同样的坐标约定:K1 = 最新已收盘 K 线,序号越小越新。
这带来一个棘手的连锁问题:
| 时刻 | 上一轮的 K1 | 本轮的 K1 |
|---|---|---|
| 上一轮分析 | K1(当时最新) | 变成了 K2 |
| 本轮分析 | — | K1(新收盘的这根) |
也就是说,每多收盘 N 根 K 线,上一轮所有结论里的 K 线编号整体向后漂移 N 位。如果直接把上一轮结论喂给 AI,模型必须自己心算换算,极易出错;若让 AI 重新全量分析,又浪费 token 与时间。
PA Agent 的决策过程本身是一棵结构化的决策树(趋势延续 / 反转 / 突破 / 通道判断逐层裁定),每一层的判定都引用具体 K 线区间——坐标不统一,整棵树的引用就会全部错位:
二、K线序号偏移:一行正则完成"零换算"
核心实现只有约 60 行,位于 pa_agent/ai/incremental_shift.py,逻辑非常巧妙:
2.1 三类引用,分别处理
- 自由文本(reason、key_signals、summary 等字符串):用正则
K(\d+)匹配所有"K+数字"引用,统一 +N。注意"K线"这种没有数字的 K 不受影响,所以中文行文不会被打乱。 - 结构化整数字段
bar_from/bar_to:按 K 线序号语义单独 +N。 - 需要跳过的子树:
incremental_delta字段记录的是"上一轮那次增量发生了什么"(例如"上一轮新增 K1 突破上沿"),平移后语义就错了,因此整个子树原样保留。
2.2 一个隐藏的细节:bool 陷阱
Python 中bool是int的子类,isinstance(True, int)为True。平移函数在判断"是不是要 +N 的整数序号"之前先排除布尔值(见 _shift_value),避免把true/false错误地加 N 变成3——这类细节正是"机械平移"可靠性的保障。
💡 设计哲学:换算永远由程序做,AI 只负责引用。Prompt 中会明确告知模型:"下方所有 K 引用均已由程序平移成本轮坐标,可直接引用,无需再换算"。
三、增量分析完整流水线
新 K 线如何一步步变成一次增量分析?
- 发现新 K 线:pa_agent/gui/analysis_prep_worker.py 对比上一轮记录,计算出
incremental_new_bar_count(新增已收盘 K 线数 N)。 - 编排器分派:pa_agent/orchestrator/two_stage.py 检测到存在上一轮记录且 N > 0 时,改走增量分支
build_incremental_stage1,否则执行全量分析。 - 组装 4 条消息(pa_agent/ai/prompt_assembler.py):
[0] system — 阶段一系统提示词(与全量相同) [1] user — 用当前帧重建的完整 K 线表(K1=最新) [2] assistant — 上一轮阶段一诊断 JSON(所有 K 引用已 +N 平移) [3] user — 增量任务:仅新增 N 根 K 线 + 平移说明 + 反锚定要求这里有两个值得注意的工程取舍:
- 第 [1] 条每轮都用当前帧重建,而不是复用上一轮存下的消息——否则 K 线表会"冻结"在第一轮,第二轮起模型就只能看到最初快照加最新一根,中间所有 K 线全部丢失。代价是牺牲一部分前缀缓存命中,换来"模型读到的表格永远与当前现实一致"。
- 反锚定要求:Prompt 明确告诫 AI"上一轮结论只是参考起点,不是约束;如果新增 K 线改变了市场结构,必须果断推翻而非在旧结论上微调"。增量不等于"惯性延续"。
- 输出契约:增量轮必须输出完整的阶段一 JSON(而非 diff 补丁),并新增顶层字段
incremental_delta,声明new_closed_bars(必须恰好 N 项)与changed_fields。
四、decision_continuity:让上一轮方案"活在下一轮"
K 线序号偏移解决的是"看"的一致性问题;而 pa_agent/ai/decision_continuity.py 解决的是"做"的一致性问题——上一轮 AI 给出的交易方案(做多/做空、入场价、止损价、限价单)在本轮还作不作数?
4.1 上一轮方案从哪里来?
build_continuity_context(decision_continuity.py#L377-L447)按优先级取数:
- 首选:上一轮完整分析记录
AnalysisRecord.stage2_decision; - 兜底:
trade_records/目录下按品种+周期命名的 CSV 最后一行(load_last_trade_csv_row)。
同时用时间戳差值 ÷ 周期时长换算出bars_since——距离上一轮方案已过了几根已收盘 K 线。
4.2 程序判定的三种"生死状态"
assess_combined_plan_invalidation(decision_continuity.py#L319-L350)依次执行三类检查:
| 检查项 | 规则 | 结果 |
|---|---|---|
| 止损判定 | 最新 K1 的 high/low/close 是否触及上一轮止损价 | 触及 → 方案已失效 |
| 限价触发 | 扫描最近bars_since根 K 线,最低价(做多)/最高价(做空)是否触及限价入场价 | 触及 → 限价已触发(不得再声称"等待挂单") |
| 未成交自动取消 | 限价单挂起超过 3 根 K 线,或阶段一cycle_position变化,或direction变化 | 自动作废,本轮须重新评估 |
4.3 把判定结果"写进" Prompt
render_continuity_prompt_block(decision_continuity.py#L450-L550)将上述事实渲染成一段程序强制规则块,注入阶段二 Prompt 的开头,按优先级给出裁定:
- 已失效→ 禁止写"仍等待上一轮方案",须按本轮结构重新评估;
- 未失效 + 限价未触发→ 默认
order_type=不下单、outcome=wait; - 未失效 + 限价已触发→ 禁止声称"尚未触价",必须承认已触发并评估跟随条件;
- 同结构位反手冷却:默认 3 根 K 线内,若新入场价与上一轮入场价相差 ≤ 3 个 tick(结构位容差
entries_same_structure),禁止提反向单; - direction=neutral 方向约束:结合阶段一 §2.4 的 Always In 分支(AIL 仅允许多侧、AIS 仅允许空侧),禁止双向刮头皮。
4.4 连续性守卫:规则被违反时程序"强行刹车"
AI 的回复不可尽信,所以还有最后一道硬闸门apply_continuity_guard(decision_continuity.py#L597-L649),在阶段二归一化时执行(stage2_normalizer.py 调用):
- 若本轮方案违反 neutral 方向约束,或在冷却期内同结构位反手 → 程序直接把
order_type强制改写为**"不下单"**,清空入场/止损/止盈等价格字段,把terminal改写为outcome=wait、节点名continuity(方案连续性守卫),并在reasoning首句标注【程序连续性守卫】及原因。
这意味着:无论 AI 说什么,违反连续性规则的订单都出不去——规则校验前移到"出方案之前",而不是事后复盘。
4.5 CSV 审计:每一单与上一单的关系
audit_relation_fields+classify_vs_previous(decision_continuity.py#L652-L712)会把本轮决策与上一单的关系落成审计列:
prev_plan_relation:首单 / 同向 / 反手 / 已失效 / 上轮无单 / 延续等待prev_plan_invalidated:上一轮方案是否已被程序判定失效bars_since_prev_plan:间隔 K 线数prev_plan_entry:上一轮入场价(用于 3-tick 同结构判定)
每一笔新决策都能回答"它相对上一笔是什么关系",为后续复盘与经验库积累提供了结构化数据。
五、小结:两个模块如何协同
新K线收盘 │ ▼ analysis_prep_worker 计算 N = 新增已收盘K线数 │ ▼ two_stage.submit(previous_record, N) │ ├─ 阶段一:build_incremental_stage1 │ └─ shift_kline_refs(+N) 平移上一轮诊断/决策的K引用 │ ├─ 阶段二:build_stage2_continuation │ ├─ build_continuity_context 判定上一轮方案:失效/触发/挂起 │ ├─ render_continuity_prompt_block 注入强制规则 │ └─ apply_continuity_guard 违规方案强制"不下单" │ ▼ audit_relation_fields → trade_records CSV 审计一句话概括这套设计:增量分析把"重新看一遍全部 K 线"压缩成"只看新增 N 根 + 复用平移后的旧结论",而 decision_continuity 保证跨轮的决策不漂移、不自相矛盾——换算交给正则,判定交给程序,AI 只负责在统一的坐标系里思考。
📂 相关源码索引:
- K 线序号平移:pa_agent/ai/incremental_shift.py
- 决策连续性:pa_agent/ai/decision_continuity.py
- Prompt 组装:pa_agent/ai/prompt_assembler.py
- 两阶段编排:pa_agent/orchestrator/two_stage.py
- 单元测试:tests/unit/test_decision_continuity.py、tests/unit/test_decision_tree.py
【免费下载链接】PA_Agent项目地址: https://gitcode.com/gh_mirrors/pa/PA_Agent
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考