量化交易系统开发-实时行情自动化交易-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}")
  • 重试机制:为了确保数据的完整性,可以在请求失败时进行重试,尤其是在数据量较大的情况下,避免因临时网络问题导致的数据缺失。

相关推荐
逆风优雅7 分钟前
python 爬取网站图片的小demo
开发语言·python
是娜个二叉树!10 分钟前
听课笔记-nlp
人工智能·笔记·自然语言处理
码界筑梦坊18 分钟前
基于Pyhon的京东笔记本电脑数据可视化分析系统
python·信息可视化·数据分析·毕业设计·电脑·销量预测
galileo201621 分钟前
多智能体优秀开发框架
人工智能
stevenzqzq26 分钟前
kotlin中主构造函数是什么
开发语言·python·kotlin
Tttian62237 分钟前
Python办公自动化(2)对word&pdf的操作
开发语言·python
DUTBenjamin37 分钟前
计算机视觉5——运动估计和光流估计
人工智能·计算机视觉
HNU混子39 分钟前
手搓多模态-03 顶层和嵌入层的搭建
python·机器学习·计算机视觉
databook1 小时前
『Plotly实战指南』--箱线图绘制与应用
python·数据分析·数据可视化
HuggingFace1 小时前
Open R1 项目进展第三期
人工智能