背景:
有浦发银行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()