量化交易系统开发-实时行情自动化交易-3.4.3.3.期货市场深度数据
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。
接下来聊聊基于期货API获取市场深度数据。
市场深度数据(Order Book Data)是了解市场供需力量的重要工具,显示了不同价位上买卖挂单的数量。通过分析市场深度数据,交易者可以识别支撑位和阻力位,了解流动性情况,为交易策略提供决策依据。以下是通过 Python 编写的代码示例,利用期货常用的公开 API(如和讯网、上海期货交易所等)获取期货市场深度数据的详细开发内容。
1. 使用和讯 API 获取期货市场深度数据
和讯网提供了期货市场的深度数据接口,可以通过 HTTP 请求获取特定期货品种的买卖盘情况。以下代码展示了如何通过 Python 调用和讯的 API 获取期货的市场深度数据。
import requests
import pandas as pd
def get_hexun_futures_order_book(futures_code, depth=10):
"""
获取和讯期货的市场深度数据。
:param futures_code: 期货代码,例如 'AU0' 表示沪金连续合约
:param depth: 获取的深度档位数,例如 10 表示前 10 档
:return: 市场深度数据的 pandas DataFrame
"""
url = f"https://api.hexun.com/futures/orderbook"
params = {
"code": futures_code,
"depth": depth
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
bids = data.get("data", {}).get("bids", [])
asks = data.get("data", {}).get("asks", [])
bid_df = pd.DataFrame(bids, columns=["买价", "买量"])
ask_df = pd.DataFrame(asks, columns=["卖价", "卖量"])
order_book_df = pd.concat([bid_df, ask_df], axis=1)
return order_book_df
else:
raise Exception(f"Error fetching order book data: {response.status_code}")
# 获取沪金连续合约(AU0)的前 10 档市场深度数据
order_book_df = get_hexun_futures_order_book("AU0")
print(order_book_df)
在该示例中,通过调用和讯的 API 获取了指定期货合约的市场深度数据,包括买盘和卖盘的价格和数量信息,并将其转换为 Pandas DataFrame 格式,以便于后续的分析和处理。
2. 使用上海期货交易所 API 获取市场深度数据
上海期货交易所(SHFE)也提供了市场深度数据接口,通过 HTTP 请求可以获取不同期货合约的买卖盘情况。以下是使用 Python 调用上海期货交易所的 API 获取期货市场深度数据的代码示例。
import requests
import pandas as pd
def get_shfe_futures_order_book(futures_code, depth=10):
"""
获取上海期货交易所的市场深度数据。
:param futures_code: 期货代码,例如 'CU' 表示沪铜合约
:param depth: 获取的深度档位数,例如 10 表示前 10 档
:return: 市场深度数据的 pandas DataFrame
"""
url = f"https://www.shfe.com.cn/data/orderbook/{futures_code}.json"
params = {
"depth": depth
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
bids = data.get("bids", [])
asks = data.get("asks", [])
bid_df = pd.DataFrame(bids, columns=["买价", "买量"])
ask_df = pd.DataFrame(asks, columns=["卖价", "卖量"])
order_book_df = pd.concat([bid_df, ask_df], axis=1)
return order_book_df
else:
raise Exception(f"Error fetching order book data: {response.status_code}")
# 获取沪铜(CU)的前 10 档市场深度数据
cu_order_book = get_shfe_futures_order_book("CU")
print(cu_order_book)
在此示例中,通过调用上海期货交易所的 API 获取了指定期货合约的市场深度数据,包含买卖双方的挂单价格和数量,并转换为 Pandas DataFrame 格式,方便后续的策略分析。
3. 数据存储与管理
市场深度数据需要进行合理的存储,以便进行后续的分析和实时决策。
-
内存缓存:对于实时性要求较高的市场深度数据,可以使用 Redis 等内存数据库来缓存,以提高访问速度。
-
持久化存储:对于历史市场深度数据,可以将其存储到关系型数据库(如 MySQL)中,以便于后续的查询和分析。
import mysql.connector def save_order_book_to_mysql(df, futures_code): """ 将期货市场深度数据保存到 MySQL 数据库中。 :param df: 市场深度数据 DataFrame :param futures_code: 期货代码 """ connection = mysql.connector.connect( host="localhost", user="root", password="password", database="futures_data" ) cursor = connection.cursor() create_table_query = f""" CREATE TABLE IF NOT EXISTS order_book_{futures_code} ( 买价 FLOAT, 买量 INT, 卖价 FLOAT, 卖量 INT )""" cursor.execute(create_table_query) for _, row in df.iterrows(): insert_query = f""" INSERT INTO order_book_{futures_code} (买价, 买量, 卖价, 卖量) VALUES ({row['买价']}, {row['买量']}, {row['卖价']}, {row['卖量']}) """ cursor.execute(insert_query) connection.commit() cursor.close() connection.close() # 将市场深度数据保存到 MySQL 数据库 save_order_book_to_mysql(order_book_df, "AU0")
4. 数据采集与分析的优化策略
在获取市场深度数据时,为了保证数据的实时性和完整性,可以采取以下优化策略:
-
自动重连与数据补偿:由于网络问题或服务器故障,API 连接可能会中断,需要设计自动重连机制,并在重连后补偿之前可能遗漏的数据。
-
数据去重与清洗:在数据采集过程中,由于网络抖动或多次连接,可能会存在重复数据,因此需要对数据进行去重和清洗,确保数据的唯一性。
-
定时采集与实时订阅:市场深度数据是实时变化的,可以利用定时任务定期采集,或通过 WebSocket 实现实时订阅,以确保数据的时效性和准确性。
5. 市场深度数据的应用
-
支撑与阻力识别:通过分析市场深度数据中的买卖挂单,可以识别市场中的支撑位和阻力位。例如,在某一价格上存在大量买单,可能意味着价格的支撑点。
-
流动性分析:通过分析不同价位的买卖挂单,可以了解市场的流动性,判断在特定价位下大规模交易是否会对价格产生显著影响。