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

相关推荐
Eric.Lee202136 分钟前
数据集-目标检测系列- 花卉 玫瑰 检测数据集 rose >> DataBall
人工智能·目标检测·计算机视觉
清流君37 分钟前
【运动规划】移动机器人运动规划与轨迹优化全解析 | 经典算法总结
人工智能·笔记·算法·机器人·自动驾驶·运动规划
枫哥和java3 小时前
python serializer, model drf通过序列化器, 模型获取mysql 一张表某个字段数据库现存的最大值
数据库·python·mysql
无忧无虑Coding4 小时前
pyinstall 打包Django程序
后端·python·django
ad禥思妙想7 小时前
如何运行python脚本
开发语言·python
威威猫的栗子7 小时前
用 Python 与 Turtle 创作属于你的“冰墩墩”!
开发语言·python·turtle
IT古董7 小时前
【机器学习】超简明Python基础教程
开发语言·人工智能·python·机器学习
算家云7 小时前
VideoCrafter模型部署教程
人工智能·深度学习·机器学习·显卡·算力·视频生成·ai视频编辑
qq_q9922502778 小时前
django基于python 语言的酒店推荐系统
后端·python·django
小李L8 小时前
Python3 Flask 应用中使用阿里短信发送
后端·python·flask