【量化笔记】OBV指标交易策略
本篇博客是量化笔记系列的最后一篇了,之后会停更一段时间量化内容,后面会写什么还待定
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+VnHn−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指标交易策略相关推荐
- 【量化笔记】随机指标交易策略 KDJ
KDJ指标的计算公式 未成熟随机指标RSV RSV=第n天的收盘价−最近n天内的最低价最近n天内的最高价−最近n天内的最低价RSV=\frac{第n天的收盘价-最近n天内的最低价}{最近n天内的最高价 ...
- Python 金融量化 随机指标交易策略
目录 1.随机指标概述 2.随机指标原理 3.获取数据 4. 计算RSV 5. 计算K.D指标值 5.1 K值.D值指标概述 5.2 计算代码 6.计算J值 7.绘制KDJ线 8. KDJ交易策略 1 ...
- 【手把手教你】用backtrader量化回测海龟交易策略
01 引言 海龟交易策略是比较经典的趋势交易系统之一,涵盖了从入场交易(品种选择).仓位管理(基于ATR加减仓).离场(触发条件)的整个过程.机械套用海龟交易法则在A股上进行交易可能效果不佳,但其交易 ...
- 量化进阶—— 高胜算交易策略(布林线)
阅读原文:京东量化平台-为投资者提供数据支持.策略开发到策略输出的量化生态服务 京东金融官方资讯QQ群:417082141 有什么想咨询的都可以来询问我们哦 金融投机家保持100笔交易成功率达85%以 ...
- 【量化笔记】配对交易
配对交易的步骤 1. 如何挑选进行配对的股票 2. 挑选好股票对以后,如何制定交易策略,开仓点如何设计 3. 开仓是,两只股票如何进行多空仓对比 股票对的选择 1. 行业内匹配 2. 产业链配对 3. ...
- 金融量化-股债平衡交易策略—面向对象实现 仓位控制
股债平衡交易策略 股债平衡策略最早源于格雷厄姆<聪明的投资者>一书,在这本书里,格雷厄姆提出了著名的股债50%:50%平衡策略,即将总资产的分为两半各50%,一半买股票,一半买债券. 当股 ...
- 量化投资实战(一)之KDJ交易策略
点赞.关注再看,养成良好习惯 Life is short, U need Python 初学量化投资实战,[快来点我吧] 1. 前言 由于最近博主比较忙,所以有一段时间没写博文了:另外,量化投资基础系 ...
- 【量化笔记】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 ...
- 在Elasticsearch中回测超级趋势线(Supertrend)交叉交易策略
我们已经讨论了好几个单一指标交易策略,其中简单的相对强弱指数(RSI)交易策略取得的利润最高. 在本文中,我们将使用 Elasticsearch 实现超级趋势线(Supertrend)交叉交易策略,并 ...
最新文章
- vue 引入的方法 用在template_?【有手就行】轻松打造属于自己的Vue工程化脚手架工具...
- ThinkPHP 5.0 入门教程 一:安装ThinkPHP并在Web浏览器访问
- 从Android界面开发谈起(转)
- Linux上jdk的安装
- java如何给一个链表定义和传值_如何在CUDA中为Transformer编写一个PyTorch自定义层...
- 数据库复习之规范化理论
- AFN post的数据编码格式问题
- orcale的rank(排名函数)实例
- CentOS系统恢复误删除的文件
- 软考 - 法律法规 标准化
- java中异常与return
- 的优缺点_折叠门的优缺点
- 【贪心】【AOJ-02】Home Work
- Quartz任务调度器
- Linux局域网文件分享系统Samba
- Matlab2017a/b激活license.lic文件
- JavaScript实现文件读取、文件导出
- PCB设计中基板颜色含义
- 经验分享:如何快速上手公司的项目代码
- 二烷基二硫代磷酸锌添加剂的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
热门文章
- Au音频效果参考:生成
- 中国十大蓝牙耳机品牌,国产十大耳机品牌!
- PHP中echo(),print(),print_r()的区别是什么?
- java-net-php-python-jspm行政办公自动化计算机毕业设计程序
- win7怎么更新显卡驱动_AMD 肾上腺素显卡驱动 20.2.2 更新:修复大量游戏崩溃问题...
- ant design pro之带参数的路由
- CNPM安装VUE项目
- 非常成功的破解了Mac Myeclipse2018.8,内附破解工具下载
- day04-tomcat-20210925
- Android Studio App开发之通知渠道NotificationChannel及给华为、小米手机桌面应用添加消息数量角标实战(包括消息重要级别的设置 附源码)