用Python语言绘制股市OBV指标效果
我的新书《基于股票大数据分析的Python入门实战》于近日上架,在这篇博文向大家介绍我的新书:《基于股票大数据分析的Python入门实战》里,介绍了这本书的内容。这里将摘录出部分内容,用以推广本书,请大家多多支持。
《基于股票大数据分析的Python入门实战 视频教学版》,京东链接:https://item.jd.com/69241653952.html。在这篇博文里,将摘录部分内容。

1 OBV指标的原理以及算法
形象地讲,OBV指标是将成交量与股价的关系数字化,并根据股市的成交量变化情况来衡量股市的上涨或下跌支持力,以此来研判股价的走势。OBV指标的设计是基于如下的原理。
第一,如果投资者对当前股价的看法越有分歧,那么成交量就越大,反之成交量就越小,所以可以用成交量来衡量多空双方的力量。
第二,股价在上升时,尤其是在上升初期,必须要较大的成交量相配合,相反股价在下跌时,无需耗费很大的动量,因此成交量未必放大,甚至下跌阶段成交量会有萎缩趋势。
第三,受关注的股票在一段时间内成交量和股价波动会很大,相反冷门股票成交量和价格波动会比较小。
根据上述原则,OBV的算法如下,主要是以日为单位累积成交量。
当日OBV值 = 本日值 + 前日OBV值
如果本日收盘价高于前一日的收盘价,本日的值为正,反之为负,如果本日收盘价和前一日的收盘价相同,则本日值不参与计算,按照这种规则累积计算成交量。成交量可以选择多种计算单位,OBV用到的是成交手数。参考表12-3,通过范例来了解一下OBV的算法。
表 OBV指标算法的实例表
|
日期 |
收盘价(元) |
成交量(手) |
当日OBV累计值 |
|
第1天 |
10 |
10000 |
不计算 |
|
第2天 |
10.2 |
+11000 |
+11000 |
|
第3天 |
10.3 |
+12000 |
+23000 |
|
第4天 |
10.2 |
-10000 |
+13000 |
|
第5天 |
10.1 |
-5000 |
+8000 |
其中,第一天不计算,第2天的收盘价高于第1天,所以当日OBV是当日成交量(为正数)。第3天收盘价也高于第2天,所以该日的OBV是第2天的值(+11000)加上该日成交量(+12000)。
第4天股票下跌,所以当日的OBV累计值是前日的23000减去当日的成交量,结果是+13000,同理第5天也是下跌,当日的OBV是前日值13000减去当日成交量5000,结果是8000。
之后的OBV值按同理计算,将每日算得的OBV值作为纵坐标,交易的日期作为横坐标,将这些点连接起来就是OBV指标线了。
2 绘制K线、均线和OBV指标图的整合效果图
在绘制K线、均线与OBV指标图时,是从csv文件(其实源于网站爬取的股票交易数据)中的Volume字段获得的成交量,它的单位是“股数”,而计算OBV时成交量的单位是“手”,两者的对应关系是1手等于100股。
在DrawKwithOBV.py范例程序中,将绘制整合的效果图,该范例程序存放在MyDjangoDBProj项目中,与DBUtil.py处于同一目录。为了突出OBV算法,范例程序不导入数据库相关的操作,也不输出日志。
1 # !/usr/bin/env python 2 # coding=utf-8 3 import pandas as pd 4 import matplotlib.pyplot as plt 5 from mpl_finance import candlestick2_ochl 6 # 计算OBV的方法 7 def calOBV(df): 8 # 把成交量换算成万手 9 df['VolByHand'] = df['Volume']/1000000 10 # 创建OBV列,先全填充为0 11 df['OBV'] =0 12 cnt=1 # 索引从1开始,即从第2天算起 13 while cnt<=len(df)-1: 14 if(df.iloc[cnt]['Close']>df.iloc[cnt-1]['Close']): 15 df.ix[cnt,'OBV'] = df.ix[cnt-1,'OBV'] + df.ix[cnt,'VolByHand'] 16 if(df.iloc[cnt]['Close']<df.iloc[cnt-1]['Close']): 17 df.ix[cnt,'OBV'] = df.ix[cnt-1,'OBV'] - df.ix[cnt,'VolByHand'] 18 cnt=cnt+1 19 return df
在第7行的calOBV方法中封装了计算OBV指标的程序逻辑。具体执行步骤是,在第9行中为df对象新增VolByHand列,把成交量转换成“万手”,虽然OBV的计算单位是手,但以此绘制出来的指标图上y轴的OBV数值还是过大,所以这里在除以100的基础上再除以10000,转换成“万手”。
随后在第11行新增OBV列,该列的初始值是0。之后在第13行的while循环中,从第2天开始依次遍历df对象,根据OBV的计算规则给每天的OBV列赋值,比如通过第14行的if语句处理当天收盘价上涨的情况,从第15行的程序代码中可以看到,在上涨情况下,当日的OBV值是前日OBV值加上当日的成交量,在第17行中处理了当日下跌的情况,当日的OBV值是前日值减去当日的成交量。
20 filename='D:\\stockData\ch12\\6004602019-01-012019-05-31.csv' 21 df = pd.read_csv(filename,encoding='gbk') 22 # 调用方法计算OBV 23 df = calOBV(df) 24 # print(df) # 可以去除这段注释以查看结果
在第21行从指定的csv文件中读到600460(士兰微)从20190101到20190531的交易数据,并在第23行调用calOBV方法计算OBV值,在该方法的返回结果存放到df对象中,其中OBV值包含在df['OBV']这一列种。如果要检验计算的OBV结果,可以去掉第24行的注释,使得打印语句生效。
25 figure = plt.figure()
26 # 创建子图
27 (axPrice, axOBV) = figure.subplots(2, sharex=True)
28 # 调用方法,在axPrice子图中绘制K线图
29 candlestick2_ochl(ax = axPrice,
30 opens=df["Open"].values, closes=df["Close"].values,
31 highs=df["High"].values, lows=df["Low"].values,
32 width=0.75, colorup='red', colordown='green')
33 axPrice.set_title("K线图和均线图") # 设置子图标题
34 df['Close'].rolling(window=3).mean().plot(ax=axPrice,color="red",label='3日均线')
35 df['Close'].rolling(window=5).mean().plot(ax=axPrice,color="blue",label='5日均线')
36 df['Close'].rolling(window=10).mean().plot(ax=axPrice,color="green",label='10日均线')
37 axPrice.legend(loc='best') # 绘制图例
38 axPrice.set_ylabel("价格(单位:元)")
39 axPrice.grid(linestyle='-.') # 带网格线
40 # 在axOBV子图中绘制OBV图形
41 df['OBV'].plot(ax=axOBV,color="blue",label='OBV')
42 plt.legend(loc='best') # 绘制图例
43 plt.rcParams['font.sans-serif']=['SimHei']
44 # 在OBV子图上加上负值效果
45 plt.rcParams['axes.unicode_minus'] = False
46 axOBV.set_ylabel("单位:万手")
47 axOBV.set_title("OBV指标图") # 设置子图的标题
48 axOBV.grid(linestyle='-.') # 带网格线
49 # 设置x轴坐标的标签和旋转角度
50 major_index=df.index[df.index%5==0]
51 major_xtics=df['Date'][df.index%5==0]
52 plt.xticks(major_index,major_xtics)
53 plt.setp(plt.gca().get_xticklabels(), rotation=30)
54 plt.show()
在第27行的程序语句设置了两个子图,其中axPrice用于绘制K线和均线,而axOBV则用于绘制OBV指标图。
从第29行到第39行的程序语句用于绘制K线以及三条均线,这部分代码在之前几章中的范例程序中都讲过,所以不再重复说明。在第41行中通过调用df['OBV'].plot方法绘制OBV指标图。
在绘制OBV子图时请注意两个细节:
第一,在第46行中,在axOBV子图内通过调用set_ylabel方法设置了OBV子图的y坐标标签为“万手”;
第二,通过第45行的程序代码,让OBV子图上的y坐标数字有正有负,如果去掉这行语句,OBV子图上y坐标的数字均为正数。
运行这个范例程序,即可看到如图所示的执行结果。

本书的其它内容,大家可以参考如下的博文,
用Python语言绘制股市OBV指标效果的更多相关文章
- Python语言程序设计(3)--实例2-python蟒蛇绘制-turtle库
1. 2. 3.了解turtle库 Turtle,也叫海龟渲染器,使用Turtle库画图也叫海龟作图.Turtle库是Python语言中一个很流行的绘制图像的函数库.海龟渲染器,和各种三维软件都有着良 ...
- #Python语言程序设计Demo - 七段数码管绘制
Python设计七段数码管绘制 单个数码管效果: 设计总数码管效果: Pyhton 编程: #七段数码管绘制 import turtle as t import time as T def drawG ...
- 《Python语言程序设计》【第2周】Python基本图形绘制
实例2:Python蟒蛇绘制 #PythonDraw.py import turtle #import 引入了一个绘图库 turtle 海龟库--最小单位像素 turtle.setup(650, 35 ...
- 【学习笔记】PYTHON语言程序设计(北理工 嵩天)
1 Python基本语法元素 1.1 程序设计基本方法 计算机发展历史上最重要的预测法则 摩尔定律:单位面积集成电路上可容纳晶体管数量约2年翻倍 cpu/gpu.内存.硬盘.电子产品价格等都遵 ...
- Python语言and-or的用法
[原]python语言的 and-or 常常被用来实现类C语言中的三元运算符 : ? , 更为骚气的写法是 xxx and xxx or xxx and xxx or xxx,这样就可以可以做到 ...
- Python图表绘制:matplotlib绘图库入门
matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并 ...
- 动态语言的灵活性是把双刃剑 -- 以Python语言为例
本文有些零碎,总题来说,包括两个问题:(1)可变对象(最常见的是list dict)被意外修改的问题,(2)对参数(parameter)的检查问题.这两个问题,本质都是因为动态语言(动态类型语言)的特 ...
- 【转】布同:如何循序渐进学习Python语言
大家都知道Python语言是一种新兴的编程语言.1989年,Python就由Guido van Rossum发明.Python一直发展态势很好. 原因有几点:1.跨平台性好.Linux.Windows ...
- 机器学习之支持向量机(四):支持向量机的Python语言实现
注:关于支持向量机系列文章是借鉴大神的神作,加以自己的理解写成的:若对原作者有损请告知,我会及时处理.转载请标明来源. 序: 我在支持向量机系列中主要讲支持向量机的公式推导,第一部分讲到推出拉格朗日对 ...
随机推荐
- Elasticsearch系列---生产集群部署(下)
概要 本篇继续讲解Elasticsearch集群部署的细节问题 集群重启问题 如果我们的Elasticsearch集群做了一些离线的维护操作时,如扩容磁盘,升级版本等,需要对集群进行启动,节点数较多时 ...
- 终于我用JOL打破了你对java对象的所有想象
目录 简介 JOL简介 使用JOL分析VM信息 使用JOL分析String 使用JOL分析数组 使用JOL分析自动装箱 使用JOL分析引用关系 总结 简介 使用面向对象的编程语言的好处就是,虽然没有女 ...
- Github上可以涨薪30k的Java教程和实战项目终于可以免费下载了
写在前面 大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架.软件或者教程.这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整 ...
- CentOS 7设置静态IP并修改DNS
1. 设置静态IP 首先需要确定网线插在服务器的哪一个网络接口上,接口旁边一般都有写.我这边是插在1号接口上的. 然后修改网络配置文件,文件位于 /etc/sysconfig/network-scri ...
- 使用 Kafka + Spark Streaming + Cassandra 构建数据实时处理引擎
Apache Kafka 是一个可扩展,高性能,低延迟的平台,允许我们像消息系统一样读取和写入数据.我们可以很容易地在 Java 中使用 Kafka. Spark Streaming 是 Apache ...
- CentOS7.5搭建Kafka2.11-1.1.0集群与简单测试
一.下载 下载地址: http://kafka.apache.org/downloads.html 我这里下载的是Scala 2.11对应的 kafka_2.11-1.1.0.tgz 二.集群规 ...
- VUE+ELEMENT-UI的后台项目封装组件--查询form的封装
最近项目打算重构,项目的模块几乎都是以后台查询展示的传统的增删改差模式,所以卑微的我想要自己封装一下查询form,先上效果图 子组件页面: <template> <div class ...
- Jmeter服务器监控技术
meter-plugins.org推出了全新的Plugins Manager,对于其提供的插件进行了集中的管理, 将 ServerAgent-xxx.jar上传被测服务器解压 进入目录 ServerA ...
- vue入门的第一天:v-clock、v-text、v-html的使用
vue入门的第一天 1. v-cloak v-cloak可以解决插值闪烁问题(防止代码被人看见),在元素里加入 v-cloak即可 html: <p v-cloak>{{msg}}< ...
- 关于word2vec的一些问题
CBOW v.s. skip-gram CBOW 上下文预测中心词,出现次数少的词会被平滑,对出现频繁的词有更高的准确率 skip-gram 中心词预测上下文,训练次数比CBOW多,表示罕见词更好 例 ...