目录

  • talib提供给我们的K线形态
  • pyqt5绘制K线图

talib提供给我们的K线形态

在前面的博文中,我们介绍了talib提供给我们的6种K形态。不过,那只是博主通过讲解一部分,让大家认识如何使用talib区分K线,其实talib提供给我们的K线形态函数一共44个。那么如果通过软件进行标记呢?

其实在众多的股票交易软件中,并不会主动给我们标记K线形态数据,而且K线形态这么多,哪怕程序员记下来恐怕也无能为力。所以,我们需要使用pyqt5设计界面给我们标记K线形态,并提示使用者那种K线预示涨,哪些K线预示跌。

这里,我们首先需要使用python的反射来完成用户的切换,不然通过ifelse语句一句一句去区分调用,完全是重复的代码劳动,得不偿失。具体反射使用以及K线绘图方式如下:

import talib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import mpl_finance as mpf
from matplotlib import gridspecclass KMplCanvas(FigureCanvas):def __init__(self, parent=None, width=5, height=4, dpi=100):plt.rcParams['font.sans-serif'] = ['SimHei']self.fig = Figure(figsize=(width, height), dpi=dpi)FigureCanvas.__init__(self, self.fig)spec = gridspec.GridSpec(4, 1, height_ratios=[3, 1, 1, 1])self.ax1 = self.fig.add_subplot(spec[0])self.ax2 = self.fig.add_subplot(spec[1])self.ax3 = self.fig.add_subplot(spec[2])self.ax4 = self.fig.add_subplot(spec[3])self.setParent(parent)self.k_text = ['十字星', '两只乌鸦', '三只乌鸦', '三内部上涨和下跌', '三线打击','三外部上涨和下跌', '南方三星', '三个白兵', '弃婴', '大敌当前','捉腰带线', '脱离', '收盘缺影线', '藏婴吞没', '反击线', '乌云压顶', '蜻蜓十字/T形十字', '吞噬模式', '十字暮星', '暮星','向上/下跳空并列阳线', '墓碑十字/倒T十字', '锤头', '上吊线', '母子线','十字孕线', '风高浪大线', '陷阱', '修正陷阱', '家鸽','三胞胎乌鸦', '颈内线', '倒锤头', '反冲形态', '由较长缺影线决定的反冲形态','停顿形态', '条形三明治', '探水竿', '跳空并列阴阳线', '插入','三星', '奇特三河床', '向上跳空的两只乌鸦', '上升/下降跳空三法']FigureCanvas.updateGeometry(self)def start_staict_plot(self, df, method="CDLDOJISTAR", numb=0):self.ax1.clear()self.ax2.clear()self.ax3.clear()self.ax4.clear()self.fig.canvas.draw_idle()mytalib = talibf = getattr(mytalib, method)df['date'] = pd.to_datetime(df['date'])df['date'] = df['date'].apply(lambda x: x.strftime('%Y-%m-%d'))mpf.candlestick2_ochl(self.ax1, df["open"], df["close"], df["high"], df["low"], width=0.6, colorup='r',colordown='green',alpha=1.0)df['star'] = f(df['open'].values, df['high'].values, df['low'].values, df['close'].values)pattern = df[(df['star'] == 100) | (df['star'] == -100)]for key, val in df.items():for index, today in pattern.iterrows():x_posit = df.index.get_loc(index)self.ax1.annotate("{}\n{}".format(self.k_text[numb], today["date"]), xy=(x_posit, today["high"]),xytext=(0, pattern["close"].mean()), xycoords="data",fontsize=8, textcoords="offset points",arrowprops=dict(arrowstyle="simple", color="r"))df["SMA5"] = df["close"].rolling(5).mean()df["SMA10"] = df["close"].rolling(10).mean()df["SMA30"] = df["close"].rolling(30).mean()df["SMA60"] = df["close"].rolling(60).mean()self.ax1.plot(np.arange(0, len(df)), df['SMA5'], label="5日均线")  # 绘制5日均线self.ax1.plot(np.arange(0, len(df)), df['SMA10'], label="10日均线")  # 绘制10日均线self.ax1.plot(np.arange(0, len(df)), df['SMA30'], label="30日均线")  # 绘制30日均线self.ax1.plot(np.arange(0, len(df)), df['SMA60'], label="60日均线")  # 绘制30日均线self.ax1.legend()red_pred = np.where(df["close"] > df["open"], df["volume"], 0)blue_pred = np.where(df["close"] < df["open"], df["volume"], 0)self.ax2.bar(np.arange(0, len(df)), red_pred, facecolor="red")self.ax2.bar(np.arange(0, len(df)), blue_pred, facecolor="blue")self.ax2.set(ylabel=u"成交量")low_list = df["close"].rolling(9, min_periods=1).min()high_list = df["high"].rolling(9, min_periods=1).max()rsv = (df["close"] - low_list) / (high_list - low_list) * 100df["K"] = rsv.ewm(com=2, adjust=False).mean()df["D"] = df["K"].ewm(com=2, adjust=False).mean()df["J"] = 3 * df["K"] - 2 * df["D"]self.ax3.plot(df["date"], df["K"], label="K")self.ax3.plot(df["date"], df["D"], label="D")self.ax3.plot(df["date"], df["J"], label="J")self.ax3.legend()self.ax3.set(ylabel=u"KDJ")EMA1 = df["close"].ewm(span=12, adjust=False).mean()EMA2 = df["close"].ewm(span=26, adjust=False).mean()DIF = EMA1 - EMA2DEA = DIF.ewm(span=9, adjust=False).mean()BAR = 2 * (DIF - DEA)red_bar = np.where(BAR > 0, BAR, 0)blue_bar = np.where(BAR < 0, BAR, 0)self.ax4.plot(np.arange(0, len(df)), DIF)self.ax4.plot(np.arange(0, len(df)), DEA)self.ax4.bar(np.arange(0, len(df)), red_bar, color="red")self.ax4.bar(np.arange(0, len(df)), blue_bar, color="blue")self.ax4.set(ylabel=u"MACD")self.ax1.xaxis.set_major_locator(ticker.MaxNLocator(9))def format_date(x, pos=None):if x < 0 or x > len(df['date']) - 1:return ''return df['date'][int(x)]self.ax1.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))self.ax1.grid(True)plt.setp(self.ax1.get_xticklabels(), visible=True)plt.setp(self.ax2.get_xticklabels(), visible=False)plt.setp(self.ax3.get_xticklabels(), visible=False)plt.setp(self.ax4.get_xticklabels(), visible=False)plt.setp(plt.gca().get_xticklabels(), rotation=45, horizontalalignment='right')

这里,我们通过getattr函数,将talib库赋值给它。然后,只需要通过方法名就可以切换K线形态数据。这里博主为了简便,没有将文本数据单独设置为全局变量,在实际的开发中,还是要将其独立,免得重复copy造成代码混乱。

pyqt5绘制K线图

如上面代码所示,我们不仅仅绘制了K线图,而且还绘制了成交量,KDJ,以及MACD,这里对比起来看某个股票往往更具有参考价值。那么界面的代码如下所示:

class MyFrom(QMainWindow):# K线模块def init_kTab(self):self.grid_k = QGridLayout()self.grid_k.setSpacing(5)k_text = ['十字星', '两只乌鸦', '三只乌鸦', '三内部上涨和下跌', '三线打击','三外部上涨和下跌', '南方三星', '三个白兵', '弃婴', '大敌当前','捉腰带线', '脱离', '收盘缺影线', '藏婴吞没', '反击线', '乌云压顶', '蜻蜓十字/T形十字', '吞噬模式', '十字暮星', '暮星','向上/下跳空并列阳线', '墓碑十字/倒T十字', '锤头', '上吊线', '母子线','十字孕线', '风高浪大线', '陷阱', '修正陷阱', '家鸽','三胞胎乌鸦', '颈内线', '倒锤头', '反冲形态', '由较长缺影线决定的反冲形态','停顿形态', '条形三明治', '探水竿', '跳空并列阴阳线', '插入','三星', '奇特三河床', '向上跳空的两只乌鸦', '上升/下降跳空三法']self.k_content = ['预示着当前趋势反转', '预示股价下跌', '预示股价下跌', '预示着股价上涨', '预示股价下跌','预示着股价上涨', '预示下跌趋势反转,股价上升', '预示股价上升', '预示趋势反转,发生在顶部下跌,底部上涨', '预示股价下跌', '收盘价接近最高价,预示价格上涨', '预示价格上涨', '预示着趋势持续', '预示着底部反转', '预示趋势反转', '预示着股价下跌', '预示趋势反转', '预示趋势反转', '预示顶部反转', '预示顶部反转','趋势持续', '预示底部反转', '处于下跌趋势底部,预示反转', '处于上升趋势的顶部,预示着趋势反转', '预示趋势反转,股价上升','预示着趋势反转', '预示着趋势反转', '趋势继续', '趋势继续', '预示着趋势反转','预示价格下跌', '预示着下跌继续', '在下跌趋势底部,预示着趋势反转', '存在跳空缺口', '与反冲形态类似,较长缺影线决定价格的涨跌','预示着上涨结束', '预示着股价上涨', '预示趋势反转', '上升趋势持续', '预示着趋势持续','预示着趋势反转', '收盘价不高于第二日收盘价,预示着反转,第二日下影线越长可能性越大', '预示股价下跌', '收盘价高于第一日收盘价,预示股价上升']self.K_method = ['CDLDOJISTAR', 'CDL2CROWS', 'CDL3BLACKCROWS', 'CDL3INSIDE', 'CDL3LINESTRIKE','CDL3OUTSIDE', 'CDL3STARSINSOUTH', 'CDL3WHITESOLDIERS', 'CDLABANDONEDBABY', 'CDLADVANCEBLOCK','CDLBELTHOLD', 'CDLBREAKAWAY', 'CDLCLOSINGMARUBOZU', 'CDLCONCEALBABYSWALL', 'CDLCOUNTERATTACK','CDLDARKCLOUDCOVER', 'CDLDRAGONFLYDOJI', 'CDLENGULFING', 'CDLEVENINGDOJISTAR','CDLEVENINGSTAR','CDLGAPSIDESIDEWHITE', 'CDLGRAVESTONEDOJI', 'CDLHAMMER', 'CDLHANGINGMAN', 'CDLHARAMI','CDLHARAMICROSS', 'CDLHIGHWAVE', 'CDLHIKKAKE', 'CDLHIKKAKEMOD', 'CDLHOMINGPIGEON','CDLIDENTICAL3CROWS', 'CDLINNECK', 'CDLINVERTEDHAMMER', 'CDLKICKING', 'CDLKICKINGBYLENGTH','CDLSTALLEDPATTERN', 'CDLSTICKSANDWICH', 'CDLTAKURI', 'CDLTASUKIGAP', 'CDLTHRUSTING','CDLTRISTAR', 'CDLUNIQUE3RIVER', 'CDLUPSIDEGAP2CROWS', 'CDLXSIDEGAP3METHODS']self.cb = QComboBox()self.cb.addItems(k_text)self.cb.currentIndexChanged.connect(self.selectionchange)self.cb_label = QLabel("预示着当前趋势反转")self.k_label = QLabel("选择K线图的形态:")self.grid_k.addWidget(self.k_label, 0, 0, 1, 1)self.grid_k.addWidget(self.cb, 0, 2, 1, 2)self.grid_k.addWidget(self.cb_label, 0, 5, 1, 5)self.kTab2.setLayout(self.grid_k)self.kLineThread = KLineThread()self.kLineThread.setValue("sh600690")self.kLineThread._signal.connect(self.kLineThread_callbacklog)self.kLineThread.start()def kLineThread_callbacklog(self, df):self.df = dfself.mplK = KMplCanvas(self, width=5, height=4, dpi=100)self.mplK.start_staict_plot(df)mpl_ntb = NavigationToolbar(self.mplK, self)mpl_ntb.setStyleSheet("background-color:white;color:black")self.grid_k.addWidget(self.mplK, 2, 0, 13, 12)self.grid_k.addWidget(mpl_ntb, 2, 0, 1, 5)def selectionchange(self, i):self.cb_label.setText(self.k_content[i])self.mplK.start_staict_plot(self.df, self.K_method[i], i)

同样的,我们这里也需要通过线程获取K线图的基本数据,具体代码如下所示:

from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal
import pandas as pd
from pandas import DataFrameclass KLineThread(QtCore.QThread):_signal = pyqtSignal(DataFrame)def __init__(self):super(KLineThread, self).__init__()def setValue(self, shareNumber):self.share_num = shareNumberdef run(self):df = pd.read_excel("海尔智家k.xlsx")self._signal.emit(df)

需要注意的是,如上篇博文说的一样,最好是先获取网络数据存储在xlsx中后,在获取详细数据,这样在非交易时间段不会造成延迟。后续,这里我们会通过数据库进行更改,暂时先这里处理。

运行之后,显示效果如下图所示:

在界面中,我们可以通过QComboBox控件进行切换K线图,同时图片也会标记符合K线图的数据,而且文字上面也会提示这种K线图代表什么,意味着什么。这是不是散户最想拥有的K线识别器呢?毕竟一般股票交易软件都需要付费才能这么玩。

软件资源代码下载地址:点击下载

python股票量化交易(13)---使用pyqt5构建股票交易K线形态相关推荐

  1. 量化交易12-backtrader回测三日定律K线形态图

    三日定律: 三日定律其实是来源与乔治·道格拉斯·泰勒的"预约法",在后来它就被演变成了LSS三日周期法.泰勒说,市场波动最开始就是从内部开始驱动的,有内部消息者或者聪明人最先买进, ...

  2. python股票量化交易接口是应用到股票上吗?

    python股票量化交易接口是应用到股票上吗?当然可以,而且是任何交易者都可以使用量化交易技术,股票交易数据是很容版易采集的,就是分析起来比权较麻烦,如果题主是职业散户,美股研究社更建议使用一些软件炒 ...

  3. 《Python股票量化交易从入门到实践》随书赠送“回测框架”的使用帮助

    点击:QTYX最新版本使用指南[文字版] 点击:QTYX最新版本使用指南[视频版] 点击: QTYX历史版本更新说明 赠送"回测框架"的目的 为了帮助读者再建立一座从书本知识到实战 ...

  4. python股票量化交易(1)---K线图、均线与成交量绘制

    远思扬祖宗之德,近思盖父母之愆:上思报国之恩,下思造家之福:外思济人之急,内思闲己之邪. 本文目录 前言 获取股票的数据 绘制K线图 均线图 成交量 前言 都说2020年是牛市的起点,很显然对于数据来 ...

  5. python股票量化交易(8)---K线图:锤头,射击之星,早晨之星

    人之有志,如树之有根,立定此志,须念念谦虚,尘尘方便,自然感动天地,而造福由我. 目录 锤头 倒锤头 射击之星 早晨之星 锤头 本篇接着上篇介绍K线形态. 首先,我们今天介绍的第一个K线形态是锤头,T ...

  6. python股票量化交易(6)---使用TA-Lib计算技术指标

    务要日日知非,日日改过:一日不知非,即一日安于自是:一日无过可改,即一日无步可进:天下聪明俊秀不少,所以德不加修.业不加广者,只为因循二字,耽搁一生. 目录 什么是TA-Lib SMA指标的计算 MA ...

  7. python股票量化交易(7)---K线图:乌鸦、乌云压顶、十字星

    随缘济众,其类至繁,约言其纲,大约有十:第一,与人为善;第二,爱敬存心;第三,成人之美;第四,劝人为善;第五,救人危急;第六,兴建大利;第七,舍财作福;第八,护持正法;第九,敬重尊长;第十,爱惜物命. ...

  8. python股票量化交易(11)---使用pyqt5构建股票交易软件主页

    目录 前言 构建界面的整体框架 主页顶部 前言 在前面10篇博文中,我们详细介绍了各种股票图形的绘制以及股票的预测算法,但是有一点非常的不方便,就是每次查看某个股票的数据,我们还需要将代码替换或者更改 ...

  9. python股票量化交易(12)---使用pyqt5构建股票交易软件主页

    目录 实时股票数据 每笔交易详情数据 绘制股票走势图与买卖盘数据 实时股票数据 接着上篇博文的内容,今天我们来实现获取与绘制实时的股票行情数据.首先,我们需要通过akshare库获取某一天的实时交易数 ...

  10. python股票量化交易入门到实践_量化资料学习《Python与量化投资从基础到实战》+《量化交易之路用Python做股票量化分析》+《组织与管理研究的实证方法第2版》...

    我们需要利用Python进行数据分析的指南,有大量的关于数据处理分析的应用,重点学习如何高效地利用Python解决投资策略问题,推荐学习<Python与量化投资从基础到实战>等电子资料. ...

最新文章

  1. python字符串无效的原因_python字符串问题
  2. Nginx基础——Rewrite规则
  3. 数据结构与算法 -- 二叉树 ADT
  4. 流式细胞术及常见问题分析
  5. gbk编码的简介以及针对gbk文本飘红截断原理以及实现
  6. 提高调试.net cf程序效率一些技巧
  7. 只会用单片机点灯,很丢人吗?
  8. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.4. 额外特性
  9. c#提交事务的两种方法
  10. 中控考勤机无线连接不上服务器,中控考勤机连接不上电脑的解决方法
  11. 录屏软件推荐--绝对良心--中国人不骗中国人
  12. cf两边黑屏怎么解决win10_win10摄像机黑屏的解决方案!
  13. Python——程序设计:商贷月供计算器!谁还没点月供了!
  14. 红光光浴可以加速血液循环,完全放松身体各个部位的肌肉
  15. 台式电脑上没有显示计算机怎么办,电脑显示器无视频输入怎么办
  16. 单核CPU处理多线程
  17. 开放云将使业务焕然一新
  18. python requests返回结果带\\u的解决方法
  19. 求一个整数的各个位数
  20. 特征多项式及Cayley-Hamilton定理

热门文章

  1. UE4 C++ 通过Spline绘制任意道路
  2. C/C++和Lua混合编程
  3. 为什么我们会有假期一结束,快乐就终止的感觉?
  4. 刨根究底字符编码之二——关键术语解释(下)
  5. Mysql高阶sql语句
  6. el-cascader数据绑定值原理之展平操作的算法
  7. 深圳大学计算机研究生调剂,深圳大学2020年硕士研究生招生调剂办法
  8. 哈工大深圳计算机实验室介绍,实验室介绍
  9. 修改docker镜像提高下载速度
  10. txt文件内容导入mysql数据库中_将txt文件导入mysql数据库