3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,仓位管理是决定策略风险和收益的核心要素。QMT(Quantitative Mining Terminal)平台提供了多种便捷的交易函数。本文将重点对比 order_percent(指定比例交易) 与 order_lots(指定手数交易) 的资金分配差异,并展示如何利用它们构建一个等比例仓位分配策略。
order_percent(stockcode, percent[, style, price], ContextInfo[, accId])percent 为小数(如 0.2 代表 20%)。order_lots(stockcode, lots[, style, price], ContextInfo[, accId])| 对比维度 | order_percent | order_lots |
|---|---|---|
| 资金计算 | 自动(基于总资产比例) | 手动(需自行编写计算公式) |
| 仓位调整 | 适合动态调仓、比例配置 | 适合固定数量交易、网格交易 |
| 代码复杂度 | 极简,一行代码搞定比例 | 较复杂,需结合最新价与资产计算 |
| A股兼容性 | 自动向下取整至手 | 需手动确保传入的 lots 为整数 |
假设我们的策略目标是:将账户资金均分为5等份(每只股票占总资产的20%),对股票池中的5只股票进行等比例买入配置。
order_percent 实现(推荐,代码最简)由于 order_percent 自动以总资产为基准,我们只需对股票池中的每只股票分配 0.2 (20%) 的比例即可。
order_lots 实现(手动计算)需要先获取当前总资产 ContextInfo.capital(回测模式)或通过 get_trade_detail_data 获取可用资金,再获取目标股票的最新价格,计算出可买手数。
以下源码展示了如何在一个策略中,分别使用这两种方式实现等比例建仓:
#encoding:gbk
import pandas as pd
def init(ContextInfo):
# 设定股票池(5只目标股票)
ContextInfo.stock_pool = ['600000.SH', '000001.SZ', '600036.SH', '000002.SZ', '600016.SH']
ContextInfo.set_universe(ContextInfo.stock_pool)
# 设定等比例权重:5只股票,每只20%
ContextInfo.target_percent = 0.2
# 记录是否已建仓
ContextInfo.is_traded = False
def handlebar(ContextInfo):
if ContextInfo.is_traded:
return
# 仅在最后一根Bar(或盘中实时)触发建仓
if ContextInfo.is_last_bar():
# ==================== 方式一:使用 order_percent 极简建仓 ====================
print("--- 开始使用 order_percent 进行等比例建仓 ---")
for stock in ContextInfo.stock_pool:
# 目标买入每只股票占总资产的 20%
order_percent(stock, ContextInfo.target_percent, 'LATEST', ContextInfo)
print(f"已发送 {stock} 比例买入委托: {ContextInfo.target_percent * 100}%")
# ============================================================================
"""
# ==================== 方式二:使用 order_lots 手动计算建仓 ====================
print("--- 开始使用 order_lots 进行等比例建仓 ---")
# 1. 获取当前账户总资产 (回测模式下可用 ContextInfo.capital)
total_asset = ContextInfo.capital
per_stock_fund = total_asset * ContextInfo.target_percent # 每只股票分配的金额
for stock in ContextInfo.stock_pool:
# 2. 获取最新分笔数据中的最新价
full_tick = ContextInfo.get_full_tick([stock])
if stock in full_tick:
latest_price = full_tick[stock]['lastPrice']
if latest_price > 0:
# 3. 计算可买股数并向下取整到手 (1手=100股)
target_shares = per_stock_fund / latest_price
target_lots = int(target_shares / 100)
if target_lots > 0:
order_lots(stock, target_lots, 'LATEST', ContextInfo)
print(f"{stock} 最新价: {latest_price}, 分配资金: {per_stock_fund}元, 委托手数: {target_lots}手")
# ============================================================================
"""
ContextInfo.is_traded = True
order_percent:在多因子轮动或指数成分股等比例重平衡策略中,使用 order_percent 可以极大减少因价格波动和资产变动带来的繁琐计算。order_percent 分配 100% 资金时,建议预留 1-2% 的资金空间(即总比例设为 98%),以防止因滑点或手续费导致可用资金不足而下单失败。