Python 获取股票K线数据
前言
玩过股票的几乎都知道,股票历史交易日的开盘价、收盘价、最高价、最低价等指标是选股的重要依据。虽然仅仅依靠它们无法在股市中盆满钵满,但是运用好它确实能在较大程度上提高我们的赚钱概率。
当前的金融数据查看工具确实够多,例如东方财富、同花顺等知名财经网站。它们的数据很全,但是集成程度太高了,难以满足每个人的个性化需求。比如说我以A股的4000多只股票为研究对象,想研究它们的历史日k线数据,那么导出这么多数据无疑是一个巨大的工程。并且这些财经网站可能并不会给免费用户提供批量导出数据的功能。
这个时候还想获取这些数据怎么办呢?冲会员当然是一个选择,不过这样子还是容易受制于人,即使是会员,个性化程度还是不够高。
为了解决“股票k线数据难以个性化导出”这个问题,我们可以尝试使用 Python 对财经网站进行爬虫以获取源数据,再从里面提取出我们需要的信息,比如本次的k线数据,之后再保存到表格文件里面。
开始之前
Python版本要求
Python 3
如果没有安装 Python,可以参考我写的这篇安装教程
Win下快速搭建Python编程环境67 赞同 · 19 评论文章正在上传…重新上传取消
需要安装的库
pandas
requests
库的安装方法是:打开 cmd(命令提示符或者其他终端工具),输入以下代码
pip install pandas requests
输入完毕,按 Enter 键执行代码,等待 successfully 出现即可
代码展示
需求 1 描述
获取 代码为 600519 这只股票从 2020年1月1日 到 2020年11月1日 的k线数据并将数据保存到以股票代码命名的csv文件中,例如 600519.csv
示例代码 1
from urllib.parse import urlencode
import pandas as pd
import requestsdef gen_secid(rawcode: str) -> str:'''生成东方财富专用的secidParameters----------rawcode : 6 位股票代码Return------str: 指定格式的字符串'''# 沪市指数if rawcode[:3] == '000':return f'1.{rawcode}'# 深证指数if rawcode[:3] == '399':return f'0.{rawcode}'# 沪市股票if rawcode[0] != '6':return f'0.{rawcode}'# 深市股票return f'1.{rawcode}'def get_k_history(code: str, beg: str, end: str, klt: int = 101, fqt: int = 1) -> pd.DataFrame:'''功能获取k线数据-参数code : 6 位股票代码beg: 开始日期 例如 20200101end: 结束日期 例如 20200201klt: k线间距 默认为 101 即日kklt:1 1 分钟klt:5 5 分钟klt:101 日klt:102 周fqt: 复权方式不复权 : 0前复权 : 1后复权 : 2 '''EastmoneyKlines = {'f51': '日期','f52': '开盘','f53': '收盘','f54': '最高','f55': '最低','f56': '成交量','f57': '成交额','f58': '振幅','f59': '涨跌幅','f60': '涨跌额','f61': '换手率',}EastmoneyHeaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko','Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Referer': 'http://quote.eastmoney.com/center/gridlist.html',}fields = list(EastmoneyKlines.keys())columns = list(EastmoneyKlines.values())fields2 = ",".join(fields)secid = gen_secid(code)params = (('fields1', 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13'),('fields2', fields2),('beg', beg),('end', end),('rtntype', '6'),('secid', secid),('klt', f'{klt}'),('fqt', f'{fqt}'),)params = dict(params)base_url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get'url = base_url+'?'+urlencode(params)json_response: dict = requests.get(url, headers=EastmoneyHeaders).json()data = json_response.get('data')if data is None:if secid[0] == '0':secid = f'1.{code}'else:secid = f'0.{code}'params['secid'] = secidurl = base_url+'?'+urlencode(params)json_response: dict = requests.get(url, headers=EastmoneyHeaders).json()data = json_response.get('data')if data is None:print('股票代码:', code, '可能有误')return pd.DataFrame(columns=columns)klines = data['klines']rows = []for _kline in klines:kline = _kline.split(',')rows.append(kline)df = pd.DataFrame(rows, columns=columns)return dfif __name__ == "__main__":# 股票代码code = '600519'# 开始日期start_date = '20200101'# 结束日期end_date = '20201101'print(f'正在获取 {code} 从 {start_date} 到 {end_date} 的 k线数据......')# 根据股票代码、开始日期、结束日期获取指定股票代码指定日期区间的k线数据df = get_k_history(code, start_date, end_date)# 保存k线数据到表格里面df.to_csv(f'{code}.csv', encoding='utf-8-sig', index=None)print(f'股票代码:{code} 的 k线数据已保存到代码目录下的 {code}.csv 文件中')
示例代码 1 运行结果
- 屏幕输出
正在获取 600519 从 20200101 到 20201101 的 k线数据......
股票代码:600519 的 k线数据已保存到代码目录下的 600519.csv 文件中
- 生成一个表格文件(csv格式)
需求 2 描述
获取股票代码分别为 600519、300750 的这两只股票从 2020年1月1日 到 2020年11月1日 的k线数据并将数据保存到以股票代码命名的csv文件中
示例代码 2
from urllib.parse import urlencode
import pandas as pd
import requestsdef gen_secid(rawcode: str) -> str:'''生成东方财富专用的secidParameters----------rawcode : 6 位股票代码Return------str: 指定格式的字符串'''# 沪市指数if rawcode[:3] == '000':return f'1.{rawcode}'# 深证指数if rawcode[:3] == '399':return f'0.{rawcode}'# 沪市股票if rawcode[0] != '6':return f'0.{rawcode}'# 深市股票return f'1.{rawcode}'def get_k_history(code: str, beg: str, end: str, klt: int = 101, fqt: int = 1) -> pd.DataFrame:'''功能获取k线数据-参数code : 6 位股票代码beg: 开始日期 例如 20200101end: 结束日期 例如 20200201klt: k线间距 默认为 101 即日kklt:1 1 分钟klt:5 5 分钟klt:101 日klt:102 周fqt: 复权方式不复权 : 0前复权 : 1后复权 : 2 '''EastmoneyKlines = {'f51': '日期','f52': '开盘','f53': '收盘','f54': '最高','f55': '最低','f56': '成交量','f57': '成交额','f58': '振幅','f59': '涨跌幅','f60': '涨跌额','f61': '换手率',}EastmoneyHeaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko','Accept': '*/*','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Referer': 'http://quote.eastmoney.com/center/gridlist.html',}fields = list(EastmoneyKlines.keys())columns = list(EastmoneyKlines.values())fields2 = ",".join(fields)secid = gen_secid(code)params = (('fields1', 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13'),('fields2', fields2),('beg', beg),('end', end),('rtntype', '6'),('secid', secid),('klt', f'{klt}'),('fqt', f'{fqt}'),)params = dict(params)base_url = 'https://push2his.eastmoney.com/api/qt/stock/kline/get'url = base_url+'?'+urlencode(params)json_response: dict = requests.get(url, headers=EastmoneyHeaders).json()data = json_response.get('data')if data is None:if secid[0] == '0':secid = f'1.{code}'else:secid = f'0.{code}'params['secid'] = secidurl = base_url+'?'+urlencode(params)json_response: dict = requests.get(url, headers=EastmoneyHeaders).json()data = json_response.get('data')if data is None:print('股票代码:', code, '可能有误')return pd.DataFrame(columns=columns)klines = data['klines']rows = []for _kline in klines:kline = _kline.split(',')rows.append(kline)df = pd.DataFrame(rows, columns=columns)return dfif __name__ == "__main__":# 股票代码列表codes = ['600519','300750']# 开始日期start_date = '20200101'# 结束日期end_date = '20201101'for code in codes:print(f'正在获取 {code} 从 {start_date} 到 {end_date} 的 k线数据......')# 根据股票代码、开始日期、结束日期获取指定股票代码指定日期区间的k线数据df = get_k_history(code, start_date, end_date)# 保存k线数据到表格里面df.to_csv(f'{code}.csv', encoding='utf-8-sig', index=None)print(f'股票代码:{code} 的 k线数据已保存到代码目录下的 {code}.csv 文件中')
示例代码 2 运行结果
- 屏幕输出
正在获取 600519 从 20200101 到 20201101 的 k线数据......
股票代码:600519 的 k线数据已保存到代码目录下的 600519.csv 文件中
正在获取 300750 从 20200101 到 20201101 的 k线数据......
股票代码:300750 的 k线数据已保存到代码目录下的 300750.csv 文件中
- 在代码运行目录生成两个csv文件
- 表格内容展示(其中的一个表格)
写在最后
本篇文章展示了如何使用python获取并保存1只以及多只股票的历史日k线数据到表格文件中,当然代码不仅限于获取日k数据,诸如 5 分钟,1分钟等数据均是可以获取的,具体如何实现可以看代码里面的注释信息,这里不过多描述。实在搞不懂的可以私信我提供帮助。感谢大家阅读!
更加强大的版本在下面
顺手牵羊:免费、快速获取基金、股票、期货数据:基于我独立开发的 Python 库 efinance188 赞同 · 375 评论文章正在上传…重新上传取消
Python 获取股票K线数据相关推荐
- [股票预测]获取股票K线数据
目 录 2.2 获取K线函数get_k_data() 2.2.1获取最近一年K线数据 (1)数据集(XRHJ000598_OneYear.csv) (3)程序代码 2.2.2 获取指定时间段K线数据 ...
- Python绘制股票K线图
目录 1 股票K线图知识了解 2 用Python绘制股票K线图 2.1 安装绘制K线图的mpl_finance库 2.2 引入相关库 2.3 用Tushare库获取股票基本数据 2.4 日期格式调整及 ...
- pandas - 股票K线数据重采样
1 股票K线图 K线图这种图表源处于日本德川幕府时代,被当时日本米市的商人用来记录米市的行情与价格波动,后因其细腻独到的标画方式而被引入到股市及期货市场. 1.1 K线图基本形态 1.2 K线图的计算 ...
- 使用Python获取股票单日成交数据
本文主要介绍一个比较好的开源项目 Github:AKShare开源财经数据接口,该项目整合了各大财经网站的http接口:腾讯财经.新浪财经.网易财经.东财等....Github上介绍该项目是JetBr ...
- 使用Python生成股票K线图
可视化股票数据,这里只做简单的处理,只显示k线图.选取的是海通证券(600837)2020年1月1日之后150个交易日的数据.这里代码不多,没有封装成方法,代码如下.数据是提前获取的,获取方法见:使用 ...
- 太酷炫了,用python绘制股票K线图!
大家好,我是小五 发现大家还是最喜欢股票基金话题呀~ 那说到股票基金就不得不提--K线图! 那小五今天就带大家???? 用python来轻松绘制高颜值的K线图???? 获取股票交易数据 巧妇难为无米之 ...
- R语言 | 利用tushare获取股票k线、市值、换手率,市盈率等指标
作者的tushare ID:456548 作者在股市进行比较短线的投资,想开发一些高效的指标作为买卖的参考,于是需要k线.市值.换手率等数据进行研究,同花顺等软件上面大多数据不能导出,所以找到了tus ...
- 使用 Python 生成股票 K 线图
引言 在股票分析中,经常需要用到 K 线图来分析股票的价格波动情况和交易量情况.本文将介绍如何使用 Python 和 pyecharts 库生成股票 K 线图,并将其保存为 HTML 文件. 准备数据 ...
- 使用Python获取股票的报表数据
本文使用网易财经http接口获取股票的报表数据,包括主要财务指标.资产负债表.利润表.现金流表.获取股票数据请参考使用Python获取股票实时数据和历史数据. 网易财经http接口发回来的是csv文件 ...
最新文章
- Qt 事件处理和事件过滤器的返回值总结
- jquery版本冲突问题
- 阿里云 物联网产品架构
- Apache服务器的WSASocket failed to open the inherited socket错误
- ES学习笔记之-AvgAggregation的实现过程分析
- python详细安装教程3.8-python3.8下载及安装步骤详解
- C++运算符重载(成员函数方式)
- CodeIgniter2.0中sqlserver驱动返回受影响行数问题解决
- TreeMap方法源码
- 【转载】Linux下有趣的命令
- 数学 之 hdu 4861
- ajax请求携带tooken_9 HTMLJS等前端知识系列之Ajax post请求带有token向Django请求
- (45)Xilinx Counter IP核配置(六)(第9天)
- 阻止电脑自动安装软件_坡解版wetool 安装条件-购买-老友网
- idea java 桌面应用_IDEA打包应用程序的教程图解
- 使用envi对图像进行对比度拉伸并保存
- 双层板在哪层覆铜_2020年中国印制电路板行业发展现状及发展趋势预测(图)...
- EFResume - 一个普通的 Swift 简历模板
- office插件开发_OneKeyTools:强大PPT插件
- 编译原理-语法分析详解
热门文章
- 前端必备网站(纯手工输入)
- MATLAB 迷宫游戏
- 直接在服务器上跑系统,在服务器上跑代码
- 技嘉显卡性能测试软件,性能测试成绩总结_技嘉 GA-G1.Sniper B5_主板评测-中关村在线...
- 家用计算机长期不关机的后果,长时间不关机对电脑有什么影响
- LVGL 8.2.0 Stacked area chart
- 《拍拍二手》微信小程序开发经验谈
- C语言 随机数实现猜拳游戏
- Python邮件发送SMATP模块详细总结(含qq邮箱及163邮箱服务开启及授权码获取,多附件发送)
- AlignedReID: Surpassing Human-Level Performance in Person Re-Identification