Python画图实战之画K线图【附带自动下载股票数据】

article/2025/10/28 20:39:54

        关于Python画图的基本知识可以先查看下面这篇文章Python画图(直方图、多张子图、二维图形、三维图形以及图中图)https://blog.csdn.net/weixin_41896770/article/details/119798960

         对于股民来说,K线图是最常见的一种参考,使用Python来画比较简单,主要会使用到几个比较常见的库:matplotlib、pandas、mplfinance、cycler,如果缺少这些库的就分别安装即可,主要是注意版本问题!
平时我使用Jupyter比较多,这个安装有点不一样,需要在最前面加一个叹号!

!pip install mplfinance
查看python版本的方式也不一样
import sys
!{sys.executable} --version

在画图之前,需要股票的历史数据,这些可以免费获取,很多财经网站都有提供,这里是来自网易的数据,000651格力的数据,需要下载其他的,将股票代码替换就可以了。

 单纯的K线图,使用到四个指标就OK了,也就是所谓的OHLC(开盘价、最高价、最低价、收盘价)这里还加一个成交量图,就需要一个成交量的指标

 

import os
os.chdir('D:\Anaconda3\TONYTEST')
import mplfinance as mpf
import matplotlib as mpl
from cycler import cycler
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']#界面可带中文
plt.rcParams['axes.unicode_minus'] = False#正常显示负号def getData(sname):'''获取股票数据,返回的数据类型是pandas.core.frame.DataFrame'''data=pd.read_csv(sname+'.csv',encoding='gb2312')#有中文,需注意data.rename(columns={'日期':'Date','开盘价':'Open','最高价':'High','最低价':'Low','收盘价':'Close','成交量':'Volume'},inplace=True)#把中文改英文data=data[['Date','Open','High','Low','Close','Volume']]#选取需要的列data['Date']=pd.to_datetime(data['Date'])data.set_index(['Date'],inplace=True)#将日期设置为索引data=data.sort_index()#日期升序#data.index=pd.DatetimeIndex(data.index)return datastockCode='000651'
stockData=getData(stockCode)[:100]
#mpf.plot(stockData,type='candle',volume=True)#默认黑白
#plt.show()
print(stockData)
kwargs=dict(type='candle',mav=(7,30,60),volume=True,title=stockCode+'的K线图',ylabel='股票价格',ylabel_lower='成交量',figratio=(15,10),figscale=5)
mc=mpf.make_marketcolors(up='red',down='green',edge='i',wick='i',volume='in',inherit=True)
mpfStyle=mpf.make_mpf_style(gridaxis='both',gridstyle='--',y_on_right=False,marketcolors=mc,rc={'font.family': 'SimHei'})
mpl.rcParams['axes.prop_cycle']=cycler(color=['dodgerblue', 'deeppink', 'navy', 'teal', 'maroon', 'darkorange', 'indigo'])
mpl.rcParams['lines.linewidth']=.5
mpf.plot(stockData,**kwargs,style=mpfStyle,show_nontrading=False)plt.show()

在这个过程中可能会遇到版本问题,本人由于pandas库的版本低了,出现了如下错误

AttributeError: module 'pandas.core' has no attribute 'indexes'

  File "D:\Anaconda3\lib\site-packages\mplfinance\plotting.py", line 298, in plot
    dates,opens,highs,lows,closes,volumes = _check_and_prepare_data(data, config)
  File "D:\Anaconda3\lib\site-packages\mplfinance\_arg_validators.py", line 29, in _check_and_prepare_data
    if not isinstance(data.index,pd.core.indexes.datetimes.DatetimeIndex):
AttributeError: module 'pandas.core' has no attribute 'indexes'

raise TypeError('Expect data.index as DatetimeIndex')

所以各位在使用的时候可以先查看下版本:pd.__version__ 
最直接的解决办法就是下载安装 pandas · PyPI 查看python版本来下载对应的pandas版本,不同的版本下载下来也安装不了,这个需要注意,因为本人的python是3.6.0所以就下载cp36的

pip install pandas-1.1.3-cp36-cp36m-win_amd64.whl

安装的时候发现python版本低了,需要>=3.6.1的版本,于是下载3.6.1版本的python安装就解决了

还有一种方法,看起来简单些,和上面有些许出入,也单单只画出蜡烛图:

from matplotlib import pyplot as plt
import mplfinance as mpf
from mplfinance.original_flavor import candlestick_ohlc
from matplotlib.pylab import date2num
import pandas as pd
import datetimeplt.rcParams['font.sans-serif'] = ['SimHei']#界面可带中文
plt.rcParams['axes.unicode_minus'] = False#正常显示负号dataList=[]
data=pd.read_csv('000651.csv',encoding='gb2312')
#print(data[['开盘价','最高价']])
#取20条数据,返回类似如下结果
#[(18908.0, 38.88, 39.96, 38.37, 39.81), (18900.0, 39.29, 39.46, 38.73, 38.75), (18899.0, 38.82, 39.6, 38.46, 39.3)]
for row in range(50):sdate=data.loc[row,"日期"]#pdate=datetime.datetime.strptime(data.loc[row,"日期"],'%Y-%m-%d')#按格式将字符串转成日期类型pdate=pd.to_datetime(sdate)#直接转换成日期类型fdate=date2num(pdate)#日期转成<class 'numpy.float64'>类型O=data.loc[row,'开盘价']H=data.loc[row,'最高价']L=data.loc[row,'最低价']C=data.loc[row,'收盘价']OHLC_data=(fdate,O,H,L,C)#OHLC形式的元组数据结构dataList.append(OHLC_data)fig,ax=plt.subplots(facecolor=(0.5,0.5,0.5),figsize=(12,8))
fig.subplots_adjust(bottom=0.2)
ax.xaxis_date()
plt.xticks(rotation=30)#横坐标的记号旋转30度
plt.title(data['名称'][0])
plt.xlabel('日期')
plt.ylabel('股价')
candlestick_ohlc(ax,dataList,width=0.6,colorup='red',colordown='green')
plt.grid(True)
plt.show()

 其中有日期转换被注释的一行,在这里顺带讲解下strptime和strftime的区别

strptime:将str字符串类型转化为datetime.datetime日期时间类型t=datetime.datetime.today()#2021-10-25 08:21:10.290509
t=str(t)#必须是字符串形式
dt=datetime.datetime.strptime(t,"%Y-%m-%d %H:%M:%S.%f")#格式要个字符串保持一致
print(dt)#2021-10-25 08:21:10.290509
再比如
t1='2021年10月25日 08:21:10'#字符串
t1=datetime.datetime.strptime(t1,"%Y年%m月%d日 %H:%M:%S")
print(t1)#2021-10-25 08:21:10strftime:将datetime.datetime日期时间类型转化为str字符串格式
n=datetime.datetime.now()
s=datetime.datetime.strftime(n,'%Y%m%d%H%M%S')
print(s)#20211025083818

最后一个附带的福利:

下载股票历史数据,如果是大量经常下载,那就使用Selenium自动化操作,安装和使用的基础知识可以参阅下面这篇文章Selenium 自动测试软件的使用(自动化操作)https://blog.csdn.net/weixin_41896770/article/details/115610884

直接上代码,想下载什么股票,把里面的股票代码进行替换与增加即可,高效且不出错

from selenium import webdriver
from time import sleepdef downloadStockData(stocks):for s in stocks:stockUrl='http://quotes.money.163.com/trade/lsjysj_'+s+'.html'browser.get(stockUrl)browser.find_element_by_id("downloadData").click()browser.find_element_by_name('date_start_value').clear()#先清除再赋值browser.find_element_by_name('date_end_value').clear()browser.find_element_by_name('date_start_value').send_keys("2020-10-10")browser.find_element_by_name('date_end_value').send_keys("2021-10-10")browser.find_element_by_css_selector(".blue_btn.submit").click()#多个类的情况#browser.find_element_by_xpath("//a[@class='blue_btn submit']").click()#或使用xpathprint(s+"完成!")mydriver = 'E:\MyChromeDriver\chromedriver.exe'
option = webdriver.ChromeOptions()
option.add_experimental_option("detach", True)#浏览器不退出
option.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome(executable_path = mydriver,options=option)
browser.set_window_size(1200,600)
stockCodes=['000651','002415','601857','601398','601939','601012','601669','002594','002714']
downloadStockData(stockCodes)

http://chatgpt.dhexx.cn/article/JHosgn5o.shtml

相关文章

一步一步教你写股票走势图——K线图二(图表联动)

目录 一步一步教你写股票走势图——分时图一&#xff08;概述&#xff09; 一步一步教你写股票走势图——分时图二&#xff08;自定义xy轴&#xff09; 一步一步教你写股票走势图——分时图三&#xff08;对齐图表、自定义柱状图高亮&#xff09; 一步一步教你写股票走势图…

如何对走势图进行画线分析

现货黄金投资入门与技巧&#xff0c;如何都绕不开这个问题&#xff0c;那就是画线分析。画线分析是技术分析一个重要的流派&#xff0c;也是我们分析市场必不可少的手段&#xff0c;掌握画线的方法&#xff0c;对我们掌握现货黄金投资入门与技巧有很大的帮助。 一、支撑线和压力…

使用Python绘制精美绝伦的股票行情K线图

PythonPyQt2.74 本文简单介绍了如何从Tushare获取某支股票的价格数据&#xff0c;并根据价格数据画出相应的日K线图。 # -*- coding: utf-8 -*-import sys import talib import numpy as np import pandas as pd import tushare as ts import datetime as dt import pyqtgraph …

缠论 公式 自动画线 画笔 中枢 买卖点 源代码

显示效果 跨级别区间套演示 板块演示 个股演示 期货演示 源码如下&#xff1a; {三角形中枢}时间:4;A:HHHV(H,时间*5) AND HHV(H,时间*5)>REF(HHV(H,时间*5),1);B:LLLV(L,时间*5) AND LLV(L,时间*5)<REF(LLV(L,时间*5),1);CC1:DRAWLINE(A,H,B,L,0);CC2:DRAWLINE(B,L,A,H…

利用 python numpy +matplotlib 绘制股票k线图

一、python numpy matplotlib 画股票k线图 # -- coding: utf-8 -- import requests import numpy as np from matplotlib import pyplot as plt from matplotlib import animationfig plt.figure(figsize(8,6), dpi72,facecolor"white") axes plt.subplot(1…

一步一步教你写股票走势图——K线图三(添加均线)

目录 一步一步教你写股票走势图——分时图一&#xff08;概述&#xff09; 一步一步教你写股票走势图——分时图二&#xff08;自定义xy轴&#xff09; 一步一步教你写股票走势图——分时图三&#xff08;对齐图表、自定义柱状图高亮&#xff09; 一步一步教你写股票走势图…

[逐笔数据分析工具分享]如何分析股票逐笔数据

工具分享链接&#xff1a;https://pan.baidu.com/s/1fbDoPM2NzSBEn31gDBZnpQ 提取码&#xff1a;v0sm ​1. 配置stocklist.txt和datelist.txt stocklist为要分析的股票号码&#xff0c;可为任意个 datelist为要分析的日期&#xff0c;可为任意个 以上都为空时&#xff0c;则…

【K线绘图】教你用python绘制带有买卖点的股票K线图(附送鳄鱼指标、顾比均线指标、dataframe格式化输出)

提示&#xff1a;文章内买卖点不构成交易依据&#xff0c;请根据情况自行决策。 教你用python绘制带有买卖点的股票K线图&#xff08;附带鳄鱼指标、顾比均线指标、dataframe格式化输出&#xff09; 前言一、自己绘图&#xff0c;是不是疯了&#xff1f;二、分步说明1. 准备工作…

股票K线图绘制

股票K线图绘制 文章目录 股票K线图绘制前言一、股票K线图基础知识二、用Python绘制股票K线图总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都…

屏幕画笔工具Pointofix,期货/股票复盘分析画线好工具

工具介绍&#xff1a; Pointofix可以将K线图表定格在屏幕某一个画面上&#xff0c;然后可以使用工具趋势线、图形&#xff0c;放大某个细节等&#xff0c;是一款很好的复盘分析画线工具。 Pointofix使用功能&#xff1a; 1.高亮屏幕&#xff1a;手绘笔&#xff1b; 2.直线&…

解决一个信号6问题(sig6,signal6,SIGABRT,double free or corruption (!prev))

我遇到的信号6 99%都是由于数据越界导致&#xff0c;在memcpy的时候没有错误&#xff0c;在free的时候系统报SIGABRT。今天也不例外。代码是我写的&#xff0c;考虑不周&#xff0c;以后拷贝更多加小心。 上图中的data大小为1024&#xff0c;如果memcpy 1025各字节&#xff0c;…

Thread 1:Program received signal:SIGABRT错误之一

引起错误Thread 1:Program received signal:"SIGABRT"的可能情况很多 本文描述的是使用Tab Bar Controller时Tab Bar Item对应的View Controller在Attributes inspector中的NIB NAME与在identity inspector中的class设置的不对应引起的。 如图&#xff08;图片可能…

Thread 1: signal SIGABRT问题解决

解决办法是记住先前的操作&#xff0c;找到相关问题原因&#xff0c;比如控件关联。 如图打开 Show the Connections inspector把相关联的Outlet叉掉&#xff1a; 猜测&#xff1a;Thread 1: signal SIGABRT类型的错误&#xff0c;是某种具体的内部关联引发的错误&#xff0c…

Android异常之SIGABRT

欢迎关注WX公众号&#xff1a; Android开发时出现这样的报错信息&#xff1a; # unknown(29937)SIGABRT #00 pc 0004a124 /system/lib/libc.so (tgkill12) [armeabi-v7a] 2 #01 pc 000478c3 /system/lib/libc.so (pthread_kill34) [armeabi-v7a] 3 #02 pc 0001d525 /system/li…

SIGABRT错误的解决办法

本人原创&#xff0c;转载请注明出处&#xff1a;http://iphone.xiaoxiaostudio.net 在iPhone开发中可能经常会遇到 SIGABRT 错误&#xff0c;我开始也不知道如何调试SIGABRT这个错误&#xff0c;每次都是不断的尝试&#xff0c;最后在stackoverflow找到了方法&#xff0c;整理…

SIGKILL和SIGTERM、SIGINT

如果不对信号处理&#xff0c;就会导致程序退出&#xff0c;但如果程序捕获信号进行处理&#xff0c;按照它的逻辑&#xff0c;它是不一定会退出的。 在这三个信号中&#xff0c;sigkill是不能被捕获的&#xff0c;程序收到这个信号后&#xff0c;一定会退出。这就是kill -9一…

C++ signal信号(SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTRAP、SIGABRT等等的说明)

转载来自&#xff1a;https://blog.csdn.net/u014470361/article/details/83591513 SIGHUP /* hangup */ ~~~~~~ SIGHUP&#xff0c;hong up &#xff0c;挂断。本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各…

Fatal signal 6 (SIGABRT), code 0 (SI_USER) in tid 2377 (Thread-2), pid 2335

app 运行报错 解决: 选择菜单&#xff1a;File->Settings->Build,Execution,Deployment->Instant Run&#xff0c;将右侧的顶部复选框关闭即可。

linux——signal信号(SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTR

SIGHUP /* hangup */ SIGHUP&#xff0c;hong up &#xff0c;挂断。本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。 登录Linux时&#xff0c;系统会分配给登录…

linux——signal信号(SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTRAP、SIGABRT...........................)

SIGHUP /* hangup */ ~~~~~~ SIGHUP&#xff0c;hong up &#xff0c;挂断。本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。 ~~~~~~ 登录Linux时&#xff0c;系统会分配给登录用户…