在构建量化策略进行回测或实盘交易时,资金如何分配、仓位如何管理是策略逻辑中至关重要的环节。不同的策略体系对资金管理的思路固然不同,但若我们从一个追求稳健、控制风险的通用思路出发,比如策略希望保持半仓运行,那么其资金管理流程可以遵循以下清晰的步骤。
1. 确定 T 日可用开仓资金总量
首先,我们需要明确当天可以用来买入股票的总资金额度。一个常见的计算公式是:
T日账户资金 = min(总资产 × 仓位上限比例, 可用资金)
这里的 仓位上限比例 可根据策略的风险偏好设定。若设置为 50%,则意味着策略将按照半仓思路来管理资金。这个公式在长期仓位上限和短期可用现金之间取最小值,核心目的是确保资金使用的安全性,避免在现金不足时强行开仓。
2. 确定每只股票的开仓金额
在知道了总可用资金后,下一步就是将这些资金分配到计划买入的每一只股票上。一个简单直接的方法是等金额分配:
单票目标资金 = T日账户资金 ÷ 计划买入股票数量(N)
其中的 N 可以是根据策略信号动态确定的当日选股数量,也可以是一个固定值。通过等金额分散投资,可以有效避免单一股票的剧烈波动对整体投资组合造成过大的影响。
3. 计算单只股票的委托数量
根据分配给单只股票的资金和其计划委托价格,我们可以计算出理论上可以买入的股数:
理论股数 = 单票目标资金 ÷ 委托价
委托价通常可以使用股票的最新价,也可以是策略根据特定算法(如突破价、均线价等)制定的具体价格。
4. 按最小交易单位调整实际委托数量
在 A 股市场,交易有最小单位(一手)的限制,主板、创业板通常为 100 股,科创板为 200 股。因此,计算出的理论股数必须调整为符合规则的整数。这里的安全做法是向下取整。
以下是一个用于处理此逻辑的 Python 函数示例:
def calculate_lot_size(stock_code, theoretical_shares):
"""
根据股票代码确定最小交易单位,并计算实际可委托股数
:param stock_code: 股票代码(如 ‘600000.SH’, ‘688001.SH’)
:param theoretical_shares: 理论股数(浮点数)
:return: 实际可委托股数(整数),若不足最小单位则返回0
"""
# 判断是否为科创板(代码以688开头,且在上海交易所)
if stock_code.startswith(‘688’):
min_unit = 200
else:
min_unit = 100 # 主板、创业板等
if theoretical_shares < min_unit:
return 0 # 无法买入一手
else:
# 向下取整至最小单位的整数倍
actual_shares = (theoretical_shares // min_unit) * min_unit
return int(actual_shares)
为什么必须向下取整?假设理论股数为 653.59 股,如果四舍五入或向上取整为 700 股,那么实际占用的资金将会超过分配给该股票的资金预算。这可能导致整体仓位超出计划,甚至出现可用资金不足的尴尬局面。向下取整则严格确保了每一笔委托都在预算之内,是遵守风控原则最合规、最安全的方法。在实际的量化系统开发中,这类严谨的细节处理正是专业性的体现,就如同在解决复杂的算法问题时需要考虑边界条件一样。
5. 确定实际资金占用与资金再分配
实际成交后,单只股票占用的资金为:
实际占用资金 = 实际委托股数 × 成交价
这里有一个关键情况:如果某只股票因为理论股数小于最小交易单位(如高价科创板股票)而无法买入(calculate_lot_size 函数返回 0),那么原本分配给它的资金就被“释放”出来了。这部分资金该如何处理?常见的再分配策略有:
- 等额再分配:将释放的资金平均分配给其他可买入的股票,然后重新计算这些股票的理论股数并再次检查最小单位限制。
- 优先级分配:按照策略信号的强度或预期收益率对股票进行排序,优先满足高优先级的股票,剩余资金再依次分配给后面的股票。
- 现金留存:将无法使用的资金留作现金,用于下一个交易日的交易或进行国债逆回购等现金管理操作。这本质上是一种动态的动态规划思路,即在约束条件下做出当前最优的资金决策。
6. 实例演算
让我们通过一个具体例子来串联整个流程。假设我们有一个策略,总资产 100 万元,仓位上限设为 50%,当前可用资金 60 万元。当日根据选股算法选出 4 只股票,其信息如下:
- 股票 A(主板):股价 25.50 元
- 股票 B(科创板):股价 180.00 元
- 股票 C(创业板):股价 18.20 元
- 股票 D(科创板):股价 250.00 元
第一步:计算总可用资金
账户资金 = min(100万 × 50%, 60万) = 50万元
第二步:计算初始单票资金
单票目标资金 = 50万 ÷ 4 = 12.5万元
第三步:逐只股票计算实际委托与占用资金
- 股票A(主板,min_unit=100):
- 理论股数 = 125000 ÷ 25.50 ≈ 4901.96 股
- 实际股数 = 4901.96 // 100 × 100 = 4900 股 (向下取整)
- 占用资金 = 4900 × 25.50 = 124,950 元
- 股票B(科创板,min_unit=200):
- 理论股数 = 125000 ÷ 180.00 ≈ 694.44 股
- 实际股数 = 694.44 // 200 × 200 = 600 股
- 占用资金 = 600 × 180.00 = 108,000 元
- 股票C(创业板,min_unit=100):
- 理论股数 = 125000 ÷ 18.20 ≈ 6868.13 股
- 实际股数 = 6868.13 // 100 × 100 = 6800 股
- 占用资金 = 6800 × 18.20 = 123,760 元
- 股票D(科创板,min_unit=200):
- 理论股数 = 125000 ÷ 250.00 = 500.00 股
- 实际股数 = 500 // 200 × 200 = 400 股
- 占用资金 = 400 × 250.00 = 100,000 元
第四步:统计与总结
总占用资金 = 124,950 + 108,000 + 123,760 + 100,000 = 456,710 元。
剩余现金 = 500,000 - 456,710 = 43,290 元。这部分现金可以留存,用于后续交易。
通过这个例子可以看出,即便计划半仓(50万),由于最小交易单位的限制,实际占用资金约为45.67万,并未达到满额,这本身就是风控的体现。如果其中某只科创板股票因股价过高导致理论股数不足200股,则其实际可买股数为0,那12.5万资金就需要按上述“资金再分配”策略进行处理。
资金管理是量化策略的“安全带”,它不能直接创造收益,但能决定你在市场波动中能走多远。将上述逻辑转化为严谨的代码,是每一个策略从回测走向实盘的必经之路。希望这篇梳理能为你构建自己的交易系统提供清晰的参考。如果你对量化交易的其他环节,比如信号生成或风险模型也感兴趣,欢迎在云栈社区与更多开发者交流探讨。