量化交易系统开发-实时行情自动化交易-3.4.1.3.A股市场深度数据

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}")
  • 重试机制:对于临时的网络问题,可以加入重试机制,例如在请求失败时重新尝试连接,并通过设置指数退避策略(逐步延长每次重试的时间间隔)以防止频繁请求对服务器造成负担。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIGC数据超市

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值