DSAWiki
08智能 · 方法

15 种策略,15 种看市场的角度

均线、缠论、波浪、事件驱动……策略不是预测水晶球,而是把某种假设写成可复用的检查清单。

约 8 分钟 进阶 第 08 章 · 智能

策略不是预测水晶球,而是一份可复用的检查清单:在什么市场环境下,优先看哪些证据,满足什么条件才加分,什么情况下必须减分。DSA 把这些清单写成了 15 份 YAML,不需要写代码就能读、能改、能加。

类比:不同科室的检查单

内科医生和骨科医生都用听诊器,但检查重点完全不同。趋势策略关心均线排列与回踩,情绪策略关心换手与涨停,事件策略关心催化是否兑现。所谓「策略路由」,就是先分诊,再让对应科室的医生开检查单——而不是让 15 个医生同时围着你。

策略库:15 份 YAML,四种类别

策略文件放在 strategies/*.yaml,系统启动时自动加载。对用户叫「策略」,在代码与 API 字段里统一叫 skill——可以理解为「可复用的策略能力包」。类别分布如下:

5趋势 trend
1形态 pattern
1反转 reversal
8框架 framework

其中 bull_trend 是默认激活策略,bull_trend 与 shrink_pullback 属于默认路由回退集。每份 YAML 还可以声明 default_priority(数字越小越靠前)与 market_regimes(适用市场状态),供路由与展示排序使用。

一份策略如何被选中、执行、汇总

识别市场状态regime
路由选策略router
策略 Agent 执行skill agent
加权汇总aggregate
风险否决guard

路由优先级大致是:用户显式选择 > 手动指定模式 > 根据技术观点推断的市场状态 > 默认集合。推断规则很朴素:多头排列且趋势分足够高 → trending_up;空头且分数很低 → trending_down;中间区间 → sideways;明显放量 → volatile。

策略 Agent 固定最多 4 步,只能使用 YAML 中 required_tools 声明的工具。多个策略的观点会被映射成 1–5 分(strong_sell → strong_buy),加权平均后落档;只有回测样本达到 30 条以上,才会启用「历史表现权重」。有效观点不足两条时,结论会标记为 insufficient,而不是硬凑一个方向。

15 种策略速查

下面的「加减分」是策略对综合评分的建议调整,不是收益承诺。阈值来自当前 YAML,改动策略后以文件为准。

筛选

默认多头趋势

bull_trend

MA5 ≥ MA10 ≥ MA20 且 MA20 向上;优先等回踩,而不是追突破。破 MA20 减 12 分。适合趋势向上的市场,是默认激活策略。

趋势优先 10trending_up

均线金叉

ma_golden_cross

3 日内 MA5 上穿 MA10;更强的是 MA10 上穿 MA20。要求量比 > 1.2、乖离 < 5%;MACD 在零轴上方再加 5 分。

趋势量能确认trending_up

放量突破

volume_breakout

成交量 > 5 日均量 2 倍,收盘站上 20 日高点,且收在当日振幅上方 30%;乖离仍要 < 5%。止损放在突破位下方约 3%。

趋势突破trending_up

缩量回踩

shrink_pullback

回踩 MA5 误差 1% 或 MA10 误差 2%,成交量 < 5 日均量 70%,MA5 乖离 < 2%;获利盘 50–80% 更理想。属于默认路由回退集。

趋势低吸trending_down / sideways

龙头策略

dragon_head

板块涨幅前列、换手 > 5%、量比 > 1.5、跑赢板块 2% 以上。乖离容忍度放宽到 7%,超过 10% 转为谨慎。只做最强,波动也最大。

趋势板块sector_hot

一阳夹三阴

one_yang_three_yin

5 日内先出现实体 > 2% 的大阳线,随后三根缩量小阴不破首日开盘,第 5 日阳线突破首日收盘。赌的是趋势延续,不是反转。

形态延续无 regime 限制

底部放量

bottom_volume

从 20 日高点回落 > 15% 后,成交量放大到 3 倍以上,收阳且守住低点。是「可能反转」的第一信号,仓位建议仅 2–3 成。

反转超跌trending_down

箱体震荡

box_oscillation

箱顶与箱底各触碰 2–3 次,宽度 5–15%;只在距边缘 5% 内动手。箱底加 10–12 分,跌破箱底减 15 分。

框架区间sideways

缠论

chan_theory

用笔、线段、中枢描述结构,寻找一、二、三类买点。核心是背驰:价格创新高但 MACD 红柱缩短。底背驰 + 一买加 15 分,顶背驰减 15 分。

框架结构volatile

波浪理论

wave_theory

五浪推动 + 三浪调整。2 浪回撤常见 38.2%–61.8%,3 浪目标常用 1.618–2.618 倍。2 浪底加 15 分,5 浪末减 10 分。

框架结构volatile

情绪周期

emotion_cycle

换手 < 0.5% 视为冰点,2–5% 活跃,> 5% 警惕,> 10% 可能顶部。底部满足 3 条加 14 分、5 条加 20 分;顶部减 12–20 分。

框架情绪sector_hot

热点题材

hot_theme

板块涨幅前三、题材扩散、个股有实质受益。启动/扩散加 12 分,强于板块加 6 分;退潮减 8 分,纯蹭概念减 12 分。

框架题材sector_hot

事件驱动

event_driven

围绕业绩、政策、并购、订单、产品发布五类事件,判断影响路径与是否已被计价。正向未反映加 14 分,已兑现减 6 分,负面减 15 分。

框架催化sector_hot / volatile

预期重估

expectation_repricing

区分硬信息(财报、订单)与软信息(传闻、叙事),判断正向/负向预期差是否已反映在估值里。正向重估加 15 分,过热减 5 分,证伪减 15 分。

框架预期差volatile / sector_hot

成长质量

growth_quality

收入、利润、经营现金流、ROE 同向增长,且行业空间足够。高估值但未验证减 8 分,增收不增利减 12 分;高质量成长加 15 分。

框架中长线trending_up

写进所有策略的「交易纪律」

除了各自的条件,策略还共享一组硬规则。它们既出现在 Prompt 里,也出现在代码守卫里:

不追高

MA5 乖离率 > 5% 时,任何买点都要打问号;2% 以内相对舒服。追高不是勇气,是把止损空间让给了别人。

先看趋势

优先 MA5 > MA10 > MA20 的多头排列。逆势抄底需要更强的证据与更小的仓位。

仓位有上限

底部试仓 2–3 成,确认后再加。不要一次性把子弹打光。

止损先写

买入前就确定止损位与最大亏损;突破策略把止损放在突破位下方。

这些规则不保证赚钱,但能保证你在判断错误时「还活着」。策略的价值不在于每次都赢,而在于输的时候输得可控。

回测:验证规则,而不是证明自己

回测用历史报告与后续价格,评估某个策略/信号建议的命中率、平均收益、最大回撤等指标。DSA 支持:

python main.py --backtest --backtest-code 600519 --backtest-days 30
python main.py --backtest --backtest-force

也可以按配置自动运行。它把「买入/加仓」映射为看多结果,「卖出/减仓」映射为看空结果,「持有/观望」按规则处理,然后在持有周期结束后对照真实价格。

回测的四个陷阱

① 幸存者偏差:只测今天还活着的股票;② 未来函数:用了当时还拿不到的数据;③ 过拟合:参数调到完美贴合历史;④ 交易成本:手续费、滑点、涨跌停买不进。一个回测曲线漂亮但逻辑说不清的系统,比一条平庸但可解释的曲线更危险。

系统只有在策略的历史样本达到 30 条以上时,才会把「表现权重」纳入聚合。样本不足时,它更愿意承认 insufficient,而不是用一个漂亮但不可靠的胜率误导你。

另一条路线:纯规则的 ETF 轮动

上面 15 个策略服务于「让 LLM 按清单分析个股」。项目里还有一条完全不同的路线:规则化双动量 ETF 轮动。它不调用 LLM,不依赖任何 AI 配置,只做确定性计算,适合想验证「资产配置」而不是「个股择时」的人。

python main.py --etf-rotation              # 生成信号与回测报告,并推送
python main.py --etf-rotation --no-notify  # 只生成本地报告
1
选时点

每周(或每月)最后一个交易日收盘后计算,下一个交易日收盘执行,避免用信号当天的价格成交——这是最基础的「防未来函数」。

2
相对动量排名

按过去 60 个交易日(可配)的涨幅给风险池 ETF 排名,取前 N 名(默认 2 名)。

3
绝对动量过滤

只有涨幅为正的 ETF 才能入选;没选满的名额转向防守资产(默认货币 ETF),防守资产不可用则按现金处理。

4
换仓缓冲与成本

已持有的 ETF 只要仍合格、且落后最后一个入选名额不超过 2 个百分点,就继续持有。每次调仓按换手率 × 10bp 扣成本。

配置默认作用
ETF_ROTATION_POOL沪深300 / 中证500 / 创业板 / 红利低波 / 纳指 / 黄金风险池,事先定死,避免事后挑赢家
ETF_ROTATION_SAFE_ASSET511880(货币 ETF)未选满仓位的去处;留空表示现金
ETF_ROTATION_LOOKBACK_DAYS60动量窗口(交易日,5–500)
ETF_ROTATION_TOP_N2最多同时持有几只(1–10)
ETF_ROTATION_REBALANCEweeklyweekly / monthly

报告不只给一个「买什么」:它包含数据告警、最新信号与动量排名、与风险池等权基准的对比、分年度收益、参数平原检验和最近 10 次调仓。参数平原的意思是:把动量窗口从 20 天扫到 200 天,看结果是否稳定。如果相邻参数差异巨大,说明当前收益更可能来自运气。

三个必须知道的边界

① 趋势轮动主要价值是控制回撤,不保证跑赢等权基准,震荡市会反复止损;② 只在命令行生效,不接入 --schedule,也不在 Web 设置页;③ 数据源回退可能静默截断历史,回测区间变短时结论要打折扣。

写一份自己的策略:只需要一个 YAML

这是 DSA 最友好的扩展点。你不需要会 Python,只需要把判断标准写清楚。最小模板:

name: my_strategy
display_name: 我的策略
description: 一句话说明它适合什么市场

category: trend              # trend / pattern / reversal / framework
required_tools:
  - get_daily_history
  - analyze_trend
aliases: [我的战法]
default_priority: 100
market_regimes: [trending_up]

instructions: |
  **判断标准**
  1. 使用 analyze_trend 检查均线排列。
  2. 要求量比大于 1.2,且乖离率低于 5%。
  3. 满足时在 buy_reason 中注明策略名称。

  评分调整:满足条件时 +10。

把它放进 strategies/,或通过 AGENT_SKILL_DIR 指向自定义目录;同名策略会覆盖内置版本。写完后重启,Web 的策略列表与 Agent 路由即可使用。

自测一下

一只股票满足「放量突破」,但 MA5 乖离率已经 8%。按 DSA 的策略纪律,最合理的处理是?

原因:策略信号不是「一票通过」。突破说明资金认可,但 8% 的乖离意味着你离短期平均成本很远,止损空间被压缩。正确做法是让信号与风险纪律共同作用:等回踩、减小仓位,或明确写下「这次愿意承担更大回撤」——而不是改参数迎合结论。

源码与文档锚点