4. 交易标的与资产池:股票池定义、合约规格、交易成本模型
做回测的第一步,不是写代码,而是想清楚你要交易什么。
我见过不少新手,上来就写策略逻辑,结果跑回测时发现股票池里混进了ST股、停牌股,或者手续费算得离谱。嗯,这些坑我都踩过。今天我们就来聊聊交易标的和资产池的定义,以及那个让人头疼的交易成本模型。
4.1 股票池定义:你的“选股篮子”
股票池,说白了就是你的策略只能在哪些股票上交易。你不能让策略去交易全市场4000多只股票,那既不现实,也没必要。
我个人习惯把股票池分为三类:
- 全市场池:所有A股,但需要过滤掉ST、*ST、停牌股、上市不足60天的次新股。
- 指数成分股池:比如沪深300、中证500、创业板指。这类池子流动性好,适合大资金。
- 自定义池:比如只做消费股、医药股,或者你自己通过基本面筛选出来的股票。
核心要点:股票池必须在回测开始前固定下来。你不能在回测过程中动态修改池子,那叫“未来函数”,是回测作弊。
举个例子,我曾在项目中遇到过一个问题:策略在回测里表现很好,但实盘却亏得一塌糊涂。后来发现,回测时股票池包含了大量小盘股,而实盘时这些股票流动性不足,根本买不进去。所以,股票池的流动性过滤非常重要。
4.2 合约规格:每只股票的交易规则
每只股票都有自己的“脾气”,也就是合约规格。你需要告诉回测引擎:
- 交易单位:A股是100股(1手),科创板是200股。港股、美股又不一样。
- 最小变动价位:A股是0.01元,但有些ETF是0.001元。
- 涨跌停限制:主板±10%,创业板、科创板±20%,北交所±30%。
- 交易时间:A股是9:30-11:30、13:00-15:00。集合竞价阶段能不能交易?这也要定义清楚。
你想想看,如果回测引擎不知道涨跌停限制,策略在涨停板时还买入,那回测结果就是假的。我曾经犯过这个错,回测年化收益50%,实盘直接腰斩。
避坑指南:我曾经在回测中忽略了科创板的最小交易单位是200股,结果回测里买入了100股,实盘时券商报错。后来我加了一个合约规格校验函数,每次下单前检查一下。
4.3 交易成本模型:佣金、滑点、印花税
交易成本是回测中最容易被低估的部分。很多新手只算佣金,结果回测收益高得离谱,实盘却赚不到钱。其实,交易成本包括三部分:
4.3.1 佣金
佣金是券商收的,一般按成交金额的万分之几计算。A股目前主流是万2.5,但可以谈到万1.5甚至更低。注意,佣金有最低收费,通常是5元。也就是说,你交易1万元,佣金是2.5元,但实际收5元。
代码示例:
def calc_commission(trade_value, rate=0.00025, min_fee=5.0):
fee = trade_value * rate
return max(fee, min_fee)
4.3.2 滑点
滑点是你实际成交价和预期价格之间的差异。比如你想在10元买入,但实际成交价是10.05元,这0.05元就是滑点。
滑点怎么算?我个人习惯用固定滑点模型,比如每笔交易加0.1%的滑点。或者用百分比滑点,比如0.2%。
注意:滑点不是固定的。市场流动性差的时候,滑点会很大。我建议在回测中至少设置0.1%的滑点,高频策略可能需要0.3%以上。
4.3.3 印花税
印花税是政府收的,只在卖出时收取。A股目前是成交金额的0.05%(万分之五)。注意,印花税是单向收费,买入不收。
完整的交易成本函数:
def calc_trading_cost(price, shares, is_buy=True):
trade_value = price * shares
commission = max(trade_value * 0.00025, 5.0)
stamp_tax = 0 if is_buy else trade_value * 0.0005
slippage = trade_value * 0.001 # 0.1%滑点
return commission + stamp_tax + slippage
4.4 知识体系结构图
下面这张图,是我自己画的一个结构图,帮你理清本章的知识脉络:
4.5 实战中的避坑指南
最后,分享几个我踩过的坑:
- 佣金最低5元:很多回测框架默认没有这个限制。如果你做小资金回测,这个影响很大。比如你每次交易1000元,佣金应该是0.25元,但实际收5元,成本差了20倍。
- 滑点设置:我建议至少用0.1%的滑点。如果你做高频交易,滑点可能要0.3%以上。你可以用历史盘口数据来估算滑点,但初期用固定值就够了。
- 印花税单向:买入不收,卖出才收。这个千万别搞反了。
- 股票池更新:指数成分股会定期调整。如果你用沪深300做回测,记得每半年更新一次成分股列表。
我的习惯:我会在回测引擎中写一个 AssetPool 类,专门管理股票池和合约规格。每次回测前,先跑一个校验函数,检查所有股票是否在交易状态、是否有足够的流动性。这样能避免很多低级错误。
好了,交易标的和资产池这部分就聊到这里。记住,回测的准确性,很大程度上取决于你对交易成本的建模是否真实。别偷懒,把佣金、滑点、印花税都算进去,你的回测结果才值得信赖。
公众号:蓝海资料掘金营,微信deep3321