用Python语言绘制股市OBV指标效果
发布日期:2021-05-08 23:47:27 浏览次数:22 分类:技术文章

本文共 4076 字,大约阅读时间需要 13 分钟。

     我的新书于近日上架,在这篇博文里,介绍了这本书的内容。这里将摘录出部分内容,用以推广本书,请大家多多支持。   

    《基于股票大数据分析的Python入门实战 视频教学版》,京东链接:。在这篇博文里,将摘录部分内容。

    

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 python2    # coding=utf-83    import pandas as pd4    import matplotlib.pyplot as plt5    from mpl_finance import candlestick2_ochl6    # 计算OBV的方法7    def calOBV(df):8        # 把成交量换算成万手9        df['VolByHand'] = df['Volume']/100000010       # 创建OBV列,先全填充为011       df['OBV'] =012       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']

    在第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   # 调用方法计算OBV23   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'] = False46   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,如何高效用Python挣钱
下一篇:零基础的Java小白如何准备初级开发的面试

发表评论

最新留言

感谢大佬
[***.8.128.20]2025年04月15日 07时47分20秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Kubernetes入门:构建和管理容器化应用的强大工具 2023-01-29
Kubernetes包管理工具Helm详解 2023-01-29
Kubernetes单master节点高可用集群安装 2023-01-29
Kubernetes原理详解 2023-01-29
Kubernetes原生的CICD工具Tekton详解 2023-01-29
Kubernetes多master节点高可用集群安装 2023-01-29
Kubernetes存储之Persistent Volumes简介 2023-01-29
Kubernetes学习总结(10)—— 何为云原生,与 kubernetes 是什么关系 2023-01-29
Kubernetes学习总结(11)—— Kubernetes Pod 到底是什么? 2023-01-29
Kubernetes学习总结(12)—— 学习 kubernetes 的10个技巧或建议 2023-01-29
Kubernetes学习总结(13)—— Kubernetes 各个组件的概念 2023-01-29
Kubernetes学习总结(14)—— Kubernetes 实用命令总结 2023-01-29
Kubernetes学习总结(15)—— Kubernetes 实战之部署 Mysql 集群 2023-01-29
Kubernetes学习总结(16)—— Kubernetes 实战之部署 Redis 集群 2023-01-29
Kubernetes学习总结(17)—— Kubernetes 快速入门需要掌握的知识点总结 2023-01-29
Kubernetes学习总结(18)—— Kubernetes 容器网络 2023-01-29
Kubernetes学习总结(1)——Kubernetes入门简介 2023-01-29
Kubernetes学习总结(2)——Kubernetes设计架构 2023-01-29
Kubernetes学习总结(3)——一年时间打造全球最大规模之一的Kubernetes集群,蚂蚁金服怎么做到的? 2023-01-29
Kubernetes学习总结(4)——Kubernetes v1.20 重磅发布 | 新版本核心主题 & 主要变化解读 2023-01-29