量化交易——传统技术分析布林通道BollingerBands的原理及实现
来源:互联网 发布:淘宝动漫周边那家店好 编辑:程序博客网 时间:2024/06/05 08:00
布林通道
布林通道线是根据统计学的标准差来计算的,其具体可由上中下三条曲线展示。其中上下两线分别代表上升压力线和下降支撑线,故而可以根据K线图是否突破布林曲线来判断较好的买卖节点。三条曲线计算方法如下:
中轨线(MID)=收盘价的M日移动平均线;
上轨线(UPER)=中轨线+N倍的标准差;
下轨线(LOWER)=中轨线-N倍的标准差.、
实现
某些分析过程可以参考前面的博文,量化交易——传统技术分析相对强弱指数RSI的原理及实现,这里不细讲。
import numpy as npimport mathimport randomimport jsonimport matplotlib.pyplot as pltimport syssys.setrecursionlimit(10000)#date|open|high|low|close|volume|adjsuted def get_stock_hist(num): s_his=np.genfromtxt('C:/Users/Haipeng/Desktop/python/Korea/Korea_{:03d}.csv'.format(num), delimiter=',') s_hi=s_his[1:][:] days=s_hi.shape[0] this_stock = [] for i in range(1,days,1): this_day = [i] for k in range(1,7): this_day.append(s_hi[i][k]) this_stock.append(this_day) print 'Maximum date is ',len(this_stock) return this_stockdef get_price(D, p_tpe): if p_tpe=='close': pos=4; elif p_tpe=='open': pos=1; elif p_tpe=='high': pos=2; elif p_tpe=='low': pos=3; else: pos=5 price=stock_hist[D-1][pos]; return pricedef get_ma(D, N): p_used=np.zeros(N); for i in range(1,N+1,1): p_used[i-1]=stock_hist[(D-1)-(i-1)][4]; ma=np.mean(p_used); return madef get_mar(fro,to,N): ma = [] for i in range(fro,to+1): ma.append(get_ma(i,N)) return ma#Date\Open\High\Low\Closedef get_tuples(fro,to): res =[] for d in range(fro,to+1): tmp = [] tmp.append(d) tmp.append(get_price(d,'open')) tmp.append(get_price(d,'high')) tmp.append(get_price(d,'low')) tmp.append(get_price(d,'close')) res.append(tmp) return resdef get_volume(fro,to): res = [] for d in range(fro,to+1): num = 1 try: if get_price(d,'close')<get_price(d-1,'close'): num = -1 except: pass res.append(num*get_price(d,'volume')) return res # BB Band实现def get_BB(D,N): MD = 0.0 UP = 0.0 DN = 0.0 SD = 0.0 for i in range(N): MD += get_price(D-i,'close') MD = MD/N for i in range(N): SD += math.pow(MD-get_price(D-i,'close'),2) SD = math.sqrt(SD/N) UP = MD + 2*SD DN = MD - 2*SD return [UP,MD,DN]def get_bb(fro,to,N): res = [[],[],[]] for d in range(fro,to+1): if d<N: print 'Date number is not larger than N!' break tmp = get_BB(d,N) res[0].append(tmp[0]) res[1].append(tmp[1]) res[2].append(tmp[2]) return res
绘制k线图及BB指标
绘图代码:
def plot_BB(fro,to): volume = get_volume(fro,to) tmp = get_bb(fro,to,20) up = tmp[0] md = tmp[1] dn = tmp[2] tuples = get_tuples(fro,to) date = [d for d in range(fro,to+1)] fig = plt.figure(figsize=(18,10)) p1 = plt.subplot2grid((4,4),(0,0),rowspan=3,colspan=4,axisbg='k') p1.set_title("Bollinger Bands:(20-Day Moving Average)") p1.set_ylabel("Price") p1.plot(date,up,'m') p1.plot(date,md,'b') p1.plot(date,dn,'y') p1.legend(('UP','MD','DN')) p1.grid(True,color='w') candlestick_ohlc(p1, tuples, width=0.7,colorup='r',colordown="g") p2 = plt.subplot2grid((4,4),(3,0),colspan=4,axisbg='c') p2.set_ylabel("Volume") colors = [] for i in range(len(volume)): if volume[i]<0: colors.append('green') volume[i] = -volume[i] else: colors.append('red') p2.bar(date,volume,color=colors) p2.set_xlabel("Dates") plt.subplots_adjust(hspace=0) plt.show()# show the plot on the screenstock_hist = get_stock_hist(18)plot_BB(1250,1520)
图示结果1:
缩短时间范围:
#得图2plot_BB(220,320)
我们发现,上图有较大的不合理的跳跃。这是什么原因呢?仔细观察发现图像是在第278天发生了突变,应该就是数据出了问题。现在打开对应股票的CSV数据如下,果然:
可知,当天数据丢失了一位数,这才导致了以上的突变。所以在接下来深入挖掘数据时要考虑减少数据错误带来的影响。
2 0
- 量化交易——传统技术分析布林通道BollingerBands的原理及实现
- 量化交易——传统技术分析相对强弱指数RSI的原理及实现
- 量化交易——传统技术分析能量潮指标OBV的原理及实现
- 量化交易——传统技术分析随机震荡指标STO的原理及实现
- 量化交易——传统技术分析随机震荡指标STO的原理及实现
- 量化交易——传统技术分析顺势指标CCI的原理及实现
- 量化交易——传统技术分析平滑异同移动平均线MACD的原理及实现
- 专业量化交易从业人士如何看待传统的技术分析?
- 量化进阶——如何用量化角度看待传统技术分析
- python量化分析—对海龟交易法则的验证
- 量化分析(8)——唐安奇通道
- 量化进阶——量化交易模型的“钝化”与“圣杯”
- 5-爬虫的运行原理及实现技术分析
- 量化分析(6)——K线图、交易量图、动量图、rsi强度图
- 量化进阶—— 索罗斯是如何操作交易体系的?
- 量化进阶—— 具有狼性的沃尔夫波交易策略
- 量化进阶——教你做一个成功的交易者!
- AD量化原理分析
- elasticsearch api中的Update API操作
- java 工具包
- MediaPlayer播放多媒体时注册音频播放焦点
- java 二维码生成与解析
- 微信开发示例程序
- 量化交易——传统技术分析布林通道BollingerBands的原理及实现
- Elasticsearch教程,Elasticsearch安全篇,通过Nginx http basic 限制访问
- 发布新文章和管理文章
- vue-交互 -取值- 赋值
- mysq数据库安装环境配置及基本入门语句
- 购书记录
- webpack 简单使用
- 原型与字面变量的理解
- C++ HackerRank|Algorithmic Crush