19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。
接下来聊聊基于A股API获取交易数据。
在开发 A 股自动化交易系统时,交易数据(Trade Ticks)是进行市场分析、捕捉市场趋势、识别买卖力量的重要基础数据。A 股的交易数据包含每笔成交的详细信息,例如成交时间、成交价格、成交量和交易方向等,能够帮助投资者了解市场的微观结构并制定交易策略。以下是通过 Python 编写的代码示例,利用 A 股常用的公开 API(如东方财富、腾讯、网易等)获取交易数据的详细开发内容。
1. 使用东方财富 API 获取交易数据
东方财富提供了较为全面的 A 股数据接口,可以通过 HTTP 请求获取股票的实时交易数据(成交明细)。下面的代码示例展示了如何通过 Python 调用东方财富的 API 获取 A 股的交易数据。
import requests
import pandas as pd
import datetimedef get_eastmoney_trades(stock_code, market_type='0', limit=100):"""获取东方财富 A 股的交易数据。:param stock_code: 股票代码,例如 '600519' 表示贵州茅台:param market_type: 市场类型,'0' 表示沪市,'1' 表示深市:param limit: 获取交易数据的数量: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": limit,}response = requests.get(url, params=params)if response.status_code == 200:data = response.json()trades = data.get("data", {}).get("details", [])trade_list = [trade.split(",") for trade in trades]df = pd.DataFrame(trade_list, columns=["时间", "成交价格", "成交量", "买卖方向", "成交金额"])return dfelse:raise Exception(f"Error fetching trade data: {response.status_code}")# 获取贵州茅台(600519)的最近 100 笔交易数据
df_trades = get_eastmoney_trades("600519")
print(df_trades)
在这个示例中,通过调用东方财富的 API,获取了指定股票代码的交易数据。market_type
用于指定是沪市还是深市,返回的数据被转换为 Pandas 的 DataFrame 格式,包含每笔成交的时间、成交价格、成交量、买卖方向等信息,以便后续的数据分析与处理。
2. 使用腾讯 API 获取交易数据
腾讯财经也提供了 A 股的实时交易数据接口,通过 HTTP 请求可以方便地获取 A 股的逐笔交易数据。以下是使用腾讯 API 获取 A 股交易数据的代码示例:
import requests
import pandas as pddef get_tencent_trades(stock_code, market='sh', limit=100):"""获取腾讯 A 股的交易数据。:param stock_code: 股票代码,例如 '600519':param market: 市场类型,'sh' 表示沪市,'sz' 表示深市:param limit: 获取交易数据的数量:return: 交易数据的 pandas DataFrame"""url = f"https://web.ifzq.gtimg.cn/appstock/app/hq/trade/get"params = {"code": f"{market}{stock_code}",}response = requests.get(url, params=params)if response.status_code == 200:data = response.json()trades = data.get("data", {}).get("tradelist", [])df = pd.DataFrame(trades, columns=["时间", "价格", "成交量", "方向"])return df.head(limit)else:raise Exception(f"Error fetching trade data: {response.status_code}")# 获取贵州茅台(600519)的最近 100 笔交易数据
df_trades_tencent = get_tencent_trades("600519")
print(df_trades_tencent)
在该示例中,通过调用腾讯 API,可以获取到指定交易对的逐笔交易数据。交易数据包含了时间、成交价格、成交量和买卖方向等信息,这些数据同样被转换为 Pandas 的 DataFrame 格式,方便后续的处理。
3. 交易数据的存储与处理
交易数据的存储和管理是交易系统的核心,特别是在进行策略分析和回测时,需要高效地访问和处理大量的交易数据。
-
内存缓存:对于实时性要求较高的数据,可以使用 Redis 这样的内存数据库进行缓存,以加快数据的读写速度。这种方式适用于高频交易策略,实时读取最新的交易数据进行策略决策。
-
持久化存储:对于逐笔交易数据,建议使用关系型数据库(如 MySQL)或 NoSQL 数据库(如 MongoDB)进行持久化存储。MySQL 可以方便地存储结构化的交易数据,而 MongoDB 更适合存储灵活性较高的非结构化数据。以下是将交易数据保存到 MySQL 的代码示例:
import mysql.connectordef save_trades_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 trades_{stock_code} (时间 VARCHAR(20),成交价格 FLOAT,成交量 INT,方向 VARCHAR(10))"""cursor.execute(create_table_query)for _, row in df.iterrows():insert_query = f"""INSERT INTO trades_{stock_code} (时间, 成交价格, 成交量, 方向)VALUES ('{row['时间']}', {row['价格']}, {row['成交量']}, '{row['方向']}')"""cursor.execute(insert_query)connection.commit()cursor.close()connection.close()# 将交易数据保存到 MySQL 数据库 save_trades_to_mysql(df_trades_tencent, "600519")
4. 错误处理与重试机制
在获取交易数据时,由于网络不稳定或 API 限制,可能会导致请求失败。因此,在开发中需要加入有效的错误处理和重试机制。
-
网络错误处理:通过
try...except
结构捕获网络请求中的错误,例如网络连接超时或数据请求失败,并根据具体的异常类型做出不同的处理。try:df_trades = get_eastmoney_trades("600519") except Exception as e:print(f"Error fetching trade data: {e}")
-
重试机制:对于临时的网络问题,可以设置重试机制,在请求失败时重新尝试。例如,可以设置每次重试间隔逐步增加,避免在短时间内频繁请求服务器,减轻服务器的负担。