Bootstrap

python绘制布林带

背景:

有浦发银行2017年的每日收盘价(数据来源:天软科技),画布林带。

代码:

"""
布林带
"""
import numpy as np
import datetime
import matplotlib.pyplot as plt
"""

step1 :读取数据

    2017浦发银行2.CSV:
    时间,收盘价(浦发银行),最高价(浦发银行),最低价(浦发银行)
    2017-01-03,12.3804137039431,12.4867485455721,12.2816742081448
    2017-01-04,12.403199741435,12.4183904330963,12.2892695539754
    2017-01-05,12.3804137039431,12.4411764705882,12.3348416289593
    2017-01-06,12.2892695539754,12.3804137039431,12.2512928248222
    …………

"""

def datestr2date(s):
    s = s.decode('utf-8')
    #weekday函数返回 日期对应星期的天数,0代表星期一
    return datetime.datetime.strptime(s,"%Y-%m-%d").date()

filepath = r"C:\Users\tinysoft\Desktop\2017浦发银行2.CSV"

#delimiter 参数指定了文件中的分隔符
#usecols 中的参数指定感兴趣的数据列
#unpack 参数设置为True使得不同列的数据分开存储
#skiprows 跳过一行
#dtype 设置转换过来的数据的格式
d,c,h,l = np.loadtxt(filepath,delimiter=',',skiprows=1,usecols=(0,1,2,3),unpack=True,
                dtype={"names":('date','close','high','low'),
                       "formats":(np.object_,np.float32,np.float64,np.float64)},
               converters={0:datestr2date})

"""
step2:计算布林带
"""
N = 20 #20日移动平均计算的布林线

#平均权重
weights = np.ones(N)/N

#卷积实现移动平均
sma = np.convolve(weights,c)[N-1:-N+1]

deviation = []

lenc = len(c)
for i in range(N-1,lenc):
    dev = c[i-N+1:i+1]
    deviation.append(np.std(dev))


#两倍标准差
deviation = 2 * np.array(deviation)  
#压力线
upperBB = sma + deviation  
#支撑线
lowerBB = sma - deviation

"""
step3:画图

"""
c_slice = c[N-1:]

plt.plot(c_slice,'y',label = "close")
plt.plot(sma,'b--',label = "BOLL")
plt.plot(upperBB,'r',label = "UPR")
plt.plot(lowerBB,'g',label = "DWN")
plt.title('$SH600000\ BOLL$')
plt.legend()
plt.show()

结果

这里写图片描述

;