最近一直在研究股票的形态,一些量化的东西,虽然量化听起来很高大上,通寻找到一个策略,通过程序的手段去找到这样一批股票,避免了人为的因素在其中。这样有个问题就是,程序选出来的股票太机械了,某个参数或条件设置的太紧或者太松,就会产生一定问题。又比如选出一个股票来,我想知道前期的走势是怎么样的,有哪些形态,是否处于底部盘整,光机械的设置条件肯定是不够的,这时候就需要我们去结合K线图以及MACD,成交量等指标作为辅助判断,而选出的股票数量如果较多的话,要一个个输入股票代码去查看,非常费时费力,因此,考虑自己写一个python的脚本,批量的画出K线图,这样在选股时候只需要一张张的翻阅就好,省去了很多琐碎的工作。

准备工作安装python环境(这个不必多说,能看到这篇文章的基本大家都有安装)

安装相应第三方依赖库matplotlib python重要的绘图库。

numpy 支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

Talib称“Technical Analysis Library”, 即技术分析库,是Python金融量化的高级库,涵盖了150多种股票、期货交易软件中常用的技术分析指标,如MACD、RSI、KDJ、动量指标、布林带等等。

pandas 基于numpy的一种工具,是为了解决数据分析任务而创建的,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。

mpl_finance python中可以用来画出蜡烛图、线图的分析工具,目前已经从matplotlib中独立出来,非常适合用来画K线

psycopg2(选用) python中用以和postgres数据库交互的第三方库,作者个人的数据都存储在postgres数据库中,因此使用这个模块。

数据准备数据来源于Tushare,一个免费好用的财经数据包,自己每日更新处理并加载到阿里云的服务器上(这里会为大家准备好数据进行使用)

import talib

import numpy as np

import psycopg2 as pg

import pandas as pd

import matplotlib.pyplot as plt

import matplotlib.gridspec as gridspec#分割子图

import mpl_finance as mpf

np.seterr(divide='ignore',invalid='ignore') # 忽略warning

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

fig = plt.figure(figsize=(20,12), dpi=100,facecolor="white") #创建fig对象

以上导入相关依赖包,并设置了一些参数变量

加载数据(文末提供数据)

# 加载数据

def query(sql):

conn = pg.connect(dbname="stocks", user="postgres", password="******", host="******", port="5432")

data = pd.read_sql(sql,conn)

conn.close()

return data

ts_code = '000001.SZ' #股票代码

name = '平安银行'

df_stockload = query("select trade_date,open,high,low,close,vol from pro_bar

where ts_code = '{}' and trade_date>='20190801'".format(ts_code))

df_stockload['trade_date'] = pd.to_datetime(df_stockload['trade_date'])

df_stockload=df_stockload.set_index('trade_date')

以上代码定义了一个query函数,使用pandas的readsql来加载数据库中数据,并将tarde_date设置为datetime格式,并设置为索引。

具体字段有trade_date:交易日期

open:开盘价格

high:当日最高价

low:当日最低价

close:当日收盘价

vol:成交量

数据的结构形式

绘图

设置四个绘图区域 包括 K线(均线),成交量,MACD,KDJ

gs = gridspec.GridSpec(4, 1, left=0.08, bottom=0.15, right=0.99, top=0.96, wspace=None, hspace=0, height_ratios=[3.5,1,1,1])

graph_KAV = fig.add_subplot(gs[0,:])

graph_VOL = fig.add_subplot(gs[1,:])

graph_MACD = fig.add_subplot(gs[2,:])

graph_KDJ = fig.add_subplot(gs[3,:])

绘制K线图(以及均线)

#绘制K线图

mpf.candlestick2_ochl(graph_KAV, df_stockload.open, df_stockload.close, df_stockload.high, df_stockload.low, width=0.5,

colorup='r', colordown='g') # 绘制K线走势

#绘制移动平均线图

df_stockload['Ma5'] = df_stockload.close.rolling(window=5).mean()#pd.rolling_mean(df_stockload.close,window=20)

df_stockload['Ma10'] = df_stockload.close.rolling(window=10).mean()#pd.rolling_mean(df_stockload.close,window=30)

df_stockload['Ma20'] = df_stockload.close.rolling(window=20).mean()#pd.rolling_mean(df_stockload.close,window=60)

df_stockload['Ma30'] = df_stockload.close.rolling(window=30).mean()#pd.rolling_mean(df_stockload.close,window=60)

df_stockload['Ma60'] = df_stockload.close.rolling(window=60).mean()#pd.rolling_mean(df_stockload.close,window=60)

graph_KAV.plot(np.arange(0, len(df_stockload.index)), df_stockload['Ma5'],'black', label='M5',lw=1.0)

graph_KAV.plot(np.arange(0, len(df_stockload.index)), df_stockload['Ma10'],'green',label='M10', lw=1.0)

graph_KAV.plot(np.arange(0, len(df_stockload.index)), df_stockload['Ma20'],'blue',label='M20', lw=1.0)

graph_KAV.plot(np.arange(0, len(df_stockload.index)), df_stockload['Ma30'],'pink', label='M30',lw=1.0)

graph_KAV.plot(np.arange(0, len(df_stockload.index)), df_stockload['Ma60'],'yellow',label='M60', lw=1.0)

# 添加网格

graph_KAV.grid()

graph_KAV.legend(loc='best')

graph_KAV.set_title(ts_code + ' ' + name)

graph_KAV.set_ylabel(u"价格")

graph_KAV.set_xlim(0, len(df_stockload.index)) # 设置一下x轴的范围绘制成交量图

#绘制成交量图

graph_VOL.bar(np.arange(0, len(df_stockload.index)), df_stockload.vol,color=['g' if df_stockload.open[x] > df_stockload.close[x] else 'r' for x in range(0,len(df_stockload.index))])

graph_VOL.set_ylabel(u"成交量")

graph_VOL.set_xlim(0,len(df_stockload.index)) #设置一下x轴的范围

graph_VOL.set_xticks(range(0,len(df_stockload.index),15))#X轴刻度设定 每15天标一个日期绘制MACD

#绘制MACD

macd_dif, macd_dea, macd_bar = talib.MACD(df_stockload['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)

graph_MACD.plot(np.arange(0, len(df_stockload.index)), macd_dif, 'red', label='macd dif') # dif

graph_MACD.plot(np.arange(0, len(df_stockload.index)), macd_dea, 'blue', label='macd dea') # dea

bar_red = np.where(macd_bar > 0, 2 * macd_bar, 0)# 绘制BAR>0 柱状图

bar_green = np.where(macd_bar < 0, 2 * macd_bar, 0)# 绘制BAR<0 柱状图

graph_MACD.bar(np.arange(0, len(df_stockload.index)), bar_red, facecolor='red')

graph_MACD.bar(np.arange(0, len(df_stockload.index)), bar_green, facecolor='green')

graph_MACD.legend(loc='best',shadow=True, fontsize ='10')

graph_MACD.set_ylabel(u"MACD")

graph_MACD.set_xlim(0,len(df_stockload.index)) #设置一下x轴的范围

graph_MACD.set_xticks(range(0,len(df_stockload.index),15))#X轴刻度设定 每15天标一个日期

这里要注意 talib中计算得到的macd并没有×2,需要在计算后的macd×2绘制KDJ

#绘制KDJ

df_stockload['K'], df_stockload['D'] = talib.STOCH(df_stockload.high.values, df_stockload.low.values, df_stockload.close.values,\

fastk_period=9, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)

df_stockload['J'] = 3 * df_stockload['K'] - 2 * df_stockload['D']

graph_KDJ.plot(np.arange(0, len(df_stockload.index)), df_stockload['K'], 'blue', label='K') # K

graph_KDJ.plot(np.arange(0, len(df_stockload.index)), df_stockload['D'], 'g--', label='D') # D

graph_KDJ.plot(np.arange(0, len(df_stockload.index)), df_stockload['J'], 'r-', label='J') # J

graph_KDJ.legend(loc='best', shadow=True, fontsize='10')

graph_KDJ.set_ylabel(u"KDJ")

graph_KDJ.set_xlabel("日期")

graph_KDJ.set_xlim(0, len(df_stockload.index)) # 设置一下x轴的范围

graph_KDJ.set_xticks(range(0, len(df_stockload.index), 15)) # X轴刻度设定 每15天标一个日期

graph_KDJ.set_xticklabels(

[df_stockload.index.strftime('%Y-%m-%d')[index] for index in graph_KDJ.get_xticks()]) # 标签设置为日期修饰图片

# X-轴每个ticker标签都向右倾斜45度

for label in graph_KAV.xaxis.get_ticklabels():

label.set_visible(False)

for label in graph_VOL.xaxis.get_ticklabels():

label.set_visible(False)

for label in graph_MACD.xaxis.get_ticklabels():

label.set_visible(False)

for label in graph_KDJ.xaxis.get_ticklabels():

label.set_rotation(45)

label.set_fontsize(10) # 设置标签字体保存图片

plt.savefig('Kline.jpg')

最终的成果图

数据

提取码:wmvf

提示:这是一个excel文件:直接用pandas中的pd.read_excel()就可完整加载

python k线图_如何用python画K线图(成交量+MACD+KDJ)相关推荐

  1. python 相似形态 股票_如何用Python量化“相似K线”实现形态选股?

    导读:"历史会重演"是技术分析的三大假设之一,市场行为与投资者心理有着千丝万缕的联系.比如价格形态,它们通过一些特定的价格图表形状表现出来,而这些图形表示了人们对某市场看好或看淡的 ...

  2. 怎么用python读取excel图_如何用Python读取Excel中图片?

    公众号: 早起Python 作者:刘早起 大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进 ...

  3. python 矩阵运算 for循环_如何用 Python 科学计算中的矩阵替代循环

    展开全部 因为在Mathematica中使用循环确实是低效的.32313133353236313431303231363533e78988e69d8331333361313961..... 深层次的原 ...

  4. python 可视化大屏幕_如何用python搭建可视化看板?

    可视化看板是指大屏 驾驶舱 dashboard这些吗,如果是,那不建议用python来做,不专业,目前没有见过哪个项目上的大屏是用python做的,它不是万能的 大屏的制作一般是这样的 先根据用户的需 ...

  5. python 读取excel图片_如何用Python读取Excel中图片?

    公众号: 早起Python 作者:刘早起 大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进 ...

  6. python如何开发网站_如何用Python写一个小网站?

    一.准备 python基础相关准备:pygame的基础知识,参考目光博客的"用Python和Pygame写游戏-从入门到精通"安python 3.8.0 在python官网下载,不 ...

  7. python编程代码画画_如何用python编写一个绘制马赛克图像的自写程序

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 这篇教程将会展示如何用python的图形化包"Pygame"和基础的文件I/O来创建一 ...

  8. python 登陆淘宝_如何用 Python 自动登录淘宝并保存登录信息?

    原标题:如何用 Python 自动登录淘宝并保存登录信息? 作者 | 猪哥 责编 | 伍杏玲 前段时间时间为大家讲解了如何使用requests库模拟登录淘宝,而今天我们将对该功能进行丰富.所以我们把之 ...

  9. python搭建自动化测试平台_如何用python语言搭建自动化测试环境

    原标题:如何用python语言搭建自动化测试环境 技术分享:基于Python语言的Web自动化测试环境搭建 近期发现很多初学者在学习自动化的过程当中,在环境安装环节总是出现问题,所以详细的出一篇环境搭 ...

最新文章

  1. SQL Server (MSSQLSERVER) 服务因 2148081668 服务性错误而停止。
  2. 听障人士的“有声桥梁”:百度智能云曦灵-AI手语平台发布
  3. 好的架构是有价值观的
  4. 工作三年的Android程序员 跳槽到“阿里“的面试经验分享
  5. ubuntu18.04安装python3_在 Ubuntu 18.04 上安装 Python 3.7
  6. cp 过程中目录突然挂了_怎么解决管材激光切割机切管过程中出现的过烧及挂渣...
  7. javaScript一种优化模式-初始化时分支
  8. 实现机器学习的循序渐进指南X——KMeans
  9. 【转】IT从业人员必看的10个论坛
  10. 红外激光测距模块功能简述
  11. 构建WebIM聊天程序
  12. TFS2010的生成功能
  13. 动态IP和静态IP有什么区别?
  14. banner定制网站
  15. Tomcat 支持的Java版本对照
  16. 破解并修复VoLTE:利用隐藏的数据通道和错误的实现方式
  17. 数学建模:9 多元线性回归分析
  18. 离均差oracle 函数,Oracle入门到精通
  19. Android SwipeLayout实现界面滑动布局
  20. 国产deepin深度操作系统20.2.3 发布

热门文章

  1. Java日记_17.9.01——点击按钮后,键盘监听失效的原因与解决办法
  2. Fluent计算出现浮点异常的原因及解决办法
  3. wifi下如何两台电脑如何共享共享
  4. KMP_??_!!!_~~
  5. SecureCRT中的下载、上传命令
  6. 黄浩老师cpp平时作业(十三)圆形正方形类 运算符重载组合类圆和点(排序与查找题目重复)
  7. Unity 导航寻路快速上手
  8. pp助手服务器开小差,无法连接game center服务器通信的处理方法
  9. 年薪33-48万澳元起|澳门大学智慧城市物联网实验室招博后研究员
  10. Django Model 2.数据库—多表查询