查看全课大纲(第 49 / 59 节)
  1. 1.量化投资必备基础知识
  2. 2.趋势型策略及模型原理
  3. 3.均值回复型策略及模型原理
  4. 4.配对交易策略及模型原理
  5. 5.量化策略研发流程与基本技能
  6. 6.常用的量化平台概述及如何选择
  7. 7.如何量化一个主观策略思路
  8. 8.常用技术指标及指标计算过程
  9. 9.如何编写指标代码
  10. 10.指标的物理意义
  11. 11.技术指标的应用技巧
  12. 12.更多的交易决策
  13. 13.编写程序去量化一个趋势型技术指标
  14. 14.编写趋势型技术指标的性能评价
  15. 15.策略对交易成本和持仓周期的影响
  16. 16.股票池策略的原理及基本框架
  17. 17.基于多因子分析的股票池设计与实现
  18. 18.股票池的性能评估
  19. 19.使用定制化财务因子构建股票池
  20. 20.趋势型策略原理及股票池机制的设计
  21. 21.趋势型择时信号的设计方法与编程实现
  22. 22.趋势型策略的回测与性能评估
  23. 23.优化趋势型策略的思路及方法
  24. 24.量化体系中的风险控制思想
  25. 25.风险的度量-波动率
  26. 26.常用的风险控制方法
  27. 27.实现止盈止损模块以提高策略性能
  28. 28.策略性能的评估与优化
  29. 29.探讨波动率与风险的关系
  30. 30.量化策略中的经典资金管理模型
  31. 31.用python编程实现资金管理模块
  32. 32.构建一个完善的量化交易策略
  33. 33.趋势型量化策略必备的期货知识
  34. 34.期货量化工具介绍
  35. 35.商品期货趋势型策略原理
  36. 36.用TB编写商品期货趋势型策略(上)
  37. 37.用TB编写商品期货趋势型策略(下)
  38. 38.分析优化商品期货趋势型策略的方法思路
  39. 39.期货交易策略的注意事项
  40. 40.均值回复型策略的原理
  41. 41.A股市场有没有稳定的均值回复效应?
  42. 42.编写一个均值回复型股票量化策略
  43. 43.编写多空组合策略进行策略改进
  44. 44.在策略中实现头寸管理进行策略优化
  45. 45.套利策略原理及常见套利类型
  46. 46.用MC开发一个跨品种套利交易策略(上)
  47. 47.用MC开发一个跨品种套利交易策略(下)
  48. 48.统计套利之股票配对交易策略
  49. 49.实盘中的细节问题:加减仓
  50. 50.关于高频交易
  51. 51.如何评价实盘量化策略的性能
  52. 52.量化系统的工作过程及研发流程
  53. 53.运气or实力
  54. 54.量化实盘交易需要满足什么条件
  55. 55.未来函数的坑
  56. 56.实盘数据接口异常的自动报警
  57. 57.交易系统的压力测试
  58. 58.自动运行的交易策略,什么时候需要人工干预
  59. 59.预案准备和实盘心理建设

实盘中的细节问题:加减仓

约 7 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。

在量化交易的物理实盘中,加减仓绝不是简单修改下单股数,而是涉及流动性冲击、滑点摩擦、持仓均价变动以及风险敞口再平衡的复杂工程。本节深入剖析金字塔加减仓、ATR 动态波幅仓位调节以及分批冰山报单算法的实战细节。

💡 核心导读

  • 实盘加减仓三大核心工程原则:
    • 顺势浮盈加仓(Pyramid Adding):仅在已有仓位产生足够安全垫(如浮盈 > 1.5 ATR)时才允许追加头寸;
    • 逆势减仓与动态止损线抬升:每次减仓必须同步上移剩余仓位的止损线,确保锁定已实现利润;
    • 算法拆单防冲击(Iceberg / TWAP):对于大额加减仓指令,通过时间或成交量加权拆解,避免瞬间击穿盘口深度;
    • 交易制度前提(T+1 / T+0):日内多次加减仓与算法拆单范式主要适用于期货、可转债等 T+0 品种;A 股现货受 T+1 约束,当日买入仓位当日不可卖出,「当日先加后减」无法执行,股票做日内交易只能动用昨日底仓。
┌─────────────────────────────────────────────────────────────┐
│                    实盘加减仓决策与执行拓扑图               │
└──────────────────────────────┬──────────────────────────────┘
                               │
 ┌─────────────────────────────┼─────────────────────────────┐
 ▼                             ▼                             ▼
┌─────────────────────────┐   ┌─────────────────────────┐   ┌─────────────────────────┐
│ 浮盈加仓条件触发        │   │ 算法拆单执行 (Iceberg)  │   │ 止损线动态同步抬升      │
├─────────────────────────┤   ├─────────────────────────┤   ├─────────────────────────┤
│ • 浮盈 > 1.5 * ATR      │──►│ • 单笔不超过盘口深度 10%│──►│•StopLine = NewEntry-2ATR│
│ • 总持仓未达上限 (4Unit)│   │• 随机间隔 1~3 秒分批报单│   │ • 保护全部已累积利润    │
└─────────────────────────┘   └─────────────────────────┘   └─────────────────────────┘

一、动态加减仓与持仓均价重构数学模型

设初始持仓量为 Q1Q_1,成本为 P1P_1;第 kk 次加仓量为 QkQ_k,加仓价格为 PkP_k。加仓后的综合持仓均价 P‾k\overline{P}_k 与动态止损线为:

P‾k=∑i=1kQiPi∑i=1kQi,StopLinek=Pk−2.0×ATRk\overline{P}_k = \frac{\sum_{i=1}^k Q_i P_i}{\sum_{i=1}^k Q_i}, \quad \text{StopLine}_k = P_k - 2.0 \times ATR_k

import pandas as pd
import numpy as np

class RealPositionManager:
    """
    实盘多批次动态加减仓与均价管理器(合成教学样例,实盘需考虑滑点与流动性风险)
    """
    def __init__(self, max_units: int = 4):
        self.max_units = max_units
        self.units = []
        
    def add_position(self, price: float, volume: int, atr: float) -> dict:
        if len(self.units) >= self.max_units:
            return {'status': 'REJECTED_MAX_CAPACITY', 'avg_price': self.get_avg_price()}
            
        self.units.append({'price': price, 'volume': volume, 'atr': atr})
        stop_line = price - 2.0 * atr
        return {'status': 'ADDED', 'avg_price': self.get_avg_price(), 'total_volume': self.get_total_volume(), 'stop_line': stop_line}
        
    def get_total_volume(self) -> int:
        return sum(u['volume'] for u in self.units)
        
    def get_avg_price(self) -> float:
        tot_vol = self.get_total_volume()
        if tot_vol == 0:
            return 0.0
        return sum(u['price'] * u['volume'] for u in self.units) / tot_vol

# 合成场景:模拟三次加仓,ATR固定为5.0(历史波动率不代表未来)
pm = RealPositionManager(max_units=4)
atr = 5.0

r1 = pm.add_position(price=100.0, volume=100, atr=atr)
r2 = pm.add_position(price=110.0, volume=100, atr=atr)
r3 = pm.add_position(price=120.0, volume=100, atr=atr)

print("===== 实盘头寸管理器:多批次加仓与动态止损 =====")
print(f"加仓批次: {len(pm.units)} | 总持仓: {pm.get_total_volume()} 股")
print(f"综合持仓均价: {pm.get_avg_price():.2f} 元")
print(f"最新止损线: {r3['stop_line']:.2f} 元")
print(f"批次1状态: {r1['status']} | 批次3状态: {r3['status']}")
===== 实盘头寸管理器:多批次加仓与动态止损 =====
加仓批次: 3 | 总持仓: 300 股
综合持仓均价: 110.00 元
最新止损线: 110.00 元
批次1状态: ADDED | 批次3状态: ADDED

二、大单冰山算法拆解与微观报单

大额加减仓指令必须拆分为小额子订单,避免对订单簿造成瞬时冲击。

import numpy as np

def slice_iceberg_order(total_shares: int, max_slice: int = 200) -> list:
    """
    冰山算法子单切片(合成教学样例,实盘需考虑订单簿冲击与市场微观结构)
    """
    slices = []
    rem = total_shares
    while rem > 0:
        sz = min(rem, max_slice)
        slices.append(sz)
        rem -= sz
    return slices

# 合成场景:测试不同总股数的冰山拆单
test_cases = [350, 800, 123]
print("===== 冰山订单拆单算法测试 =====")
for total in test_cases:
    slices = slice_iceberg_order(total, max_slice=200)
    print(f"总股数 {total:4d} -> 拆为 {len(slices):2d} 笔: {slices}")
===== 冰山订单拆单算法测试 =====
总股数  350 -> 拆为  2 笔: [200, 150]
总股数  800 -> 拆为  4 笔: [200, 200, 200, 200]
总股数  123 -> 拆为  1 笔: [123]

📝 动手练一练

编写 Python 测试脚本,模拟实盘连续 3 次浮盈加仓并计算均价与止损线演变:

import pandas as pd
import numpy as np

class RealPositionManager:
    """
    实盘多批次动态加减仓与均价管理器(合成教学样例,实盘需考虑滑点与流动性风险)
    """
    def __init__(self, max_units: int = 4):
        self.max_units = max_units
        self.units = []
        
    def add_position(self, price: float, volume: int, atr: float) -> dict:
        if len(self.units) >= self.max_units:
            return {'status': 'REJECTED_MAX_CAPACITY', 'avg_price': self.get_avg_price()}
            
        self.units.append({'price': price, 'volume': volume, 'atr': atr})
        stop_line = price - 2.0 * atr
        return {'status': 'ADDED', 'avg_price': self.get_avg_price(), 'total_volume': self.get_total_volume(), 'stop_line': stop_line}
        
    def get_total_volume(self) -> int:
        return sum(u['volume'] for u in self.units)
        
    def get_avg_price(self) -> float:
        tot_vol = self.get_total_volume()
        if tot_vol == 0:
            return 0.0
        return sum(u['price'] * u['volume'] for u in self.units) / tot_vol

def slice_iceberg_order(total_shares: int, max_slice: int = 200) -> list:
    """
    冰山算法子单切片(合成教学样例,实盘需考虑订单簿冲击与市场微观结构)
    """
    slices = []
    rem = total_shares
    while rem > 0:
        sz = min(rem, max_slice)
        slices.append(sz)
        rem -= sz
    return slices

# 合成场景:模拟三次加仓并测试冰山平仓拆单
pm = RealPositionManager(max_units=4)
atr = 5.0

r1 = pm.add_position(price=100.0, volume=100, atr=atr)
r2 = pm.add_position(price=110.0, volume=100, atr=atr)
r3 = pm.add_position(price=120.0, volume=100, atr=atr)
slices = slice_iceberg_order(pm.get_total_volume(), max_slice=100)

print("================ 实盘加减仓细节与头寸管理测试 ================")
print(f"累计加仓批数: {len(pm.units)} 批 | 总持仓股数: {pm.get_total_volume()} 股")
print(f"综合持仓均价: {pm.get_avg_price():.2f} 元 (初始成本 100.00 元)")
print(f"最新统一止损: {r3['stop_line']:.2f} 元 (已锁定高于初始成本浮盈)")
print(f"冰山平仓拆单: {len(slices)} 笔子订单,明细: {slices}")
assert pm.get_total_volume() == 300, "持仓股数计算错误!"
assert r3['stop_line'] > 100.0, "动态止损未抬升至成本线之上!"
print("✅ 实盘加减仓机制与均价动态管理验证 PASS")
print("============================================================")

运行结果输出:

================ 实盘加减仓细节与头寸管理测试 ================
累计加仓批数: 3 批 | 总持仓股数: 300 股
综合持仓均价: 110.00 元 (初始成本 100.00 元)
最新统一止损: 110.00 元 (已锁定高于初始成本浮盈)
冰山平仓拆单: 3 笔子订单,明细: [100, 100, 100]
✅ 实盘加减仓机制与均价动态管理验证 PASS
============================================================
👉 点击查看解析

本练习强调实盘中加减仓不能只按理论信号机械执行,还需考虑流动性、滑点、最小交易单位及资金可用性等细节;只有把这些执行层面的约束纳入逻辑,才能让实盘结果更接近回测预期。

本章小结

  1. 坚持顺势浮盈加仓:只在已有仓位产生足够浮盈安全垫时加仓,严禁逆势摊平亏损。
  2. 止损线同步抬升锁定收益:随着加仓批次增加,整体止损线必须同步上移至成本线甚至浮盈区域。
  3. 运用算法拆单减少冲击:大额调仓指令通过冰山或 TWAP 拆单,保护盘口深度与成交均价。

📋 行动清单 (Action Checklist)

  • 运行加减仓测试脚本,核查不同批次加仓对持仓均价的敏感度;
  • 编写阶梯式分批止盈减仓与挂单撤单逻辑;
  • 预习下一节,深入探究高频交易的物理机制与生态位格局。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第10章课件:实盘中的细节问题讨论
    PDF · 1.7MB
    下载
  • 第10章配套代码包(Python 重构版 · 已实测)
    ZIP · 14KB
    下载