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

        关于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格力的数据,需要下载其他的,将股票代码替换就可以了。

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

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

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

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

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 data
	
stockCode='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 datetime

plt.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)#日期转成类型
    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()

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

 其中有日期转换被注释的一行,在这里顺带讲解下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:10

strftime:将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 sleep

def 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()#或使用xpath
        print(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)

你可能感兴趣的:(Python,python,pycharm)