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