4、实时行情计算:最新价、成交量、成交额、涨跌幅、换手率、盘口深度
各位做市的朋友,咱们今天聊点硬核的。
实时行情计算,说白了就是给市场拍一张「即时快照」。你看到的那些跳动的数字,背后都有一套固定的算法。我刚开始做做市系统时,以为这些数据直接从交易所拿过来就行,后来才发现——拿过来的是原始数据,怎么算、怎么展示,才是咱们自己的功夫。
4.1 最新价与成交量
这两个指标是最基础的,但坑也不少。
最新价,就是最后一笔成交的价格。听起来简单对吧?但你要注意:
- 如果最后一笔是多笔撮合,取加权平均价?还是取最后一笔的单价?
- 我个人的习惯是:取最后一笔成交的单价,因为这样最直观,用户也最容易理解。
成交量,指的是某个时间段内成交的总手数。这里有个细节:
- 是累计量,还是增量?
- 做实时监控时,我一般展示「当日累计成交量」,同时保留「最近1分钟成交量」作为辅助指标。
核心公式:
最新价 = 最后一笔成交价格
成交量 = 当日累计成交手数
4.2 成交额与涨跌幅
成交额是成交量的「钱版」——把每笔成交的金额加起来。嗯,这里要注意单位换算,别把万元当成元。
涨跌幅,这个我踩过坑。
涨跌幅 = (当前价 - 昨收价) / 昨收价 × 100%
但问题是:如果昨收价是0呢?比如新股上市第一天。我曾经在测试环境里没处理这个边界情况,结果程序直接崩了。所以,一定要加个判断:
def calc_change_rate(current_price, prev_close):
if prev_close == 0:
return 0.0 # 或者返回 None,看业务需求
return (current_price - prev_close) / prev_close * 100
小技巧:涨跌幅保留两位小数就够了,别学某些平台保留四位,用户看着眼晕。
4.3 换手率
换手率 = 成交量 / 流通股本 × 100%
这个指标反映的是「股票活跃度」。换手率高,说明买卖频繁,流动性好。
但你要注意:流通股本可能会变化(比如解禁、增发)。我建议每隔一段时间从数据库重新拉取流通股本数据,别缓存太久。
| 换手率范围 | 市场含义 |
|---|---|
| < 1% | 冷清,流动性差 |
| 1% - 5% | 正常交易 |
| 5% - 10% | 活跃,可能有行情 |
| > 10% | 极度活跃,注意风险 |
4.4 盘口深度
盘口深度,就是买卖挂单的「厚度」。你想想看,如果买一只有100手,卖一只有1000手,那价格往上走的阻力就大。
盘口深度通常展示五档或十档行情:
- 买一到买五:价格从高到低排列
- 卖一到卖五:价格从低到高排列
我一般会额外计算一个「盘口压力比」:
def depth_pressure(buy_volumes, sell_volumes):
total_buy = sum(buy_volumes)
total_sell = sum(sell_volumes)
if total_sell == 0:
return float('inf')
return total_buy / total_sell
这个比值大于1,说明买方力量强;小于1,说明卖方占优。当然,这只是参考,别迷信。
注意:盘口数据变化极快,刷新频率建议不低于500ms一次。我曾经用1秒刷新一次,结果在行情剧烈波动时,用户看到的盘口总是「慢半拍」。
4.5 知识体系总览
下面这张图,是我自己梳理的实时行情计算逻辑。你看一眼,心里就有谱了。
4.6 实战中的坑与建议
最后,分享几个我踩过的坑:
- 数据对齐问题:不同指标的数据可能来自不同数据源,时间戳要对齐。我曾经因为毫秒级偏差,导致涨跌幅和最新价对不上。
- 缓存策略:盘口深度数据量大,别每次都全量更新。我一般用增量更新,只推送变化的部分。
- 异常处理:行情数据偶尔会断流。建议加个超时判断,超过3秒没收到数据,就显示「--」而不是保留旧数据。
一句话总结:实时行情计算,算法不难,难在稳定、准确、低延迟。多测试边界情况,多考虑异常场景,你的系统才能扛得住真实市场的考验。
公众号:蓝海资料掘金营,微信deep3321