第三章 资金流向计算模型:三种核心算法详解
做订单流分析这些年,我最大的体会就是:资金流向的计算,没有银弹。
市面上各种软件、平台,算出来的资金流向数据经常打架。为什么?因为底层算法不一样。今天我就把三种最主流的算法掰开揉碎讲清楚。你理解了这些,以后看任何资金流向指标,心里都有杆秤。
3.1 基于成交量的资金流向算法
这是最朴素、最直观的方法。说白了,就是看每一笔成交,是主动买还是主动卖。
核心逻辑:
- 主动买入(吃卖单) → 资金流入
- 主动卖出(吃买单) → 资金流出
具体怎么算?我直接上代码:
def volume_flow(tick_data):
"""
tick_data: 包含 price, volume, side 的逐笔成交数据
side: 'buy' 表示主动买, 'sell' 表示主动卖
"""
inflow = 0
outflow = 0
for tick in tick_data:
if tick['side'] == 'buy':
inflow += tick['volume']
elif tick['side'] == 'sell':
outflow += tick['volume']
net_flow = inflow - outflow
return net_flow
嗯,这里要注意:很多交易所的逐笔数据里,side字段可能叫法不同。有的叫AggressorSide,有的叫TakerSide。本质都一样——谁是主动吃单的一方。
实战要点:
- 这个算法对数据精度要求最高,必须用逐笔成交数据
- 如果只有分钟级数据,算出来误差会很大
- 适合高频交易场景,比如期货、数字货币
我在项目中遇到过一个问题:某交易所的逐笔数据里,side字段偶尔会缺失。后来我加了个校验逻辑,如果side为空,就根据价格变动方向推断——价格向上突破,大概率是主动买。
3.2 基于大单拆分的资金流向算法
为什么需要这个算法?因为市场上有很多大资金,他们会把大单拆成小单,避免被盯上。
你想想看,如果一笔1000手的单子直接砸进去,盘口瞬间就变了。但拆成100笔10手的单子,看起来就像散户在交易。
核心思路:识别异常的大单,然后把这些大单的资金流向单独计算。
def large_order_flow(tick_data, threshold=100):
"""
threshold: 大单阈值,单位是手
超过这个数量的单子,视为大单
"""
large_inflow = 0
large_outflow = 0
for tick in tick_data:
if tick['volume'] >= threshold:
if tick['side'] == 'buy':
large_inflow += tick['volume'] * tick['price']
else:
large_outflow += tick['volume'] * tick['price']
return large_inflow, large_outflow
我的经验:
阈值怎么设?我一般用动态阈值。比如取过去20个交易日的平均单笔成交量的3倍。这样能适应不同品种、不同活跃度的市场。
我曾经踩过一个坑:把阈值设死了,结果在某个流动性极差的品种上,把正常交易都识别成了大单。后来改成动态阈值,问题就解决了。
大单拆分的识别方法:
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 时间窗口法 | 短时间内连续同向的小单,合并视为大单 | 股票市场,尤其是A股 |
| 价格冲击法 | 单笔成交导致价格跳变,视为大单 | 期货、外汇等连续竞价市场 |
| 成交量异常法 | 成交量超过均值N倍标准差 | 所有市场,通用性强 |
3.3 基于价格推动的资金流向算法
这个算法有点意思。它不关心单子是谁吃的,只看价格是怎么动的。
核心假设:资金流入会推高价格,资金流出会压低价格。
具体算法:
def price_flow(ohlc_data):
"""
ohlc_data: 包含 open, high, low, close, volume 的K线数据
"""
flows = []
for i in range(1, len(ohlc_data)):
prev_close = ohlc_data[i-1]['close']
curr_close = ohlc_data[i]['close']
curr_volume = ohlc_data[i]['volume']
if curr_close > prev_close:
# 价格上涨,视为资金流入
flow = curr_volume * (curr_close - prev_close) / prev_close
elif curr_close < prev_close:
# 价格下跌,视为资金流出
flow = -curr_volume * (prev_close - curr_close) / prev_close
else:
flow = 0
flows.append(flow)
return flows
注意:
这个算法有个致命缺陷:它假设价格变动完全由资金驱动。但现实中,价格可能因为消息面、情绪面等因素波动。所以这个算法更适合做辅助判断,不能单独使用。
我个人习惯把三种算法结合起来用。比如:
- 用成交量算法看日内资金流向
- 用大单算法识别主力动向
- 用价格推动算法做趋势确认
三种算法同时发出信号,胜率会高很多。
3.4 三种算法的对比总结
| 算法 | 数据要求 | 计算复杂度 | 准确度 | 适用场景 |
|---|---|---|---|---|
| 成交量算法 | 高(逐笔数据) | 低 | 高 | 高频交易、日内交易 |
| 大单拆分算法 | 中(逐笔或分钟) | 中 | 中 | 主力追踪、大资金监控 |
| 价格推动算法 | 低(K线即可) | 低 | 低 | 趋势判断、辅助指标 |
最后说一句:算法只是工具,关键还是你对市场的理解。我见过有人用最简单的成交量算法,照样赚钱。也见过有人把三种算法都跑通了,还是亏。为什么?因为算法背后的逻辑,比算法本身更重要。