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()

结果

这里写图片描述

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
布林策略是一种基于统计学原理的技术分析方法,常用于股票交易和其他金融市场。下面是一个简单的布林策略的Python代码示例: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt # 获取数据 df = pd.read_csv('data.csv') # 计算布林指标 n = 20 # 计算周期 std = 2 # 布林宽度 ma = df['close'].rolling(n).mean() std_dev = df['close'].rolling(n).std() upper_band = ma + std * std_dev lower_band = ma - std * std_dev # 绘制布林 plt.plot(df['close']) plt.plot(upper_band) plt.plot(lower_band) # 判断买入和卖出信号 signals = pd.Series(np.zeros(len(df))) for i in range(n, len(df)): if df['close'][i] > upper_band[i-1]: signals[i] = 1 elif df['close'][i] < lower_band[i-1]: signals[i] = -1 # 绘制买卖信号 buy_signals = signals[signals == 1] sell_signals = signals[signals == -1] plt.scatter(buy_signals.index, df['close'][buy_signals.index], color='green', marker='^', s=100) plt.scatter(sell_signals.index, df['close'][sell_signals.index], color='red', marker='v', s=100) # 计算收益率 returns = pd.Series(np.zeros(len(df))) for i in range(1, len(df)): if signals[i-1] == 1: returns[i] = (df['close'][i] - df['close'][i-1]) / df['close'][i-1] elif signals[i-1] == -1: returns[i] = (df['close'][i-1] - df['close'][i]) / df['close'][i-1] # 绘制收益率曲线 cum_returns = (1 + returns).cumprod() plt.figure() plt.plot(cum_returns) # 输出统计指标 win_rate = len(returns[returns > 0]) / len(returns[returns != 0]) print('总收益率:', cum_returns[-1]) print('年化收益率:', (cum_returns[-1] ** (250/len(df)) - 1)) print('胜率:', win_rate) print('盈亏比:', abs(returns[returns > 0].mean() / returns[returns < 0].mean())) ``` 在这个例子中,我们首先计算了布林的上限和下限,然后根据收盘价与布林的位置判断买卖信号。最后,我们计算了收益率并输出了一些统计指标。当然,这只是一个简单的示例,实际操作中还需要考虑一些细节问题,例如手续费、滑点等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值