4. 价差计算基础:基础价差公式、中间价与最优价差、加权平均价差、价差序列的构建
各位同学,咱们今天聊聊价差计算的基础。说实话,很多做量化交易的朋友一上来就搞复杂的统计模型,结果连最基础的价差公式都没搞明白。我个人觉得,地基不牢,房子再漂亮也经不起市场波动。
4.1 基础价差公式:最朴素的套利逻辑
价差,说白了就是两个交易所之间同一品种的价格差。公式很简单:
价差 = 交易所A价格 - 交易所B价格
嗯,就这么简单。但这里有个坑——方向一致性。我在项目中遇到过好几次,新手把买一价和卖一价混着用,算出来的价差完全没意义。
核心原则:计算价差时,两边必须用同一类型的价格。要么都用买一价,要么都用卖一价,要么都用最新成交价。
举个例子:
# 基础价差计算
exchange_a_bid = 100.50 # 交易所A的买一价
exchange_b_bid = 100.30 # 交易所B的买一价
spread = exchange_a_bid - exchange_b_bid
print(f"买一价差: {spread:.2f}") # 输出: 0.20
正价差意味着A比B贵,负价差则相反。我曾经见过有人把正负号搞反,结果亏了不少钱。记住:价差的方向决定了你的套利方向。
4.2 中间价与最优价差:更真实的价差度量
只用买一价或卖一价,其实不够准确。为什么?因为市场深度会影响你的成交价格。你想想看,如果你用买一价算价差,但实际成交时可能要用到卖一价,这不就出问题了?
所以我个人习惯用中间价:
中间价 = (买一价 + 卖一价) / 2
中间价的好处是,它反映了市场的"公允价格"。我在做高频套利时,中间价是我最常用的基准。
那最优价差又是什么?说白了,就是你能实际吃到的最小价差:
最优价差 = 交易所A的卖一价 - 交易所B的买一价
这个值如果是正的,说明你可以从A买、B卖,赚取差价。如果是负的,那就反过来。
实战技巧:我建议你同时监控中间价差和最优价差。中间价差告诉你趋势,最优价差告诉你机会。
4.3 加权平均价差:考虑深度的价差
基础价差和最优价差有个共同的问题——它们只考虑了第一档价格。但实际交易中,你可能需要吃掉好几档才能完成套利。
这时候就需要加权平均价差了。它考虑了不同价格档位的深度:
加权平均价 = Σ(价格_i × 数量_i) / Σ(数量_i)
举个例子:
| 档位 | 价格 | 数量 | 加权贡献 |
|---|---|---|---|
| 1 | 100.50 | 100 | 10050 |
| 2 | 100.55 | 200 | 20110 |
| 3 | 100.60 | 150 | 15090 |
| 合计 | 450 | 45250 |
加权平均价 = 45250 / 450 = 100.56
代码实现也很直接:
def weighted_avg_price(prices, volumes):
"""计算加权平均价格"""
total_volume = sum(volumes)
if total_volume == 0:
return 0
weighted_sum = sum(p * v for p, v in zip(prices, volumes))
return weighted_sum / total_volume
# 使用示例
prices = [100.50, 100.55, 100.60]
volumes = [100, 200, 150]
avg_price = weighted_avg_price(prices, volumes)
print(f"加权平均价: {avg_price:.2f}")
注意:加权平均价差的计算量比基础价差大很多。如果你做的是高频交易,建议只在信号确认阶段使用加权平均,别在每一笔tick上都算。
4.4 价差序列的构建:从点到线
单个价差点位没什么用,我们需要把它变成时间序列。价差序列的构建,说白了就是把每个时间点的价差记录下来,形成一条曲线。
我常用的构建方式有两种:
- Tick级序列:每来一笔成交或报价,就记录一次价差。适合高频策略。
- 固定频率序列:每隔固定时间(比如1秒、1分钟)采样一次价差。适合中低频策略。
代码实现:
import pandas as pd
import numpy as np
def build_spread_series(exchange_a_data, exchange_b_data, freq='1S'):
"""
构建价差时间序列
:param exchange_a_data: DataFrame, 包含'timestamp'和'price'列
:param exchange_b_data: DataFrame, 包含'timestamp'和'price'列
:param freq: 采样频率,默认1秒
"""
# 合并数据
merged = pd.merge_asof(
exchange_a_data.sort_values('timestamp'),
exchange_b_data.sort_values('timestamp'),
on='timestamp',
suffixes=('_a', '_b')
)
# 计算价差
merged['spread'] = merged['price_a'] - merged['price_b']
# 重采样到固定频率
merged.set_index('timestamp', inplace=True)
spread_series = merged['spread'].resample(freq).mean()
return spread_series
嗯,这里要注意一个细节:时间对齐。两个交易所的数据到达时间可能不同,直接用时间戳匹配会出问题。我建议用pd.merge_asof来做最近时间匹配,效果比直接merge好很多。
核心要点:价差序列的质量,取决于你如何处理时间对齐和缺失值。别小看这一步,它直接影响后续所有模型的效果。
知识体系总览
下面这张图,是我自己整理的价差计算知识体系。你可以把它当作一个快速索引:
这张图把价差计算的四个核心维度串起来了。从基础价差出发,逐步加入中间价、深度加权和时间序列维度。我个人建议你按照这个顺序来学习,别跳步。
避坑指南:我曾经在构建价差序列时,直接用两个交易所的原始时间戳做对齐,结果因为网络延迟导致大量错位。后来改用交易所的"本地时间戳"加上"数据到达时间"双重校验,才解决了这个问题。
好了,价差计算的基础就这些。记住:简单公式 + 严谨处理 = 可靠信号。别小看这些基础内容,它们是你后续所有策略的基石。
公众号:蓝海资料掘金营,微信deep3321