ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

道法术器势:A股量化交易系统构建实战指南

道法术器势:A股量化交易系统构建实战指南 1. 为什么是“道法术器势”1.1 这套框架能解决什么问题做量化交易的这几年我收到过最多的私信不是“用什么库写策略”而是“我该从哪里开始”。这个问题听起来简单实际上背后藏着一整条认知链你到底是缺一套交易理念缺一个靠谱的策略模板缺数据源和回测工具还是缺对A股市场节奏的判断如果一上来就奔着最扎眼的“Python量化交易策略代码”去多半会写出一堆能跑、但根本不敢实盘的代码。我后来想明白一个事量化交易和传统交易最大的区别在于它把决策过程拆成了可以单独审视的环节。既然要拆那就不如拆得彻底一点。用“道、法、术、器、势”这五个字来框架化整个量化体系是我比较推荐的做法——它本身就是一个天然的层次模型从世界观到方法论到工具链再到时机判断层层递进但互相咬合。这篇文章就是我基于这套框架在A股市场的完整实操笔记适合已经开始接触量化、但还没形成系统认知的朋友也适合那些写过几段策略代码、却始终在回测和实盘之间找不到感觉的人。1.2 别把量化想得太神秘先泼一盆冷水量化交易不是什么稳赚的黑科技更不是装上某个软件就能躺着收钱的东西。它的本质是把交易决策规则化、程序化让计算机按照你事先定好的逻辑去执行。赚不赚钱取决于你定下的逻辑本身有没有优势而不是程序跑得多快、界面多炫。我看过很多新人把大量时间花在最表层的“器”上——今天换个数据源明天试个新回测框架后天研究怎么把下单速度从200毫秒优化到100毫秒。这些工作不是没价值但它解决的是“怎么执行”而不是“凭什么赚钱”。就好比你花大价钱换了一副更清晰的眼镜但看的却是一张错误的地图。所以在展开具体代码和工具之前我建议你耐心把前两章看完——道和法这两层决定了你的器、术、势有没有意义。2. 道量化交易的核心认知2.1 量化赚的是谁的钱聊“道”之前先说明白这里说的不是玄学而是你对市场的基本假设。每个策略背后都有一套关于市场运行逻辑的信念这个信念就是你的“道”。比如你相信价格短期偏离后会回归那你做的是均值回归你相信趋势一旦形成会延续那你做的是动量。没有信念的策略代码写得再漂亮也只是随机开盲盒。在A股市场做量化首先要承认一个现实这个市场的交易者结构里散户占比相当高行为模式有很强的惯性。这意味着两件事一是市场的非理性波动比成熟市场更频繁二是基于行为金融学的策略在A股有更肥沃的土壤。比如春节前后的日历效应、ST板块的博弈逻辑、小市值股票的壳价值波动这些在教科书里不一定讲但真实存在。那量化到底赚谁的钱说得直白一点三类钱第一类是流动性提供者的钱你通过承担风险、为市场提供买卖流动性来获取价差或波动补偿第二类是信息处理的钱你比别人更快、更系统地把公开信息转化为定价信号第三类是情绪博弈的钱你在别人恐慌时买入、狂热时卖出。搞清楚自己赚的是哪一类钱你就知道自己策略的“护城河”在哪里。2.2 建立交易哲学先亏得明白再赚得稳我见过不少人第一版策略就野心很大想抓住所有行情结果回测曲线确实漂亮一上实盘就连续打脸。为什么会这样因为回测曲线好看往往意味着过拟合而过拟合的本质是你把太多参数调到了历史数据上等于在“背诵答案”。这里我想分享一个我的个人体会做量化第一步不是追求赚钱而是追求“亏得明白”。每一个策略、每一笔交易你都要能说清楚它为什么会亏损。如果你的策略亏钱了但你能明确地解释是市场状态变了、还是参数失效了、还是执行出了问题那么这笔学费就是有价值的。最怕的是策略亏了你完全不知道代码在哪一步违背了你的预期那说明你的“道”是模糊的。我自己是把交易哲学写成一页纸的文档放在策略文件夹根目录里的里面就写三句话我在什么市场状态下会出手我凭什么认为这个状态下我的策略占优我在什么情况下必须无条件退出。后来发现这三句话几乎能过滤掉一半以上的冲动型策略想法。你也不妨试试在写任何代码之前先把这三句话写下来。3. 法策略框架与风控体系3.1 策略类型趋势、均值回归与事件驱动怎么选“法”就是你把“道”落成可执行的规则体系。这里最核心的选择是策略类型。A股常见的量化策略大致分三类它们的底层逻辑完全不同适用的市场环境也完全不同。趋势跟踪策略核心假设是价格一旦突破某个区间就会沿着突破方向继续运动。这类策略在单边行情里表现极好但在震荡行情里会被反复打止损胜率通常不高但赔率大。均值回归策略则相反它假设价格偏离均值后大概率会拉回来适合区间震荡市场但遇到强趋势会不断逆势加仓最后被深套。事件驱动策略则是围绕财报发布、业绩预告、指数成分调整、重大公告等可预测的时间点做埋伏A股的特殊制度环境给这类策略提供了很多独特机会。我建议新手不要一开始就做多策略组合先选一个方向做到能稳定回测、能解释每一笔盈亏再谈扩展。从A股的特性来看我个人觉得均值回归类策略对新人相对友好因为它的逻辑直观、参数敏感度相对低而且A股散户主导的波动结构天然容易产生超调和回归。3.2 资金管理与止损活下来比盈利重要很多人写策略代码时只写了“什么时候买入、什么时候卖出”完全忽略了仓位管理。这是新手最危险的地方。你在回测里可以满仓进出因为资金曲线只是数字但实盘里一个满仓回撤20%你的心态就会崩一崩就会乱操作乱操作就会把体系彻底打乱。资金管理的核心有两块一是单笔风险控制在总资金的固定比例内比如我自己的标准是单笔损失不超过总资金的1%这样即使连续止损十次回撤也在一个可承受范围内二是仓位要与策略的胜率和赔率挂钩用凯利公式的保守版本去估算一个基础仓位比例然后在这个基础上打折使用因为凯利公式假设你的胜率估算足够准确而实盘里这个假设往往过于乐观。止损的设置也要讲章法不是随便设个固定百分比就完事。基于波动率来设置止损会更科学比如用ATR平均真实波幅乘以一个系数作为止损距离这样在波动放大的时候止损距离自动变宽不会轻易被市场噪音打出去在波动收敛的时候止损距离变窄保护已有利润。我的实践经验是止损逻辑要和入场逻辑匹配如果你的入场信号是基于波动率突破的那止损也尽量用波动率来定保持逻辑的一致性。4. 术A股实战策略与Python实现4.1 一个可落地的双均线策略拆解“术”是具体的招式。所有大道理最终都要落到一段能跑的代码上。这里我拿一个双均线趋势策略做例子它不是最赚钱的但它足够简单、足够透明非常适合用来理解从策略逻辑到代码实现的完整链路。策略逻辑是这样的当短周期均线上穿长周期均线时买入金叉当短周期均线下穿长周期均线时卖出死叉。这个策略的关键参数有两个短周期和长周期的窗口长度。在A股市场我个人比较常用的是一组非对称参数短周期用20天长周期用60天。为什么非对称因为A股做空工具受限大多数情况下你只能做多所以入场要相对灵敏离场也要干脆不要拖泥带水导致利润回吐。这里要特别提一点均线策略在A股有个很尴尬的地方就是信号频繁震荡导致的“反复打脸”。为了缓解这个问题可以加一个最简单的过滤条件——只在长周期均线方向向上时才接受金叉信号。这样等于给策略加了一层“大势过滤”虽然会减少一部分交易机会但能明显降低震荡市的噪音。这种小改动往往比调均线参数更有效果。4.2 Python策略代码实现与回测要点下面是一段我实际用过的简化版本代码。数据用的是某财经数据接口的日线行情你们可以按自己手上的数据源替换读取部分。import pandas as pd import numpy as np def load_daily_data(symbol, start_date, end_date): # 这里用你自己的数据源至少需要 date, open, high, low, close, volume 六列 # 示例结构实际请替换为真实数据读取 df pd.DataFrame() # df read_from_your_source(symbol, start_date, end_date) return df def dual_ma_strategy(df, short_window20, long_window60, filter_trendTrue): df df.copy() df[ma_short] df[close].rolling(short_window).mean() df[ma_long] df[close].rolling(long_window).mean() df[trend_up] df[ma_long] df[ma_long].shift(1) df[signal] 0 # 金叉且长均线向上时才做多 df.loc[(df[ma_short] df[ma_long]) (df[ma_short].shift(1) df[ma_long].shift(1)) (df[trend_up] if filter_trend else True), signal] 1 # 死叉平多仓 df.loc[(df[ma_short] df[ma_long]) (df[ma_short].shift(1) df[ma_long].shift(1)), signal] 0 df[position] df[signal].replace(0, np.nan).ffill().fillna(0) df[ret] df[close].pct_change() df[strategy_ret] df[position].shift(1) * df[ret] return df def backtest(df, init_cash1000000): df[equity] init_cash * (1 df[strategy_ret]).cumprod() total_ret df[equity].iloc[-1] / init_cash - 1 annual_ret (1 total_ret) ** (252 / len(df)) - 1 # 最大回撤 cum_max df[equity].cummax() max_drawdown (df[equity] / cum_max - 1).min() print(f累计收益: {total_ret:.2%}) print(f年化收益: {annual_ret:.2%}) print(f最大回撤: {max_drawdown:.2%}) return df这一段代码有三个细节值得展开说说。第一个是position的计算用signal.replace(0, np.nan).ffill()来填充信号这个写法很关键——它的意思是信号只在金叉死叉瞬间发生变化其他时间保持前值这样避免了我们把“持仓状态”和“每日信号”搞混。第二个是strategy_ret计算时用了shift(1)这是因为当天的信号要到第二天开盘或收盘才能执行不能当天信号当天生效否则就犯了未来函数的大忌回测结果会严重虚高。第三个是计算年化收益时为什么用252而不是365因为A股一年大约只有250个左右的交易日用自然日计算年化会低估真实年化水平。回测写完还不能直接拿来用。你必须做一步最基础的稳健性检查把短周期参数从15到30、长周期参数从50到90分别跑一遍看收益和回撤是不是在一个合理的范围内连续变化。如果某个参数组合收益率特别高、但相邻参数收益率急剧变差说明这个策略很可能是在某段特定走势上过拟合了实盘翻车概率非常高。我自己做参数敏感性测试时有一个习惯参数平面的中间偏高区和边缘区的差距不要超过一倍否则这个策略的核心逻辑就有问题。5. 器工具链与数据环境5.1 数据源、回测框架与实盘接口怎么选“器”是工具层。这层最容易被新人过度投入所以我直接给结论够用就好把时间省下来花在策略本身。数据源方面做日线级别的A股策略其实要求并不高日线数据有几个公开渠道可以搞定基本免费。但如果要做分钟级甚至tick级的高频策略数据成本会上一个数量级而且对数据质量的要求极为苛刻比如复权因子的精确性、停牌数据的处理、涨跌停边界的一致性这些细节一个不处理到位回测结果就会出现系统性偏差。我的建议是新手从日线数据起步先把逻辑验证通再考虑要不要上更高频的数据。回测框架的选择也很有讲究。市面上的通用回测库比如用Python写的backtrader、vectorbt功能都很强大文档也全但它们都是“普适”框架需要你花时间去学习它们的事件模型和订单处理逻辑。还有一种选择是自己写回测像我前面那段代码一样自己管理信号、持仓和资金曲线。自己写的回测框架虽然功能简陋但每一行逻辑都是你自己定义的出了问题能很直观地找到原因。对新手来说我甚至更推荐后者——你亲手写一遍回测你对“买卖点如何映射到收益”这件事的理解会深入好几个层次。5.2 从回测到实盘的关键细节回测跑通了下一步是实盘。这一步的跨度比大多数人想象得大。回测里的成交假设通常过于理想比如默认按收盘价成交、默认没滑点、默认信号当天能及时执行。实盘里价格会滑点、涨停板买不进、跌停板卖不出、停牌股无法交易这些都会让你的实际收益和回测收益产生显著差异。我自己的做法是在回测里主动加入一些“惩罚性假设”。比如成交价格在信号价格基础上加一个固定滑点通常按千分之一到千分之三估算对日线策略来说已经比较保守再比如假设信号延迟一天执行而不是当天执行这两条加进去之后回测收益如果还能接受实盘的心理压力会小很多。还有一个很容易被忽略的细节A股的交易制度对实盘影响极大。T1制度意味着当天买入的股票当天不能卖出这对日内策略是致命限制对日线以上的波段策略影响相对小。涨跌停制度意味着极端行情下单可能无法成交所以任何策略在上实盘前都要认真想一遍如果连续两天一字涨停买不进、或者连续跌停卖不出你的资金和仓位能不能承受。6. 势A股市场的节奏感6.1 市场周期与策略状态的切换“势”在量化里相对很少被系统化讨论但它恰恰是A股最值得研究的一层。A股市场的最大特征是“牛短熊长”和“板块轮动”非常明显这意味着你的策略不是在任何时候都该满仓运行的学会识别大势、调节策略状态比优化单一参数重要得多。一个很朴素但有效的判断方法是用指数本身的长周期均线和成交量变化来定义市场状态。比如把沪深300指数的20周均线作为牛熊分界线指数在线上且均线向上定义为多头状态此时趋势类策略的仓位权重可以打满指数在线下定义为空头状态此时应该大幅降低趋势策略仓位转向保守的绝对收益策略或者直接空仓等待。我自己会做一个最简单的“策略状态机”市场状态分三档进攻、防守、观望。判断依据就是指数周线趋势和平均成交量两个维度。这个状态机本身不产生交易信号但它决定了我其他策略的开关和仓位上限。事实证明这套粗粒度过滤器帮我避开了A股好几轮系统性下跌代价只是错过了一部分反弹初期的行情这个取舍我认为非常值得。6.2 成交量、涨跌停与流动性的量化表达“势”不光是大盘的牛熊也包括个股的活跃度和流动性。A股很多策略失效不是逻辑错了而是用在了不合适的标的上。比如你做了一个短期动量策略选出来的股票如果日成交额不到一个亿那在真实交易中稍微买多一点就会把价格打上去你的入场成本远高于回测模拟策略自然失效。所以在选股和交易过滤里我建议把流动性作为一个强制条件写进代码。常见的过滤器有过去20天日均成交额不低于某个阈值我常用的标准是2亿以上、过去20天日均换手率在某个区间太低说明没人关注太高说明投机过度、剔除上市不满一年的次新股走势容易被资金操纵样本也少。涨跌停是A股另一个特殊的“势”。一个股票如果经常触及涨停说明有资金在强烈运作但这不一定意味着你该追反过来一个股票连续跌停后第一次打开跌停往往会出现超跌反弹的机会这种事件驱动的“势”反而是均值回归策略的好猎场。我见过有人专门做“跌停板打开”策略逻辑就是在恐慌最极端时买入用严格的止损保护逆势风险整体胜率在A股历史上还不错。这就是把制度规则转化为策略优势的典型例子。7. 常见问题与避坑实录7.1 新手最容易踩的几个坑第一个坑是未来函数。很多回测收益曲线异常漂亮Debug到最后发现是代码里用了未来数据。最常见的几种情况用当天的收盘价计算信号、当天信号当天成交、不小心用了整个样本区间的统计量去做标准化。我的排查方法是每写一个因子或信号都先在代码里打印出“信号产生日期”和“成交日期”人工核对两条关键交易确认信号日期一定早于成交日期。第二个坑是幸存者偏差。如果你做股票池筛选的回测数据里必须包含已经退市和长期停牌的股票否则你的回测只在“活下来”的股票上做收益会严重高估。这一点在A股尤其明显因为A股历史上退市率不高但ST和长期停牌的情况很多剔除这些样本等于隐性地承认自己未来能完美避雷实盘根本做不到。第三个坑是过度优化参数。我有段时间陷入了调参的快感里觉得参数稍微动一点收益就上一个台阶特别有成就感。后来发现那不过是把噪声拟合进了历史数据。现在的规矩是主要参数只允许在一个合理的窄区间内调整而且每次调参都必须能说清楚“为什么这个值有经济含义”说不清楚就不允许改。第四个坑是忽视交易成本。A股的印花税、佣金、滑点加在一起对高频交易来说成本占比非常高。我见过有人用万2.5的佣金标准做回测看起来成本很低但实际上散户通过普通券商根本拿不到这个费率而且滑点在A股这种报价档位较厚的市场里经常比佣金贵得多。回测里一定要用保守的成本参数宁可低估收益不要高估。7.2 我的实战心得体会踩过几年坑之后我形成了一个比较稳定的工作流程分享出来供参考。第一步是先写交易哲学三句话也就是“道”第二步是写策略的逻辑说明文档把入场、离场、止损、仓位每个环节的原理解释清楚这是“法”第三步才去写代码和回测而且是先跑参数敏感性测试再跑样本外测试这是“术”和“器”的环节第四步是用大盘状态机决定策略什么时候允许上仓位这是“势”。这套流程看起来繁琐但每个环节其实花不了太多时间真正的作用是强制我把每个决策都想清楚。尤其是写逻辑说明文档这一步很多想法在脑子里觉得没问题真正落到纸上才发现漏洞百出。如果你身边没有可以讨论策略的人这个文档就是你的“假想对手方”把攻击性的问题写下来自己回答比闷头跑代码有效得多。最后再分享一个小技巧每次回测跑完不要只看最终的收益和回撤数一定要画出资金曲线并人工观察曲线的形态。好的策略曲线应该是回撤区间相对集中、之后能快速修复但如果你看到一条几乎不回撤的直线别高兴那大概率是出了bug或者过拟合了真实的交易里不存在那样的资金曲线。A股市场足够大、也足够复杂容得下各种各样的策略逻辑但前提是你真的理解自己在做什么。量化交易这条路慢就是快把道法术器势每一层都打扎实后面才走得稳。
返回列表