调仓频率:多久换一次仓,这个旋钮比你想的贵得多
两个人用同一套选股逻辑,选出来的名单几乎一模一样。一个人每个月底照名单调一次仓,另一个人每天收盘后看一眼、有变化就换。一年下来,两人的账户差了一大截。
差在哪?不在眼光,在多久动一次手。
这个「多久动一次手」,在量化系统里有个名字叫调仓频率——你隔多长时间重新算一遍该持有什么、然后把仓位调整过去。它看起来像个无关紧要的习惯问题:勤快点还是懒散点而已。但它其实是整套策略里最贵的一个旋钮,因为你往任何一边拧,都要在别的地方还债。
先说人话:它到底在调什么
想象你开一家小超市,要决定多久整理一次货架。
每天整理一次:货架永远跟得上最新的销量数据,什么好卖就摆在最显眼的位置。代价是你每天都得付搬运工的工钱,而且搬得太频繁,箱子磕碰、商品损耗都会跟着涨。
一个季度整理一次:搬运费省下来了,可你的货架反映的是三个月前的畅销榜。这三个月里冒出来的新爆款,要等到下次整理才轮得上位置。
还有第三层,很多人想不到:如果你把整理周期缩到每天,那你一次能进的货量就受限了——供货商一天只能送这么多,你要一天之内把整个货架翻新,超出这个量供货商供不上,你只能高价从别处调货。整理越勤,单次能腾挪的货就越少。
这三件事就是调仓频率的全部麻烦:搬运的钱、货架跟不跟得上最新销量、一次能腾挪多少货。它们不是可以分开解决的三个问题,而是同一个旋钮的三个刻度盘,拧一下三个一起动。
投资层:三个方向同时拉扯你
回到账户里,这三件事分别叫成本、新鲜度、容量。
成本这一头,几乎是按次数线性长的
你每调一次仓,就要付一次过路费。这笔钱不止一项:券商的佣金、卖出时的税费,还有滑点(你以为能在这个价成交,实际成交价差了一点,这个差额就是滑点)和冲击成本(你自己的买单把价格推高了,等于跟自己抢货)。
关键在于,这些钱基本是按「动手次数 × 每次动多少」算的。同样一套持仓,每月调一次和每天调一次,前者一年动手十二回,后者两百多回。哪怕单次成本小到你懒得看,乘上次数之后就变成了一个必须正视的数——它不是从你的收益里扣掉一小块,很多时候它扣掉的是全部超额部分。费用怎么一层层叠上去,手续费与印花税:高频策略的隐形杀手 那篇讲得更细。
更要命的是,这笔钱是确定发生的,而你换仓换来的收益改善是不确定的。用一笔确定的支出去换一份不确定的期待,频率越高,这个交换做得越多,赌注也越大。
新鲜度这一头,取决于你的判断能撑多久
反方向的力来自这里:调得太慢,你的判断会过期。
任何一个买入理由都有保质期。「这家公司利润在改善」这类理由,可能几个季度都还成立;「这只票最近三天资金在往里流」这类理由,可能三天后就完全变了。你的判断能撑多久,就决定了调仓频率的下限——理由三天就失效,你却一个季度才动一次手,那你大部分时间持有的是一个早就不成立的理由。
这里有个很有用的自检:把你的买入理由写下来,然后问自己「这句话在多久之后还会是真的」。答案就是你的频率量级。用月度理由做日度调仓,你只是在为噪音付手续费;用日度理由做季度调仓,你等于揣着一张过期车票。
容量这一头,是最容易被忽略的
第三个方向最反直觉:调仓频率决定了这套方法最多能装多少钱。
道理和超市补货一样。市场每天能吃下的成交量是有限的,你一次要换的仓位越大、要求换完的时间越短,你自己就越会把价格推向不利的一边。所以频率越高,单次可承载的资金规模越小。同一套逻辑,管一百万和管一个亿,能用的最高频率完全不同——不是本事问题,是市场的吞吐量问题。这就是为什么很多人小资金跑得好好的方法,钱一多就不灵了。这条线在哪儿,流动性与策略容量 是正主。
这三个方向没有共同的最优解。 你只能问自己:我的判断保质期多长、我管多少钱、我付得起多少过路费——三个答案交叉出来的那个区间,才是你的频率。任何一个不问自身条件、直接说「日频比月频好」或者「低频才是正道」的说法,都是在替你回答一个只有你自己能回答的问题。
系统层:频率在真实系统里长什么样
概念说完,看看三套开源系统各自把这个旋钮做成了什么形状。有意思的地方在于,它们做出来的不是同一个旋钮——这恰恰说明「调仓频率」在工程上不是一个数,而是一组彼此牵制的设定。
freqtrade:先定「多久看一眼」,再拿一堆闸门压住手
freqtrade 是加密货币交易机器人,它的频率首先由一个叫 timeframe 的设定决定——你用多长的 K 线(一根蜡烛代表多长时间的价格,比如一小时一根)来做判断,这就定了你多久重新评估一次。
但它还配了一个更细的开关 process_only_new_candles(当前默认开启,可配置):开着的时候,只有新 K 线出现才重新计算指标。文档里解释得很直白,关掉它的话每一轮循环都会重算一遍同一根还没走完的 K 线,除了增加系统负担,更本质的问题是——你会对着一根尚未定型的蜡烛反复改主意。这个开关的存在本身就说明了一件事:在系统层面,「多久重新想一次」和「多久动一次手」是两个需要分开管的东西。
它还有一类叫「保护」的插件专门给频率踩刹车。比如冷却期保护:某个品种上一笔交易刚平掉,接下来一段时间内这个品种被锁住,不允许再进场。这不是为了省手续费,而是为了拦住那种「刚被打出来又追回去」的来回摩擦——同一个品种在短时间里反复进出,通常不是信号在变,是噪音在晃。
最能说明问题的是它的参数搜索损失函数。当你让程序自动去试哪组参数好的时候,它默认的评价方式不只看总收益,还额外做两件事:一是惩罚交易笔数偏离一个预设目标(源码里以模块常量写死,注释明确写着「改成适合你的并发交易数、让它符合实际天数」,也就是说这是留给你按自己情况改的),二是惩罚平均持仓时长过长。换句话说,这个系统在参数搜索阶段就已经把「频率是否合理」当成打分项,而不是等收益算完了再回头补一句「哦成本没算」。
qlib:频率被拆成了两个旋钮
qlib 的做法给了一个更重要的启发。它有个常用的组合策略,构造时要你填两个数:topk(组合里持有多少只)和 n_drop(每个调仓日替换掉几只)。
停下来想想这意味着什么。假设持有二十只,每期换一只,和每期换十只——调仓周期完全一样,但实际换手天差地别。所以在工程上,「多久调一次」根本不足以描述频率,真正决定你付多少过路费的是「多久调一次 × 每次换多大比例」这个乘积。很多人嘴上说自己是「月度调仓」,实际上每个月把整个组合翻一遍,那和口头上的低频毫无关系。
它还有第三个刹车 hold_thresh,意思是最小持有期:卖出前先检查这只票已经拿够天数了没有。这条约束和信号无关,纯粹是给换手上一道硬闸——哪怕模型明天就改主意,你也得先拿满。
而在账本那一侧,qlib 的账户对象每一期都会累加成交金额,并算出一个换手率(当期成交额 ÷ 上期账户总值),跟收益、成本一起记进业绩表。这个设计传递的态度很明确:换手率不是事后想起来才去查的诊断项,它是和收益并列的一等公民,每期都记。至于换手率这个指标本身的定义、以及它为什么不能跨不同盘子横向比,换手率 那篇讲的是通用原理,比这里细得多。
Vibe-Trading:把「不想动」直接写进优化目标
第三种做法最激进。它有个「换手感知」的组合优化器,在求最优权重的时候,目标函数里除了收益项和风险项,还加了一项跟上一期权重的偏离惩罚——你离上次的持仓越远,罚得越狠。
效果是什么?优化器不再是每期从零开始找一个「最好的组合」,而是在「更好的组合」和「懒得动」之间做权衡。只有当新方案好到足以盖过这份惩罚,它才会真的换。这等于把「调仓是有代价的」这件事,从事后的成本核算,提前进了做决策的那一刻。
它的模块说明里还留了一句非常实在的提醒:这个惩罚项的力度是尺度敏感的——它是拿来跟收益项比大小的,而收益项的数量级取决于你输入的是日收益还是别的周期。所以同一个惩罚力度,换个数据频率含义完全变了,必须按自己的数据重新校。这是那种只有真做过才写得出来的话。
同一个仓库里还有一份逐次调仓的记录模块,它把两种换手明确区分开:一种是目标权重变了多少(信号和优化器想换多少),另一种是执行层实际成交了多少。注释里点出了要害——churn(来回折腾)是从信号那一端开始的。这个区分很有价值:如果你发现成本高得离谱,得先分清是你的模型太善变,还是执行环节太笨拙,这两件事的药方完全不同。
为什么频率不该交给优化器去选
这一节是我最想让你记住的。
看到「频率是个可调的数」,很多人的第一反应是:那就把它当参数,让程序把每种频率都试一遍,哪个历史收益高用哪个。
这条路有两个坑,而且都很深。
第一,频率这个参数会放大你所有的成本假设误差。 回测里的成本是你假设的,不是真发生的。假设你把单次成本估低了一点点——在低频下,这点误差乘以少数几次调仓,几乎看不出来;在高频下,同样的误差乘以几百次,就足以把一条平的曲线抬成一条漂亮的斜线。于是搜索程序会系统性地偏爱高频,不是因为高频真的更好,而是因为高频那一档的成本被低估得最多。成本假设怎么写才不至于自欺,见 回测里的交易成本假设。
第二,频率的候选值太少,最容易过拟合。 日、周、月、季,撑死几个选项。你在这几个里挑一个历史表现最好的,本质上和在一堆参数里挑最好看的没有区别,而选项越少、每个选项的样本差异越大,选出来的「最优」越可能只是运气。
正确的姿势反过来:频率不是搜出来的,是推出来的。 先从你的判断保质期定一个量级,从你的资金规模定一个上限,两头夹出一个区间,然后在这个区间里检查成绩对频率是不是敏感。如果稍微改一下频率、成绩就塌了,那这套方法本身就靠不住,跟频率选得对不对没关系。
「我是低频,所以成本可以忽略」是最常见的自我安慰。 真正决定成本的是换手率——多久调一次 × 每次换多大比例。一个每月调一次、但每次把整个组合翻一遍的做法,年换手可能比某些「高频」还高。判断自己是不是低频,别看日历,看你一年到底把本金来回买卖了几遍。
失效边界与常见误用
把调仓频率和再平衡混为一谈。 再平衡是把偏离了的仓位比例拉回原定配置,它调的是比例;调仓频率讲的是重新做判断、换标的,调的是名单。两者都要动手、都要付费,但目的完全不同,混着谈会得出很奇怪的结论。再平衡是什么,术语卡 里有一句话的说明。
以为降低频率就一定省钱。 降频省的是次数,但如果你把每次的调整幅度也放大了(憋久了一次换个够),总换手可能一点没降,还额外承担了「一次性大额换仓」带来的冲击。频率和单次幅度要一起看。
在回测里挑一个频率,就当它在真钱上也成立。 回测里的成交是假设出来的,你要多少有多少;真钱上,频率越高越容易撞上「想换换不动」的时候。流动性差的品种尤其如此,流动性 是这里的前提条件,不是背景板。
忽略了频率对你自己的消耗。 这条不在任何代码里,但很实在。需要你每天盯着执行的方法,和一个月只动一次的方法,对注意力和情绪的消耗完全不是一个量级。一套你坚持不下来的高频方法,实际收益是零——甚至是负的,因为你多半会在最难受的时候中途放弃。
用交易次数证明自己勤奋。 动手次数和收益之间没有正相关关系。在成本确定、收益不确定的结构下,多动一次手,就是多做一次确定的支出。
小结
- 调仓频率不是习惯问题,它同时压着三件事:交易成本(按次数累积)、信号新鲜度(判断的保质期)、策略容量(能装多少钱),拧任何一边都要在另外两边还债。
- 真正决定成本的从来不是「多久调一次」,而是「多久调一次 × 每次换多大比例」——qlib 把这两个数做成了两个独立参数,正是因为它们缺一不可。
- 三套系统三种形状:freqtrade 用 K 线周期定评估节奏、用冷却期锁住来回摩擦、在参数搜索的打分里就惩罚交易笔数与持仓时长;qlib 把频率拆成持仓数与每期替换数,另加最小持有期硬闸,并把换手率当成和收益并列的每期记账项;Vibe-Trading 把「偏离上期持仓」直接罚进优化目标,让「懒得动」成为默认。
- 频率不能交给优化器去搜:成本假设的误差会被高频放大,让搜索系统性地偏爱高频;而候选值又太少,选出来的「最优」多半是运气。它应该从判断的保质期和你的资金规模两头夹出来。
- 自检一句话:判断自己是不是低频,别看日历,看你一年把本金来回买卖了几遍。
一句话记住这篇:你换得越勤,付出去的钱越确定,赚回来的钱越不确定。
本文所引源码与文档均来自上述快照版本,是阅读代码得出的机制说明,不是运行结果;具体行为请以你手上那个版本为准。回 量化与 AI 投研概念库 看其它概念各自在说什么,或到 量化与 AI 投研卷 顺着读;本站内容为投资教育,不构成任何投资建议,边界见 免责声明。
本文为投资教育整理,关键数据与结论请结合下列权威来源验证。
- freqtrade 源码快照 b3404c9(2026-08-18):freqtrade/strategy/interface.py、freqtrade/plugins/protections/cooldown_period.py、freqtrade/optimize/hyperopt_loss/hyperopt_loss_short_trade_dur.py、docs/configuration.md ↗
- qlib 源码快照 79633dd(2026-07-23):qlib/contrib/strategy/signal_strategy.py、qlib/backtest/account.py、qlib/backtest/report.py ↗
- Vibe-Trading 源码快照 3a752d5(2026-08-04):agent/backtest/optimizers/turnover_aware.py、agent/backtest/rebalance_notes.py ↗