量化交易系统开发-实时行情自动化交易-3.4.1.1.A股K线数据

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。

接下来聊聊基于A股API获取K线数据。

在开发 A 股自动化交易系统时,获取 K 线数据是进行市场分析、趋势跟踪和策略开发的重要步骤。A 股的 K 线数据包含开盘价、最高价、最低价、收盘价和成交量等信息,能够帮助投资者理解市场动态,做出有效的投资决策。以下是通过 Python 编写的代码示例,利用 A 股常用的公开 API(例如东方财富、腾讯、网易等)获取 K 线数据的详细开发内容。

1. 使用东方财富 API 获取 K 线数据

东方财富提供了较为全面的 A 股数据接口,可以通过 HTTP 请求获取股票的历史 K 线数据。下面的代码示例展示了如何通过 Python 调用东方财富的 API 获取 A 股的 K 线数据。

复制代码
import requests
import pandas as pd
import datetime

def get_eastmoney_klines(stock_code, market_type='0', kline_type='101', limit=100):
    """
    获取东方财富 A 股的 K 线数据。

    :param stock_code: 股票代码,例如 '600519' 表示贵州茅台
    :param market_type: 市场类型,'0' 表示沪市,'1' 表示深市
    :param kline_type: K 线类型,'101' 表示日 K 线,'102' 表示周 K 线,'103' 表示月 K 线
    :param limit: 获取 K 线数据的数量
    :return: K 线数据的 pandas DataFrame
    """
    url = f"http://push2his.eastmoney.com/api/qt/stock/kline/get"
    params = {
        "secid": f"{market_type}.{stock_code}",
        "fields1": "f1,f2,f3,f4,f5,f6",
        "fields2": "f51,f52,f53,f54,f55,f56",
        "klt": kline_type,
        "fqt": "1",
        "end": "20500101",
        "lmt": limit,
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = response.json()
        klines = data.get("data", {}).get("klines", [])
        kline_list = [kline.split(",") for kline in klines]
        df = pd.DataFrame(kline_list, columns=["日期", "开盘价", "收盘价", "最高价", "最低价", "成交量"])
        return df
    else:
        raise Exception(f"Error fetching K line data: {response.status_code}")

# 获取贵州茅台(600519)的最近 100 个日 K 线数据
df_klines = get_eastmoney_klines("600519")
print(df_klines)

在该代码中,通过调用东方财富的 API,获取了指定股票代码的 K 线数据。market_type 用于指定是沪市还是深市,kline_type 用于选择日 K 线、周 K 线或月 K 线。返回的数据被转换为 Pandas 的 DataFrame,以方便后续的处理和分析。

2. 使用腾讯 API 获取 K 线数据

腾讯财经也提供了 A 股的实时和历史数据接口,通过 HTTP 请求可以方便地获取 A 股的 K 线数据。以下是使用腾讯 API 获取 A 股 K 线数据的代码示例:

复制代码
import requests
import pandas as pd
import datetime

def get_tencent_klines(stock_code, limit=100):
    """
    获取腾讯 A 股的 K 线数据。

    :param stock_code: 股票代码,例如 '600519'
    :param limit: 获取 K 线数据的数量
    :return: K 线数据的 pandas DataFrame
    """
    url = f"http://web.ifzq.gtimg.cn/appstock/app/kline/kline"
    params = {
        "param": f"sh{stock_code},day,,{limit}"
    }
    response = requests.get(url, params=params)
    if response.status_code == 200:
        data = response.json()
        kline_data = data.get("data", {}).get(f"sh{stock_code}", {}).get("day", [])
        df = pd.DataFrame(kline_data, columns=["日期", "开盘价", "收盘价", "最高价", "最低价", "成交量"])
        return df
    else:
        raise Exception(f"Error fetching K line data: {response.status_code}")

# 获取贵州茅台(600519)的最近 100 个日 K 线数据
df_klines_tencent = get_tencent_klines("600519")
print(df_klines_tencent)

在该示例中,腾讯 API 返回的数据结构略有不同,通过指定交易所代码(如沪市为 sh,深市为 sz)和股票代码,可以获取指定交易对的 K 线数据。获取的数据同样转换为 Pandas 的 DataFrame 格式,方便后续的数据处理。

3. K 线数据的存储与处理

获取到的 K 线数据需要进行存储与处理,以便后续的策略分析、决策支持和模型训练。

  • 存储方式:可以将 K 线数据存入关系型数据库(如 MySQL)或 NoSQL 数据库(如 MongoDB),以便于后续的查询和分析。例如,可以创建一个表,用于存储不同股票的日、周、月 K 线数据,方便后续的回测与策略优化。

    复制代码
    import mysql.connector
    
    def save_to_mysql(df, stock_code):
        """
        将 K 线数据保存到 MySQL 数据库中。
    
        :param df: K 线数据 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 kline_{stock_code} (
            日期 VARCHAR(20),
            开盘价 FLOAT,
            收盘价 FLOAT,
            最高价 FLOAT,
            最低价 FLOAT,
            成交量 BIGINT
        )"""
        cursor.execute(create_table_query)
        for _, row in df.iterrows():
            insert_query = f"""
            INSERT INTO kline_{stock_code} (日期, 开盘价, 收盘价, 最高价, 最低价, 成交量)
            VALUES ('{row['日期']}', {row['开盘价']}, {row['收盘价']}, {row['最高价']}, {row['最低价']}, {row['成交量']})
            """
            cursor.execute(insert_query)
        connection.commit()
        cursor.close()
        connection.close()
    
    # 将 K 线数据保存到 MySQL 数据库
    save_to_mysql(df_klines, "600519")
4. 错误处理与重试机制

在获取 K 线数据时,可能会遇到网络连接超时、数据返回异常等问题,因此需要加入有效的错误处理与重试机制。

  • 网络错误处理 :通过 try...except 结构捕获网络请求中的错误,例如超时、无响应等情况,并在遇到错误时进行合理处理。

    复制代码
    try:
        df_klines = get_eastmoney_klines("600519")
    except Exception as e:
        print(f"Error: {e}")
  • 重试机制:为了确保数据的完整性,可以在请求失败时进行重试,尤其是在数据量较大的情况下,避免因临时网络问题导致的数据缺失。

相关推荐
后端小肥肠4 分钟前
躺赚必备!RPA+Coze+豆包:公众号自动发文,AI率0%亲测有效(附AI率0%提示词)
人工智能·aigc·coze
破无差9 分钟前
python实现简单的地图绘制与标记20250705
python
摘星编程15 分钟前
CloudBase AI ToolKit实战:从0到1开发一个智能医疗网站
人工智能·腾讯云·ai代码远征季#h5应用·ai医疗应用·cloudbase开发
锅挤20 分钟前
深度学习5(深层神经网络 + 参数和超参数)
人工智能·深度学习·神经网络
一支烟一朵花24 分钟前
630,百度文心大模型4.5系列开源!真香
人工智能·百度·开源·文心一言
网安INF26 分钟前
深层神经网络:原理与传播机制详解
人工智能·深度学习·神经网络·机器学习
喜欢吃豆31 分钟前
目前最火的agent方向-A2A快速实战构建(二): AutoGen模型集成指南:从OpenAI到本地部署的全场景LLM解决方案
后端·python·深度学习·flask·大模型
好开心啊没烦恼1 小时前
Python 数据分析:DataFrame,生成,用字典创建 DataFrame ,键值对数量不一样怎么办?
开发语言·python·数据挖掘·数据分析
AIbase20241 小时前
国内MCP服务平台推荐!aibase.cn上线MCP服务器集合平台
运维·服务器·人工智能
周树皮不皮2 小时前
20250704【翻转&二叉树】|Leetcodehot100之226【pass】&今天计划
python