Python量化实战:从歪枣网API获取股票数据到K线图绘制全流程解析
金融数据分析正成为越来越多开发者和投资者的必备技能。对于刚接触量化领域的Python用户来说,最迫切的需求往往不是复杂的交易策略,而是如何快速获取真实市场数据并将其可视化。本文将手把手带你完成从API调用到K线图绘制的完整流程,使用歪枣网免费API作为数据源,结合Python生态中最实用的工具链——requests、pandas和mplfinance,构建一个即拿即用的数据分析解决方案。
1. 环境准备与数据源选择
在开始之前,我们需要确保开发环境配置正确。推荐使用Anaconda作为Python环境管理器,它能够轻松处理各种依赖库的安装和版本管理。以下是核心依赖库及其作用:
- requests:简洁高效的HTTP请求库,用于与歪枣网API交互
- pandas:数据处理的核心工具,提供DataFrame这一强大数据结构
- mplfinance:专门为金融数据可视化设计的Matplotlib扩展
- numpy:数值计算基础库,支持高效的数组操作
# 使用conda或pip安装所需库 conda install requests pandas mplfinance numpy # 或者 pip install requests pandas mplfinance numpy歪枣网提供了免费的股票历史数据API,非常适合个人开发者和小规模研究使用。其API特点包括:
- 支持A股、港股、美股等多种市场
- 提供日K、周K、月K等不同时间粒度
- 返回JSON格式数据,易于解析处理
- 免费版本有适当调用频率限制
提示:注册歪枣网账号后,可以在个人中心获取API token,这是调用接口的必要凭证。
2. 构建API请求与数据获取
与歪枣网API交互的核心是构造正确的请求URL和参数。我们需要关注以下几个关键参数:
| 参数名 | 说明 | 示例值 |
|---|---|---|
| code | 股票代码 | '601318' |
| startDate | 开始日期 | '2020-01-01' |
| endDate | 结束日期 | '2020-03-18' |
| fq | 复权类型 | '0'(不复权) |
| ktype | K线类型 | '101'(日K) |
| fields | 返回字段 | 'tdate,open,high,low,close' |
下面是一个完整的API请求类实现:
import requests import pandas as pd import datetime class StockDataFetcher: def __init__(self, token): self.token = token self.base_url = "http://api.waizaowang.com/doc/getStockHSADayKLine" def fetch_data(self, stock_code, start_date, end_date=None): """获取指定股票的历史K线数据""" if end_date is None: end_date = datetime.datetime.now().strftime('%Y-%m-%d') params = { 'code': stock_code, 'startDate': start_date, 'endDate': end_date, 'fq': '0', 'ktype': '101', 'fields': 'tdate,open,high,low,close,cjl,cje,hsl', 'export': '5', 'token': self.token } response = requests.get(self.base_url, params=params) if response.status_code == 200: json_data = response.json() df = pd.DataFrame(json_data['data'], columns=json_data['zh']) return df else: raise Exception(f"API请求失败,状态码:{response.status_code}")使用这个类获取中国平安(601318)2020年第一季度的数据:
# 替换为你的实际token fetcher = StockDataFetcher(token="your_api_token_here") pingan_data = fetcher.fetch_data('601318', '2020-01-01', '2020-03-31')3. 数据清洗与特征工程
原始数据获取后,通常需要进行清洗和转换才能用于分析。pandas提供了丰富的数据处理功能,让我们能够高效完成这些工作。
首先,我们需要规范列名并设置时间索引:
# 列名映射为英文 column_mapping = { '交易时间': 'Date', '开盘价': 'Open', '最高价': 'High', '最低价': 'Low', '收盘价': 'Close', '成交量': 'Volume', '成交额': 'Amount', '换手率': 'Turnover' } pingan_data = pingan_data.rename(columns=column_mapping) # 将日期列转换为datetime类型并设为索引 pingan_data['Date'] = pd.to_datetime(pingan_data['Date']) pingan_data.set_index('Date', inplace=True)接下来,我们可以计算一些常用的技术指标:
# 计算每日价格变化 pingan_data['PriceChange'] = pingan_data['Close'].diff() # 计算5日移动平均 pingan_data['MA5'] = pingan_data['Close'].rolling(5).mean() # 计算20日移动平均 pingan_data['MA20'] = pingan_data['Close'].rolling(20).mean() # 计算相对强弱指数(RSI) delta = pingan_data['Close'].diff() gain = delta.where(delta > 0, 0) loss = -delta.where(delta < 0, 0) avg_gain = gain.rolling(14).mean() avg_loss = loss.rolling(14).mean() rs = avg_gain / avg_loss pingan_data['RSI'] = 100 - (100 / (1 + rs))4. 专业K线图绘制
mplfinance库是基于Matplotlib的金融数据可视化工具,它简化了K线图的绘制过程,同时提供了丰富的自定义选项。
基础K线图绘制:
import mplfinance as mpf # 选择最近30个交易日的数据展示 recent_data = pingan_data.tail(30) # 基础K线图配置 mpf.plot(recent_data, type='candle', style='charles', title='中国平安(601318) - 日K线', ylabel='价格(元)', volume=True, figratio=(12,6))添加技术指标和自定义样式:
# 创建附加绘图内容 add_plot = [ mpf.make_addplot(recent_data['MA5'], color='blue'), mpf.make_addplot(recent_data['MA20'], color='orange'), mpf.make_addplot(recent_data['RSI'], panel=1, color='purple', ylabel='RSI') ] # 高级K线图配置 mpf.plot(recent_data, type='candle', style='yahoo', title='中国平安(601318) - 带技术指标', ylabel='价格(元)', addplot=add_plot, volume=True, figratio=(12,8), panel_ratios=(3,1), show_nontrading=False)注意:mplfinance的style参数支持多种预设样式,如'default'、'yahoo'、'charles'等,可以根据个人喜好选择。
5. 交易信号生成与可视化
基于技术指标,我们可以生成简单的交易信号并可视化展示。以下是一个基于移动平均线的金叉/死叉策略示例:
# 生成交易信号 pingan_data['Signal'] = 0 # 0表示无信号 pingan_data.loc[(pingan_data['MA5'] > pingan_data['MA20']) & (pingan_data['MA5'].shift(1) <= pingan_data['MA20'].shift(1)), 'Signal'] = 1 # 金叉买入信号 pingan_data.loc[(pingan_data['MA5'] < pingan_data['MA20']) & (pingan_data['MA5'].shift(1) >= pingan_data['MA20'].shift(1)), 'Signal'] = -1 # 死叉卖出信号 # 可视化信号 plot_data = recent_data.copy() buy_signals = plot_data[plot_data['Signal'] == 1] sell_signals = plot_data[plot_data['Signal'] == -1] ap = [ mpf.make_addplot(plot_data['MA5'], color='blue'), mpf.make_addplot(plot_data['MA20'], color='orange'), mpf.make_addplot(buy_signals['MA5'], type='scatter', markersize=100, marker='^', color='g'), mpf.make_addplot(sell_signals['MA5'], type='scatter', markersize=100, marker='v', color='r') ] mpf.plot(plot_data, type='candle', style='yahoo', addplot=ap, title='中国平安(601318) - 交易信号', volume=True)在实际项目中,我发现mplfinance的make_addplot函数非常灵活,可以叠加多种类型的图表元素。对于信号标记,使用散点图(scatter)类型并选择合适的marker样式,能够清晰展示买卖点。