本篇博客是量化笔记系列的最后一篇了,之后会停更一段时间量化内容,后面会写什么还待定

OVB主要计算累计成交量,将股价上涨时的成交量进行正累加,对股价下跌时的成交量进行负累加,计算公式是:

O B V n = ± V n + O B V n − 1 OBV_n=\pm V_n + OBV_{n-1} OBVn​=±Vn​+OBVn−1​

当本期股价上涨时, V n V_n Vn​的符号为正,

当本期股价下跌时, V n V_n Vn​的符号为负

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 以青岛啤酒为例
TsingTao=pd.read_csv('TsingTao.csv',index_col='Date')
TsingTao.index=pd.to_datetime(TsingTao.index)
TsingTao.Volume=TsingTao.Volume.replace(0,np.nan)
TsingTao=TsingTao.dropna()
close=TsingTao.Close
Volume=TsingTao.Volume
# 计算OBV
difClose=close.diff()
difClose[0]=0
OBV=(((difClose>=0)*2-1)*Volume).cumsum()
OBV.name='OBV'
OBV.head()
OBV.describe()
count    3.230000e+02
mean    -1.104009e+07
std      3.572700e+07
min     -6.132070e+07
25%     -3.602440e+07
50%     -2.539030e+07
75%      1.912695e+07
max      9.652380e+07
Name: OBV, dtype: float64

移动型OBV,移动型OBV是由累积OBV进行简单移动平均得到,一般选择9日或者12日为时间跨度

s m O B V t = O B V t + O B V t − 1 + . . . + O B V t − 8 9 smOBV_t=\frac{OBV_t+OBV_{t-1}+...+ OBV_{t-8}}{9} smOBVt​=9OBVt​+OBVt−1​+...+OBVt−8​​

import movingAverage as mv
smOBV=mv.smaCal(OBV,9)
smOBV.tail()
Date
2015-04-24    7.677104e+07
2015-04-27    7.864432e+07
2015-04-28    8.023227e+07
2015-04-29    8.173780e+07
2015-04-30    8.144052e+07
dtype: float64

修正型OBV

为了将股价这些因素考虑进去,人们一般用多空比率净额来替代单纯的成交量

V A n = V A n − 1 + V n ( C n − L n ) − ( H n − C n ) H n − L n VA_n = VA_{n-1}+V_n \frac{(C_n-L_n)-(H_n-C_n)}{H_n-L_n} VAn​=VAn−1​+Vn​Hn​−Ln​(Cn​−Ln​)−(Hn​−Cn​)​

其中, V n V_n Vn​, 而 H n , L n , C n H_n,L_n,C_n Hn​,Ln​,Cn​分别是当日的最高价,最低价和收盘价

AdjOBV=((close-TsingTao.Low)-(TsingTao.High-close)\)/(TsingTao.High-TsingTao.Low)*Volume
AdjOBV.name='AdjOBV'
AdjOBV.head()
AdjOBVd=AdjOBV.cumsum()
AdjOBVd.name='AdjOBVd'
AdjOBVd.describe()
count    3.230000e+02
mean     4.242572e+07
std      4.706378e+07
min     -1.589447e+07
25%     -5.944451e+05
50%      3.387219e+07
75%      8.573505e+07
max      1.589280e+08
Name: AdjOBVd, dtype: float64
plt.rcParams['figure.figsize']=(20.0,10.0)
ax1=plt.subplot(3,1,1)
close.plot(title='青岛啤酒收盘价')
plt.xticks(close.index[1:3],(''))
plt.xlabel('')
ax2=plt.subplot(3,1,2)
OBV.plot(label='OBV',title='青岛啤酒累积能量潮与移动能量潮')
smOBV.plot(label='smOBV',linestyle='-.',color='r')
plt.legend(loc='upper left')
plt.xticks(close.index[1:3],(''))
plt.xlabel('')
ax3=plt.subplot(3,1,3)
AdjOBVd.plot(title='成交量多空比率净额')
for ax in ax1,ax2,ax3:ax.grid(True)

OBV指标的交易策略制定

当OBV指标增大时,说明累积成交量在增加,可以推测当期的价格变化为正值,当期的股价是上升的,累积成交量的增大也体现来市场的活跃度增加,短期内,股票价格有可能继续上升,释放出买入信号

当OBV指标变小时,说明累积成交量在减小,当期的价格变化为负值,当期股价是下跌的,市场的活跃度减弱,短期内有可能还会下跌,释放出卖出信号

import ffn
def trade(obv,price):signal=(2*(obv.diff()>0)-1)[1:]ret=ffn.to_returns(price)[1:]ret.name='ret'tradeRet=ret*signal.shift(1)tradeRet.name='tradeRet'Returns=pd.merge(pd.DataFrame(ret),\pd.DataFrame(tradeRet),\left_index=True,right_index=True).dropna()return(Returns)
OBVtrade=trade(OBV,close)
OBVtrade.head()
ret tradeRet
Date
2014-01-06 -0.018701 0.018701
2014-01-07 -0.004069 0.004069
2014-01-08 0.000000 -0.000000
2014-01-09 -0.023006 -0.023006
2014-01-10 -0.011224 0.011224
ret=OBVtrade.ret
tradeRet=OBVtrade.tradeRet
ret.name='BuyAndHold'
tradeRet.name='OBVTrade'
(1+ret).cumprod().plot(label='ret',linestyle='dashed')
(1+tradeRet).cumprod().plot(label='tradeRet')
plt.title('累积OBV交易策略绩效表现')
plt.legend()
<matplotlib.legend.Legend at 0x1a1cd27f60>

def backtest(ret,tradeRet):def performance(x):winpct=len(x[x>0])/len(x[x!=0])annRet=(1+x).cumprod()[-1]**(245/len(x))-1sharpe=ffn.calc_risk_return_ratio(x)maxDD=ffn.calc_max_drawdown((1+x).cumprod())perfo=pd.Series([winpct,annRet,sharpe,maxDD],index=['win rate','annualized return',\'sharpe ratio','maximum drawdown'])return(perfo)BuyAndHold=performance(ret)OBVTrade=performance(tradeRet)return(pd.DataFrame({ret.name:BuyAndHold,\tradeRet.name:OBVTrade}))
OBVtest=backtest(ret,tradeRet)
OBVtest
BuyAndHold OBVTrade
win rate 0.496815 0.519108
annualized return -0.058270 -0.055129
sharpe ratio -0.010179 -0.009199
maximum drawdown -0.199358 -0.235397
smOBVtrade=trade(smOBV,close)
smOBVtrade.head(n=3)
ret tradeRet
Date
2014-01-06 -0.018701 0.018701
2014-01-07 -0.004069 0.004069
2014-01-08 0.000000 -0.000000
ret=smOBVtrade.ret
ret.name='BuyAndHold'
smtradeRet=smOBVtrade.tradeRet
smtradeRet.name='smOBVTrade'
(1+ret).cumprod().plot(label='ret',linestyle='dashed')
(1+tradeRet).cumprod().plot(label='tradeRet')
plt.title('简单OBV交易策略绩效表现')
plt.legend()
<matplotlib.legend.Legend at 0x1a1d1f7d30>

test=backtest(ret,smtradeRet)
test
BuyAndHold smOBVTrade
win rate 0.496815 0.512739
annualized return -0.058270 0.060095
sharpe ratio -0.010179 0.023843
maximum drawdown -0.199358 -0.160496

【量化笔记】OBV指标交易策略相关推荐

  1. 【量化笔记】随机指标交易策略 KDJ

    KDJ指标的计算公式 未成熟随机指标RSV RSV=第n天的收盘价−最近n天内的最低价最近n天内的最高价−最近n天内的最低价RSV=\frac{第n天的收盘价-最近n天内的最低价}{最近n天内的最高价 ...

  2. Python 金融量化 随机指标交易策略

    目录 1.随机指标概述 2.随机指标原理 3.获取数据 4. 计算RSV 5. 计算K.D指标值 5.1 K值.D值指标概述 5.2 计算代码 6.计算J值 7.绘制KDJ线 8. KDJ交易策略 1 ...

  3. 【手把手教你】用backtrader量化回测海龟交易策略

    01 引言 海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择).仓位管理(基于ATR加减仓).离场(触发条件)的整个过程.机械套用海龟交易法则在A股上进行交易可能效果不佳,但其交易 ...

  4. 量化进阶—— 高胜算交易策略(布林线)

    阅读原文:京东量化平台-为投资者提供数据支持.策略开发到策略输出的量化生态服务 京东金融官方资讯QQ群:417082141 有什么想咨询的都可以来询问我们哦 金融投机家保持100笔交易成功率达85%以 ...

  5. 【量化笔记】配对交易

    配对交易的步骤 1. 如何挑选进行配对的股票 2. 挑选好股票对以后,如何制定交易策略,开仓点如何设计 3. 开仓是,两只股票如何进行多空仓对比 股票对的选择 1. 行业内匹配 2. 产业链配对 3. ...

  6. 金融量化-股债平衡交易策略—面向对象实现 仓位控制

    股债平衡交易策略 股债平衡策略最早源于格雷厄姆<聪明的投资者>一书,在这本书里,格雷厄姆提出了著名的股债50%:50%平衡策略,即将总资产的分为两半各50%,一半买股票,一半买债券. 当股 ...

  7. 量化投资实战(一)之KDJ交易策略

    点赞.关注再看,养成良好习惯 Life is short, U need Python 初学量化投资实战,[快来点我吧] 1. 前言 由于最近博主比较忙,所以有一段时间没写博文了:另外,量化投资基础系 ...

  8. 【量化笔记】RSI相对强弱指标

    RSI标志买方和卖方的相对力量强弱 R S I = 100 ∗ U P U P + D O W N RSI=100 * \frac{UP}{UP+DOWN} RSI=100∗UP+DOWNUP​ UP ...

  9. 在Elasticsearch中回测超级趋势线(Supertrend)交叉交易策略

    我们已经讨论了好几个单一指标交易策略,其中简单的相对强弱指数(RSI)交易策略取得的利润最高. 在本文中,我们将使用 Elasticsearch 实现超级趋势线(Supertrend)交叉交易策略,并 ...

最新文章

  1. vue 引入的方法 用在template_?【有手就行】轻松打造属于自己的Vue工程化脚手架工具...
  2. ThinkPHP 5.0 入门教程 一:安装ThinkPHP并在Web浏览器访问
  3. 从Android界面开发谈起(转)
  4. Linux上jdk的安装
  5. java如何给一个链表定义和传值_如何在CUDA中为Transformer编写一个PyTorch自定义层...
  6. 数据库复习之规范化理论
  7. AFN post的数据编码格式问题
  8. orcale的rank(排名函数)实例
  9. CentOS系统恢复误删除的文件
  10. 软考 - 法律法规 标准化
  11. java中异常与return
  12. 的优缺点_折叠门的优缺点
  13. 【贪心】【AOJ-02】Home Work
  14. Quartz任务调度器
  15. Linux局域网文件分享系统Samba
  16. Matlab2017a/b激活license.lic文件
  17. JavaScript实现文件读取、文件导出
  18. PCB设计中基板颜色含义
  19. 经验分享:如何快速上手公司的项目代码
  20. 二烷基二硫代磷酸锌添加剂的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. Au音频效果参考:生成
  2. 中国十大蓝牙耳机品牌,国产十大耳机品牌!
  3. PHP中echo(),print(),print_r()的区别是什么?
  4. java-net-php-python-jspm行政办公自动化计算机毕业设计程序
  5. win7怎么更新显卡驱动_AMD 肾上腺素显卡驱动 20.2.2 更新:修复大量游戏崩溃问题...
  6. ant design pro之带参数的路由
  7. CNPM安装VUE项目
  8. 非常成功的破解了Mac Myeclipse2018.8,内附破解工具下载
  9. day04-tomcat-20210925
  10. Android Studio App开发之通知渠道NotificationChannel及给华为、小米手机桌面应用添加消息数量角标实战(包括消息重要级别的设置 附源码)