news 2026/4/24 10:19:12

保姆级教程:用Python和歪枣网API快速获取股票数据并绘制K线图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:用Python和歪枣网API快速获取股票数据并绘制K线图

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'(不复权)
ktypeK线类型'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样式,能够清晰展示买卖点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 10:19:00

保姆级教程:在NRF52840上实现USB CDC串口通信(基于nRF5 SDK 17.0.2)

NRF52840 USB CDC串口通信实战指南&#xff1a;从零搭建到双向数据传输 在嵌入式开发领域&#xff0c;USB通信一直是连接设备与上位机的高效桥梁。NRF52840这颗蓝牙5.0/Thread/Zigbee多协议SoC&#xff0c;其内置的全速USB 2.0控制器为开发者提供了即插即用的通信方案。不同于传…

作者头像 李华
网站建设 2026/4/24 10:18:04

Gazebo仿真翻车实录:SDF建模中5个最常见的物理属性错误及修复方法

Gazebo仿真中的SDF物理属性陷阱&#xff1a;5个典型错误诊断与修复指南 当你的机器人模型在Gazebo中突然像火箭一样冲天而起&#xff0c;或是传感器数据像醉酒般飘忽不定时&#xff0c;问题往往藏在那些不起眼的SDF参数里。作为机器人仿真领域的"法医"&#xff0c;我…

作者头像 李华
网站建设 2026/4/24 10:18:03

3步掌握抖音视频批量下载:douyin-downloader实战指南

3步掌握抖音视频批量下载&#xff1a;douyin-downloader实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…

作者头像 李华
网站建设 2026/4/24 10:16:42

当流媒体成为数字围城:N_m3u8DL-RE如何打破现代视频下载的壁垒

当流媒体成为数字围城&#xff1a;N_m3u8DL-RE如何打破现代视频下载的壁垒 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8…

作者头像 李华