根据你提供的腾讯财经API接口,下面是一个完整的Python示例,演示如何获取股票日K线数据并转换为Pandas DataFrame。
📦 完整代码示例
import requestsimport pandas as pdimport jsonimport redef fetch_stock_kline(stock_code, days=320): """ 从腾讯财经API获取股票日K线数据 参数: stock_code: 股票代码,如 'sz002129' 或 'sh600000' days: 获取的天数,默认320天 返回: Pandas DataFrame,包含日期、开盘、收盘、最高、最低、成交量等 """ # 1. 构建请求URL url = ( f"https://proxy.finance.qq.com/ifzqgtimg/appstock/app/newfqkline/get" f"?_var=kline_dayqfq¶m={stock_code},day,,,{days},qfq" f"&r={__import__('random').random()}" ) # 2. 发送请求 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } response = requests.get(url, headers=headers) # 3. 解析JSONP响应 (去除开头的 "kline_dayqfq=") raw_text = response.text json_text = raw_text.replace('kline_dayqfq=', '') data = json.loads(json_text) # 4. 提取K线数据 kline_data = data['data'][stock_code]['qfqday'] # 5. 转换为DataFrame columns = ['日期', '开盘', '收盘', '最高', '最低', '成交量', '未知', '涨跌幅', '成交额', '未知2'] df = pd.DataFrame(kline_data, columns=columns) # 6. 只保留需要的列 df = df[['日期', '开盘', '收盘', '最高', '最低', '成交量', '成交额', '涨跌幅']] # 7. 转换数据类型 df['日期'] = pd.to_datetime(df['日期']) df['开盘'] = df['开盘'].astype(float) df['收盘'] = df['收盘'].astype(float) df['最高'] = df['最高'].astype(float) df['最低'] = df['最低'].astype(float) df['成交量'] = df['成交量'].astype(float) df['成交额'] = df['成交额'].astype(float) df['涨跌幅'] = df['涨跌幅'].astype(float) # 8. 按日期升序排列(API返回的是从新到旧) df = df.sort_values('日期', ascending=True).reset_index(drop=True) return df# ========== 使用示例 ==========if __name__ == '__main__': # 获取 TCL中环 (sz002129) 的K线数据 df = fetch_stock_kline('sz002129', days=320) print("数据概览:") print(df.head()) print("\n数据信息:") print(df.info()) print("\n统计描述:") print(df.describe())📊 数据字段说明
API返回的每一条数据是一个数组,各字段含义如下:
| 索引 | 字段名 | 说明 |
|---|---|---|
| 0 | 日期 | 交易日期,格式 YYYY-MM-DD |
| 1 | 开盘 | 开盘价 |
| 2 | 收盘 | 收盘价(前复权) |
| 3 | 最高 | 最高价 |
| 4 | 最低 | 最低价 |
| 5 | 成交量 | 成交量(手) |
| 6 | 未知 | 空对象 {},可忽略 |
| 7 | 涨跌幅 | 当日涨跌幅(百分比) |
| 8 | 成交额 | 成交额(万元) |
| 9 | 未知2 | 空字符串,可忽略 |
注意:API返回的数据是从最近日期到较远日期倒序排列的,代码中已做了升序处理。
🎨 结合 mplfinance 绘制K线图
获取数据后,可以直接用 mplfinance 绘制K线图:
import mplfinance as mpf# 获取数据df = fetch_stock_kline('sz002129', days=120)# mplfinance 要求列名为 Open, High, Low, Close, Volume# 并且索引为 DatetimeIndexdf_plot = df[['日期', '开盘', '最高', '最低', '收盘', '成交量']].copy()df_plot.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']df_plot = df_plot.set_index('Date')# 绘制K线图mpf.plot(df_plot, type='candle', style='yahoo', title='TCL中环 (002129) 日K线图', volume=True, figsize=(12, 8))📝 URL参数解读
https://proxy.finance.qq.com/ifzqgtimg/appstock/app/newfqkline/get ?_var=kline_dayqfq # 变量名,用于JSONP回调 ¶m=sz002129,day,,,320,qfq # 参数:股票代码,周期,开始,结束,天数,复权类型 &r=0.48251696632573515 # 随机数,防止缓存参数 param 各字段含义:
sz002129:股票代码(深市以sz开头,沪市以sh开头)day:周期,day=日K,week=周K,month=月K,,:起始和结束日期(留空表示取最新数据)320:获取的天数qfq:复权类型,qfq=前复权,hfq=后复权,空=不复权
💡 小贴士
- 股票代码前缀:深市用
sz(如sz000001),沪市用sh(如sh600000)。 - 成交量单位:API返回的成交量是手(1手=100股),成交额单位是万元。
- 频率限制:该接口为公开接口,但频繁请求可能被限制,建议适当增加延时或缓存数据。
