19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。
接下来聊聊基于A股API获取市场深度数据。
市场深度数据(Order Book Data)是分析股票供需关系、识别市场买卖力量以及判断价格变动趋势的关键工具。在 A 股的自动化交易系统中,实时获取市场深度数据对于制定有效的交易策略至关重要。以下是通过 Python 编写的代码示例,利用 A 股常用的公开 API(如东方财富、腾讯等)获取市场深度数据的详细开发内容。
1. 使用东方财富 API 获取市场深度数据
东方财富提供了较为全面的 A 股市场深度数据接口,通过 HTTP 请求可以获取特定股票的买卖盘情况。下面是利用 Python 调用东方财富 API 获取市场深度数据的代码示例。
import requests
import pandas as pd
def get_eastmoney_order_book(stock_code, market_type='0'):
"""
获取东方财富 A 股的市场深度数据。
:param stock_code: 股票代码,例如 '600519' 表示贵州茅台
:param market_type: 市场类型,'0' 表示沪市,'1' 表示深市
:return: 市场深度数据的 pandas DataFrame
"""
url = f"http://push2.eastmoney.com/api/qt/stock/details/get"
params = {
"secid": f"{market_type}.{stock_code}",
"fields1": "f1,f2,f3,f4,f5",
"fields2": "f51,f52,f53,f54,f55",
"pos": "-1",
"lmt": 10, # 默认获取买卖盘前 10 档数据
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
bids = data.get("data", {}).get("bid", [])
asks = data.get("data", {}).get("ask", [])
# 将买单和卖单数据整合为 DataFrame
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}")
# 获取贵州茅台(600519)的市场深度数据
order_book_df = get_eastmoney_order_book("600519")
print(order_book_df)
在该示例中,通过调用东方财富的 API,获取了指定股票代码的市场深度数据。API 返回的数据包括买卖双方的挂单价格和数量,返回的结果被整理为 Pandas DataFrame,以便后续的处理与分析。
2. 使用腾讯 API 获取市场深度数据
腾讯财经也提供了 A 股的市场深度数据接口,可以通过 HTTP 请求来获取。以下是使用腾讯 API 获取 A 股市场深度数据的代码示例。
import requests
import pandas as pd
def get_tencent_order_book(stock_code, market='sh'):
"""
获取腾讯 A 股的市场深度数据。
:param stock_code: 股票代码,例如 '600519'
:param market: 市场类型,'sh' 表示沪市,'sz' 表示深市
:return: 市场深度数据的 pandas DataFrame
"""
url = f"https://web.ifzq.gtimg.cn/appstock/app/depth/depth"
params = {
"code": f"{market}{stock_code}"
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
bids = data.get("data", {}).get("depth", {}).get("buy", [])
asks = data.get("data", {}).get("depth", {}).get("sell", [])
# 将买单和卖单数据整合为 DataFrame
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}")
# 获取贵州茅台(600519)的市场深度数据
order_book_df_tencent = get_tencent_order_book("600519")
print(order_book_df_tencent)
在该示例中,通过调用腾讯的 API,可以获取指定股票的市场深度数据。市场深度数据返回为买卖订单的价格和数量,并转换为 Pandas 的 DataFrame 格式,方便后续的分析。
3. 市场深度数据的存储与管理
市场深度数据需要进行合理的存储和管理,以便进行后续的市场分析和策略回测。
-
实时数据缓存:对于市场深度的实时数据,可以使用 Redis 等内存数据库来存储,便于快速访问。Redis 的高读写性能非常适合用作实时数据缓存,特别是在需要对最新挂单数据进行策略决策的场景中。
-
持久化存储:对于历史深度数据,可以使用关系型数据库(如 MySQL)或时间序列数据库(如 InfluxDB)进行存储。历史深度数据对于后续分析市场流动性和趋势变化具有重要意义。以下代码示例展示了如何将市场深度数据保存到 MySQL 中:
import mysql.connector def save_order_book_to_mysql(df, stock_code): """ 将市场深度数据保存到 MySQL 数据库中。 :param df: 市场深度数据 DataFrame :param stock_code: 股票代码 """ connection = mysql.connector.connect( host="localhost", user="root", password="password", database="stock_data" ) cursor = connection.cursor() create_table_query = f""" CREATE TABLE IF NOT EXISTS order_book_{stock_code} ( 买价 FLOAT, 买量 INT, 卖价 FLOAT, 卖量 INT )""" cursor.execute(create_table_query) for _, row in df.iterrows(): insert_query = f""" INSERT INTO order_book_{stock_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_tencent, "600519")
4. 错误处理与重试机制
在获取市场深度数据时,可能会遇到网络连接失败、数据返回异常等问题,因此需要加入错误处理和重试机制。
-
网络错误处理:通过
try...except
结构捕获请求中的错误,例如网络超时、服务器不可达等情况,并根据具体的异常类型做出不同的处理。try: order_book_df = get_eastmoney_order_book("600519") except Exception as e: print(f"Error fetching order book data: {e}")
-
重试机制:对于临时的网络问题,可以加入重试机制,例如在请求失败时重新尝试连接,并通过设置指数退避策略(逐步延长每次重试的时间间隔)以防止频繁请求对服务器造成负担。