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