一、 策略核心思想
在A股市场中,“小市值”一直是一个长期有效的alpha因子。本策略的核心逻辑非常简单直接:买入全市场市值最小的一批股票,并定期进行优胜劣汰的轮动。
通过剔除低价股(避开面值退市风险)和停牌股,我们筛选出流动性尚可的最小市值公司,利用其波动大、弹性高的特性获取超额收益。
二、 策略逻辑详解
本策略基于 panda_backtest 框架开发,主要包含以下几个关键步骤:
1. 股票池初选
- 全市场扫描: 每日获取当前在售的所有A股名单。
- 因式过滤: 剔除股价低于 1 元的“准仙股”,防范退市风险。
- 市值排序: 按照
market_cap(总市值)从从小到大进行精确排序。
2. 定期轮动机制
- 调仓频率: 设置为每 5个交易日(一周)调仓一次。
- 目的: 既能及时捕捉市值变化带来的机会,又能有效覆盖交易成本,避免频繁调仓损耗利润。
3. 仓位管理
- 等权配置: 将账户总资产平均分配到前 20 只目标个股中。
- 自动换仓: 使用
target_stock_group_order接口,一键完成“卖出旧持仓、买入新目标”的操作,确保持仓始终符合策略要求。
三、 代码亮点解析
在这份代码实现中,有几个细节非常值得量化初学者学习:
- 防御性编程: 代码中加入了大量的
try...except和None值检查。在真实回测和实盘中,数据缺失是常态,这种写法能保证程序不会因为某一天的数据异常而崩溃。 - 交易细节处理: 在计算买入股数时,使用了
int(cash_per_stock // price // 100 * 100)。这确保了买入数量是 100股(一手)的整数倍,符合A股交易规则。 - 状态监控: 策略包含了
before_trading和after_trading模块,每日开盘前打印资产概况,收盘后统计盈亏,让投资者对账户动态了如指掌。
四、 核心代码片段展示
# 核心选股逻辑:获取小市值股票池
def _get_small_cap_universe(context, trade_date):
# 1. 获取全市场股票及市值数据
# 2. 剔除低价股 (price < 1.0)
# 3. 按市值从小到大排序
df = df.sort_values("market_cap", ascending=True)
# 4. 取前 N 只作为目标
return df.head(context.max_stocks)["symbol"].tolist()