数据选型
外汇报价中的 Bid、Ask 与点差是什么
解释外汇行情中 Bid(买价)、Ask(卖价)、中间价与点差的含义,以及在程序中如何正确使用这些字段。
更新时间:
维护方:AllTick 官方技术团队
适用对象:在应用中处理外汇报价数据的开发者
核心结论 · 30秒开发速览
Bid 是报价方愿意买入的价格,Ask 是报价方愿意卖出的价格,Ask 减 Bid 就是点差。程序展示“当前价”时通常用中间价 (Bid + Ask) / 2,或明确标注使用的是哪一侧价格;计算交易成本时则需要保留两侧报价。
01
四个关键概念
| 字段 | 含义 | 程序中的用途 |
|---|---|---|
Bid | 报价方的买入价 | 计算卖出时可得到的价格 |
Ask | 报价方的卖出价 | 计算买入时的成交对价 |
| 中间价 | (Bid + Ask) / 2 | 展示、图表和大多数指标计算 |
| 点差 | Ask − Bid | 衡量流动性与交易成本 |
02
“点”(pip)的换算
多数货币对报价到小数点后 4 位,1 个点通常为 0.0001;日元相关货币对(如 USD/JPY)报价到小数点后 2 位,1 个点通常为 0.01。部分数据源会多提供一位小数(pipette)。计算点差时请按货币对的报价精度换算,而不是统一乘以 10000。
按货币对精度计算点差(示意)python
def pip_size(symbol: str) -> float: return 0.01 if symbol.upper().endswith("JPY") else 0.0001def spread_in_pips(symbol: str, bid: float, ask: float) -> float: return round((ask - bid) / pip_size(symbol), 1)print(spread_in_pips("EURUSD", 1.08512, 1.08525)) # 1.3print(spread_in_pips("USDJPY", 149.812, 149.826)) # 1.403
开发中的常见错误
- 只保存一侧价格,后续无法还原点差或计算成本。
- 把盘口的买一/卖一与成交价混为一谈。
- 用浮点数直接比较价格是否相等,应使用精度容差或 Decimal。
- 不同数据源的同一货币对代码写法不同(EURUSD、EUR/USD),需要统一映射。
04
在 AllTick 中获取外汇报价
AllTick 的外汇、贵金属与大宗商品数据使用 quote-b-api(REST)与 quote-b-ws-api(WebSocket)地址,货币对代码形如 EURUSD、USDJPY。盘口接口返回买卖两侧报价,可直接用于计算点差。
规范来源与验证记录 · 2026-10-13
已根据下方一手资料核对相关端点、字段与交易所规则。
Python 示例已在 Python 3.14.0 上通过 ast.parse 语法解析;此检查不验证依赖安装、运行兼容性或网络响应。
本轮未使用真实 Token 执行 AllTick 请求,也未完成生产端到端测试。复现时请记录套餐、依赖版本、交易时段、ret/trace 与实际结果。
上线前建议复现
- 使用同一更新的 bid/ask 并保留十进制精度;缺侧、非正价格或 ask 小于 bid 时拒绝计算。
- 核对品种最小变动单位及点差单位(价格或 pip),对比正常、换日与报价过期场景。