找回密码
 立即注册
首页 业界区 安全 量化交易如何查询CFD指数实时行情

量化交易如何查询CFD指数实时行情

旌磅箱 2025-7-18 13:36:29
CFD即所谓的差价合约,是投资者在不拥有实际资产的情况下,交易金融市场的一种方式。最近笔者研究这一块比较多,但查遍整个中文互联网却很少找到关于CFD实时行情的查询教程。因此有了这篇文章。以下我将通过一个简单的Python代码示例,逐步教你如何查询CFD指数的实时行情。
行情接口信息

首先,确保你有一个有效的API接口,我们这里用Infoway API作为演示,该接口能够返回所需的CFD指数实时数据。请求地址如下:
  1. https://data.infoway.io/common/batch_trade/HK50%2CCN50%2CEUSTX50%2CJPN225%2CUS30%2CUS500
复制代码
这个接口支持批量查询,所以我们一次性查多个市场的。这个URL包含了多个CFD指数的数据:HK50, CN50, EUSTX50, JPN225, US30, 和 US500。这些指数代表了不同的市场,涵盖了香港、中国、欧洲、日本和美国等多个区域。
请求示例

现在,我们已经准备好发送HTTP请求来获取实时行情数据。以下是完整的Python代码示例:
  1. import requests
  2. url = "https://data.infoway.io/common/batch_trade/HK50%2CCN50%2CEUSTX50%2CJPN225%2CUS30%2CUS500"
  3. # 申请API KEY: www.infoway.io
  4. headers = {
  5.     "accept": "application/json",  # 告诉服务器返回的数据格式为JSON
  6.     "apiKey": "YOUR_API_KEY"  # 你的API Key
  7. }
  8. # 发送GET请求
  9. response = requests.get(url, headers=headers)
  10. # 打印响应内容
  11. print(response.text)
复制代码
解析API响应

当你发送请求后,API会返回一个包含行情数据的响应。以下是一个示例响应:
  1. {
  2.   "ret": 200,
  3.   "msg": "success",
  4.   "traceId": "9708dde2-67af-4be6-ad08-c2bc51a44aa3",
  5.   "data": [
  6.     {
  7.       "s": "EUSTX50",
  8.       "t": 1752762978999,
  9.       "p": "5362.84",
  10.       "v": "1.0",
  11.       "vw": "5362.840",
  12.       "td": 0
  13.     },
  14.     {
  15.       "s": "US500",
  16.       "t": 1752762980117,
  17.       "p": "6277.8",
  18.       "v": "1.0",
  19.       "vw": "6277.80",
  20.       "td": 0
  21.     },
  22.     {
  23.       "s": "CN50",
  24.       "t": 1752762978999,
  25.       "p": "13730.68",
  26.       "v": "1.0",
  27.       "vw": "13730.680",
  28.       "td": 0
  29.     },
  30.     {
  31.       "s": "US30",
  32.       "t": 1752762978661,
  33.       "p": "44303.5",
  34.       "v": "2.0",
  35.       "vw": "88607.00",
  36.       "td": 0
  37.     },
  38.     {
  39.       "s": "HK50",
  40.       "t": 1752762980117,
  41.       "p": "24530.0",
  42.       "v": "1.0",
  43.       "vw": "24530.00",
  44.       "td": 0
  45.     },
  46.     {
  47.       "s": "JPN225",
  48.       "t": 1752762976348,
  49.       "p": "39894.0",
  50.       "v": "1.0",
  51.       "vw": "39894.00",
  52.       "td": 0
  53.     }
  54.   ]
  55. }
复制代码
从响应中,我们可以提取出不同CFD指数的实时数据。每个指数都包含以下信息:

  • s: 指数代码(如EUSTX50表示欧洲指数)
  • t: 时间戳
  • p: 当前价格
  • v: 成交量
  • vw: 加权平均价格
  • td: 代表交易方向,0为默认值,1为Buy,2为SELL
打印和处理数据

如果你希望进一步处理或格式化数据,可以使用以下代码来提取和打印每个CFD指数的价格信息:
  1. # 获取返回的JSON数据
  2. data = response.json()['data']
  3. # 遍历并打印每个CFD指数的代码和当前价格
  4. for index in data:
  5.     print(f"指数: {index['s']}, 当前价格: {index['p']}")
复制代码
运行此代码,你将会看到类似如下的输出:
  1. 指数: EUSTX50, 当前价格: 5362.84
  2. 指数: US500, 当前价格: 6277.8
  3. 指数: CN50, 当前价格: 13730.68
  4. 指数: US30, 当前价格: 44303.5
  5. 指数: HK50, 当前价格: 24530.0
  6. 指数: JPN225, 当前价格: 39894.0
复制代码
WebSocket订阅CFD指数

如果你的交易策略对数据的延迟有更高的要求,可以改用WebSocket订阅的方式来获取数据。我们只需要与服务器建立好连接,就能源源不断地从服务器获取数据推送,代码如下:
  1. import asyncio
  2. import json
  3. import websockets
  4. #WebSocket订阅连接
  5. WS_URL = "wss://data.infoway.io/ws?business=common&apikey=YOUR_API_KEY"
  6. #申请API KEY: www.infoway.io
  7. async def connect_and_receive():
  8.     async with websockets.connect(WS_URL) as websocket:
  9.         # 发送初始消息,订阅多个CFD指数
  10.         init_message = {
  11.             "code": 10000,
  12.             "trace": "01213e9d-90a0-426e-a380-ebed633cba7a",
  13.             "data": {"codes": ["HK50", "CN50", "EUSTX50", "JPN225", "US30", "US500"]}
  14.         }
  15.         await websocket.send(json.dumps(init_message))
  16.         # 设置ping任务
  17.         async def send_ping():
  18.             while True:
  19.                 await asyncio.sleep(30)
  20.                 ping_message = {
  21.                     "code": 10010,
  22.                     "trace": "01213e9d-90a0-426e-a380-ebed633cba7a"
  23.                 }
  24.                 await websocket.send(json.dumps(ping_message))
  25.         # 启动ping任务协程
  26.         ping_task = asyncio.create_task(send_ping())
  27.         
  28.         try:
  29.             # 持续接收消息
  30.             while True:
  31.                 message = await websocket.recv()
  32.                 print(f"Message received: {message}")
  33.         except websockets.exceptions.ConnectionClosedOK:
  34.             print("Connection closed normally")
  35.         finally:
  36.             # 取消ping任务
  37.             ping_task.cancel()
  38. # 运行主函数
  39. asyncio.run(connect_and_receive())
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册