我为什么要测这个 Skill:炒股这件事,先谈活着再谈赚钱
如果你跟我一样,早期在量化/交易这条路上踩过坑,大概率会遇到一个共同的痛点:
策略会失效,行情会变脸,人会情绪化;唯一能长期依赖的,是“风险控制”本身。
很多人做“炒股工具/脚本/Skill”,第一反应是:
选股:因子、打分、财报、行业轮动
择时:均线、MACD、RSI、突破
预测:用回归、用深度学习、用大模型
但真实交易里更常见的结局是:
你会在某次回撤中把本该长期验证的策略提前砍掉
你会在连续盈利后加大仓位,然后被一次波动打回原形
你会把大量时间花在“找更牛的信号”,却忽略“让信号更能熬”的机制
所以这次我选择测评并整理一个风险控制优先的炒股 Skill:
不是为了给你一个“稳赚模型”,而是给你一个能被复用、能被移植到任何策略上的风险覆盖层(Risk Overlay)。
1.Skill 一句话概括
用极简信号(趋势过滤)做“是否允许持仓”,再叠加三层风控(波动率目标、回撤去风险、追踪止损)来决定“持多少”。
它的核心思想是把交易系统拆成两块:
策略层:负责回答“今天要不要持仓/买入?”
风控层:负责回答“如果要持仓,持多少?什么时候必须降低风险?”
这样的好处是:
你未来无论换成均线、因子、基本面、甚至人工信号,风控层都能继续用。
2.适用人群与使用场景
2.1 适用人群
想把“风控”从概念落到工程实现的人
有一个简单策略,但总是回撤太大、心态崩盘的人
需要一个“能运行、能输出报告”的投稿/分享素材的人
用 A 股做研究,但不想一开始就被数据接口、登录、限频卡住的人
2.2 典型场景
个人交易复盘:把“最大回撤”“仓位变化”可视化,反思自己什么时候太激进
策略原型验证:先用极简信号 + 风控骨架,快速搭起可扩展的回测流程
团队协作:研究员给信号,风控给仓位规则,二者独立迭代
非开发同学:把这套东西当“可运行模板”,用最少改动得到一个可解释的结果
3.我测评的对象:一个可运行的“风控 Skill”小项目
我把这次的 Skill 做成一个小项目(Python),结构尽量简单:
main.py:入口脚本,包含数据准备、指标计算、回测、报告输出
requirements.txt:依赖(pandas / numpy / matplotlib)
output/:运行后生成净值曲线、报告等
data/:默认会自动生成示例行情(也可以换成你的真实 A 股数据)
3.1 运行方式
pip install -r requirements.txt
python main.py
运行后会生成:
output/equity_curve.csv:逐日净值、仓位、回撤、是否触发止损
output/report.md:统计指标(年化、波动、夏普、最大回撤、平均仓位…)
output/equity_curve.png:净值曲线图
4.技术思路拆解:信号很简单,风控才是主角
为了让测评更聚焦,我把“信号”故意做得很朴素:
收盘价高于 20 日均线就允许持仓,否则空仓。
你可以把它理解为:
“趋势向上时参与,趋势走坏时离场”,这是很多系统的基础骨架。
真正的重点是三层风控:
波动率目标(Volatility Targeting):市场更“抖”时自动降仓
回撤去风险(Drawdown De-risking):净值回撤越大越保守
追踪止损(Trailing Stop):单次下跌太快就强制离场
这三层叠加后,仓位计算逻辑可以写成一句话:
最终仓位 = 信号(0/1) × 波动率目标仓位 × 回撤乘数
若触发止损,则直接把仓位打到 0。
5.具体方法:三层风控分别解决什么问题?
5.1 波动率目标:解决“行情不一样,仓位不能一样”
很多人做回测时容易犯的错误是:
策略信号一来就满仓
信号没了就空仓
完全不看波动水平
但真实市场里,同样的“满仓”,在不同波动环境下风险天差地别。
波动率目标的直觉是:
让组合波动保持在一个你能承受的水平。
一个常见做法:
估计最近 N 天的实现波动(例如 20 天日收益率标准差)
转成年化波动
仓位设为:target_vol / realized_vol
再做上限裁剪(例如不加杠杆就设上限 1)
举例:
目标年化波动 20%
当前估计年化波动 40%
→ 仓位约 0.5(半仓)
5.2 回撤去风险:解决“越亏越想赢回去”的人性陷阱
回撤控制不是为了“提高收益”,而是为了:
减少极端时期的亏损扩散
让交易者在系统最脆弱的时候更容易坚持下去
我在 Skill 里用的是软阈值 + 硬阈值:
当回撤 ≤ 10%:不干预
当回撤 ≥ 20%:降到 0(全撤)
10%~20%:线性降仓
这背后的逻辑很朴素:
当系统已经出现超出预期的回撤,先把“活下去”放在第一位。
5.3 追踪止损:解决“单次快速下跌把你打懵”
很多策略在回撤控制上有滞后性:
你可能要等净值跌出 10% 才开始降仓,但某些个股/板块在极端行情里会出现“连续跌停/快速下杀”,你根本来不及反应。
追踪止损(Trailing Stop)的核心是:
入场后记录一段时间内的最高价,一旦价格从最高价回撤超过某个阈值,就强制离场。
在这个 Skill 里我用的是“入场后最高价回撤 8% 触发止损”:
好处:对单次大跌更敏感,能更快把风险关掉
代价:可能把正常波动误判为风险,导致“被洗出去”
所以它更像一把“安全阀”,不是收益引擎。
6.实操步骤:我怎么把它当作一个可复用 Skill 来用?
这一节我用“拿到项目后 10 分钟内能做什么”来写,方便你按步骤截图、发帖展示。
6.1 第一步:开箱运行,确认输出物
运行:
python main.py
你应该能看到控制台提示已生成三个文件:
output/equity_curve.csv
output/report.md
output/equity_curve.png
建议截图点:
终端输出(证明你亲自跑过)
equity_curve.png(净值曲线)
report.md(统计指标)
6.2 第二步:把“策略层”当成插拔件
在 main.py 里,策略信号只有一个函数:
base_signal(df):返回 0/1
你完全可以把它换成:
均线交叉(例如 5/20 金叉死叉)
RSI 超买超卖
N 日新高突破
你自己定义的因子排名(多标的时)
只要你还能输出一个“允许持仓/不允许持仓”的判断,后面的风控层都能照用。
6.3 第三步:调风控参数,看“收益-回撤”怎么变
我建议先从三组参数开始(方便做对比截图):
A. 激进型(收益优先)
target_annual_vol = 0.25
dd_soft = 0.12, dd_hard = 0.25
trailing_stop_pct = 0.10
B. 平衡型(默认)
target_annual_vol = 0.20
dd_soft = 0.10, dd_hard = 0.20
trailing_stop_pct = 0.08
C. 保守型(回撤优先)
target_annual_vol = 0.12
dd_soft = 0.06, dd_hard = 0.12
trailing_stop_pct = 0.06
每次改完参数重新跑一次,把三张净值曲线并排放(或把指标表格对比),“测评味”就出来了。
7.效果测评:有风控 vs 无风控(我怎么做对比)
投稿里最重要的是“使用前后对比”。我这里给一个可复用模板:
你只需要在同一份数据、同一个信号下,分别跑两种版本:
7.1 对照组(无风控)
对照组的定义很简单:
只要信号允许就满仓(1.0),不做波动率目标、不做回撤降仓、不做止损。
你可以在 run_backtest() 里把:
desired = allow * vt * ddm
临时改成:
desired = allow * 1.0
这样得到的净值曲线往往更“刺激”:涨得快、跌得也更狠。
7.2 实验组(加风控)
实验组就是本项目默认逻辑:三层风控叠加。
7.3 我观察的指标(建议你发帖时列出来)
建议至少放这 6 个指标:
年化收益(Return)
年化波动(Volatility)
最大回撤(Max Drawdown)
夏普比率(Sharpe)
平均仓位(Avg Exposure)
止损触发次数(Stop Count)
在很多情况下你会看到这种“真实世界更常见”的结论:
实验组的年化收益不一定更高
但最大回撤往往更小、曲线更平滑、持有体验更好
最重要的是:你更可能坚持把策略跑完一个周期
这也是我做这个 Skill 的初衷:
把系统从“容易中途死掉”变成“更可能活到统计有效”。
8.这个 Skill 的优点与缺点(真实测评角度)
8.1 我认为它好用的点
开箱可跑:没有数据接口的门槛,先把框架跑通
风控模块化:波动率目标/回撤去风险/止损这三层可以单独开关
可解释:每个仓位变化都有“因果”,适合写帖子讲清楚
输出友好:自带报告与曲线图,天然适合截图对比
8.2 我认为它不够好的点(也建议你在帖子里坦诚写)
默认数据是示例数据,不代表任何真实收益水平
单资产回测,离真实选股/组合还有距离
没有手续费、滑点、涨跌停、分红送转等 A 股细节
止损是简化版本,真实交易里要考虑开盘跳空、跌停无法成交
这也是为什么我更把它定位为“风控骨架”和“投稿可复用模板”,而不是“可直接实盘的自动交易系统”。
9.如何替换为真实 A 股数据(建议你投稿前一定做这一步)
为了满足“亲自测评”的可信度,我建议你至少替换一次真实数据,并贴出你自己的运行截图。
这里给一个不绑死数据源的通用格式:只要你能整理成一个 CSV,包含这些列即可:
date(日期,YYYY-MM-DD)
open, high, low, close
volume
然后保存为:
data/sample_daily.csv
再跑一次 python main.py,输出就会基于你的数据生成。
如果你使用的是任何第三方数据接口,请遵守其许可与使用条款;同时注意个人投稿不要泄露 token/账号信息。
10.我建议你在发帖里怎么写“可复用 Skill”
活动希望大家能“直接导入复用”。我建议你这样组织帖子:
一句话介绍:风控优先的仓位控制骨架
使用场景:回撤太大、仓位管理混乱、想做参数对比
调用方式:3 行命令跑起来
效果对比:无风控 vs 有风控(至少 2 张图 + 1 个表)
可扩展点:换信号、换数据、加手续费、扩展多标的
你真实踩坑:止损会被洗、回撤阈值太激进会踏空等
这样写既符合活动导向,也比较像“亲测后沉淀的最佳实践”。
11.免责声明(强烈建议保留)
本项目仅用于学习与研究,不构成任何投资建议。
任何历史回测都不代表未来表现。
实盘交易存在滑点、手续费、成交限制、黑天鹅等多重风险。
请对自己的资金与决策负责。
12.更“工程化”的拆分建议:把风控写成独立模块(可作为你后续迭代方向)
如果你打算把这个 Skill 从“示例脚本”升级成“长期可用的小工具”,我建议做两件事:
12.1 把仓位决定逻辑封装成三步
signal():策略告诉你“是否允许持仓”
risk_budget():风控告诉你“今天允许承担多少风险”
position_sizing():把风险预算转成仓位(或股数)
这三步拆开后,你能得到一个非常清晰的协作边界:
研究员只管信号,风控只管风险预算,交易执行只管下单与成本。
12.2 把参数配置外置
当前参数写在 Config 里,优点是简单。
但当你开始做多组对比测评时,你会希望把它们外置到:
config.yaml 或 config.json
命令行参数(例如 --target-vol 0.15)
这样你就能批量跑出一组“参数-结果”表格,更像严肃的测评。
13.常见问题(FAQ):我在测评时最常被问到的 10 个问题
Q1:为什么不用更复杂的策略?
因为这次测评的主角不是“信号”,而是“风控覆盖层”。
信号越复杂越容易把问题搞糊:你很难判断效果变化到底来自策略还是来自风控。
Q2:波动率目标会不会降低收益?
可能会。尤其在强趋势行情里,波动率上升往往伴随上涨,你降仓就会少赚。
但它的意义是:当波动上升意味着风险上升时,你不至于因为仓位不变而承受超预期回撤。
Q3:回撤阈值怎么选?
经验上有三个原则:
先看你能承受的最大亏损(心理 + 资金)
再看策略的历史回撤分布(比如 95 分位)
最后让 dd_soft 略低于“你开始难受的点”,让系统先替你降仓
Q4:止损是不是“反人性”?会不会被来回打脸?
会。止损是典型的“体验换收益”的机制:
它减少一次性大亏,但也会增加小亏次数,尤其在震荡市里容易被洗。
因此我把止损定位为“安全阀”,并建议:
先在回撤明显的资产上使用
或者把阈值放宽(比如 10%~12%)
或者只在回撤乘数已经下降时才启用更严格的止损
Q5:为什么这里用的是“线性降仓”?
因为线性最容易解释,也最适合测评。
你后续完全可以换成更“非线性”的降仓方式,例如:
指数型降仓(更快地降低风险)
分段阶梯(例如 10% 回撤半仓,15% 回撤 1/4 仓,20% 清仓)
Q6:A 股的涨跌停怎么处理?
这个示例为了可运行与通用性没有加入涨跌停。
如果你要更贴近 A 股,可以加两条规则:
当天触发止损但跌停无法卖出 → 延迟到可成交日
交易成本加入滑点与手续费(尤其对高换手策略影响很大)
Q7:怎么加入手续费/滑点?
最简单的方式是在每日收益里扣除“换手成本”。
例如当仓位变化 abs(exposure_t - exposure_{t-1}) 较大时,扣:
cost = turnover * fee_rate
然后把净值更新改成:
equity *= (1 + exposure_prev * ret - cost)
这会显著改变你对“频繁止损/频繁降仓”的看法,也更贴近真实交易。
Q8:这个 Skill 能不能用于多只股票?
可以,但你要先回答一个设计问题:
你是做“单票择时”,还是做“组合管理”?
单票择时:每只票独立风控,然后你在多票之间分配资金
组合管理:先形成组合收益,再对组合做波动率目标与回撤控制
我更建议从“组合管理”入手,因为风险最终是组合层面的。
Q9:用示例数据跑出来的结果有意义吗?
有意义,但意义不在于“收益率数值”,而在于:
代码框架是否清晰
仓位变化是否符合直觉
风控机制能否稳定工作并输出可解释结果
当你把真实数据接进来,才开始讨论策略好坏。
Q10:如何把它包装成更像“Skill”的形式?
如果你想让别人更容易复用,我建议你进一步加:
一个命令行入口:python main.py --data xxx.csv --out output/
一个“参数预设”:激进/平衡/保守三套
一个“一键对比脚本”:自动跑出 2~3 组参数的对比表与对比图
14.多 Skill/多方案对比(加分项写法:同一需求下比较不同风控)
活动里“多 Skill 对比”是加分项。我这里提供一个可直接照抄的对比角度:
同样的信号(SMA 趋势过滤),比较三种风控组合:
“当我把风控一层层加上去,收益率可能没那么好看了,但净值曲线明显更平滑,也更符合我能长期执行的风格。”
说明:本文与配套代码为原创实现,目的在于演示“把风险控制做成可复用模块”的实践方法。文中的回测数据默认为自动生成的示例行情,股市有风险,投资需谨慎,上述仅为个人分享,不作为投资依据及建议。
