19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。
接下来聊聊基于A股API获取市场深度数据。
市场深度数据(Order Book Data)是分析股票供需关系、识别市场买卖力量以及判断价格变动趋势的关键工具。在 A 股的自动化交易系统中,实时获取市场深度数据对于制定有效的交易策略至关重要。以下是通过 Python 编写的代码示例,利用 A 股常用的公开 API(如东方财富、腾讯等)获取市场深度数据的详细开发内容。
1. 使用东方财富 API 获取市场深度数据
东方财富提供了较为全面的 A 股市场深度数据接口,通过 HTTP 请求可以获取特定股票的买卖盘情况。下面是利用 Python 调用东方财富 API 获取市场深度数据的代码示例。
import requests
import pandas as pddef 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", [])# 将买单和卖单数据整合为 DataFramebid_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_dfelse: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 pddef 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", [])# 将买单和卖单数据整合为 DataFramebid_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_dfelse: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.connectordef 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}")
-
重试机制:对于临时的网络问题,可以加入重试机制,例如在请求失败时重新尝试连接,并通过设置指数退避策略(逐步延长每次重试的时间间隔)以防止频繁请求对服务器造成负担。