本人股市多年的老韭菜,各种股票分析书籍,技术指标书籍阅历无数,萌发想法,何不自己开发个股票预测分析软件,选择python因为够强大,它提供了很多高效便捷的数据分析工具包。
我们已经初步的接触与学习其中数据分析中常见的3大利器---Numpy,Pandas,Matplotlib库。
也简单介绍一下数据获取的二种方法,通过金融数据接口和爬虫获取。
介绍了指标之王MACD,随机指标KDJ的详细用法,这一章我们介绍BOLL指标线
“不管黑猫白猫,能抓到耗子的就是好猫”,BOLL指标的名气没前二者大,其实这是很好的指标,我至少认识几个朋友就专用boll指标,效果不错。
布林带(BOLL)指标是美国股市分析家约翰·布林根据统计学中的标准差原理设计出来的一种非常简单实用的技术分析指标。一般而言,股价的运动总是围绕某一价值中枢(如均线、成本线等)在一定的范围内变动,布林线指标正是在上述条件的基础上,引进了“股价通道”的概念,其认为股价通道的宽窄随着股价波动幅度的大小而变化,而且股价通道又具有变异性,它会随着股价的变化而自动调整。
Boll指标的应用主要体现在以下几个方面:
1. 判断趋势:当价格位于上轨线以上时,说明市场处于超买状态,趋势可能会逆转;当价格位于下轨线以下时,说明市场处于超卖状态,趋势可能会逆转。投资者可以根据价格在轨道线上下的位置来判断趋势的强度和变化。
2. 制定交易策略:当价格从下轨线向上突破中轨线时,为买入信号;当价格从上轨线向下突破中轨线时,为卖出信号。投资者可以根据这些信号来确定买卖点位,制定相应的交易策略。
3. 确定止损位:当价格突破上轨线时,说明市场处于超买状态,投资者可以设定止损位在上轨线以上一定的幅度,以避免亏损。同理,当价格突破下轨线时,也可以设定止损位在下轨线以下一定的幅度。
在相对所有的指标最复杂的计算中,BOLL指标的计算方法是其中之一,其中引进了统计学中的标准差概念,涉及到中轨线(MB)、上轨线(UP)和下轨线(DN)的计算。另外,和其他指标的计算一样,由于选用的计算周期的不同,BOLL指标也包括日BOLL指标、周BOLL指标、月BOLL指标年BOLL指标以及分钟BOLL指标等各种类型。经常被用于股市研判的是日BOLL指标和周BOLL指标。虽然它们的计算时的取值有所不同,但基本的计算方法一样。
日BOLL指标的计算公式
中轨线=N日的移动平均线
上轨线=中轨线+两倍的标准差
下轨线=中轨线-两倍的标准差
日BOLL指标的计算过程
计算MA:
MA=N日内的收盘价之和除以N
计算标准差MD:
MD=平方根N日的(C - MA)的两次方之和除以N
计算MB、UP、DN线:
MB=(N-1)日的MA
UP=MB + 2 × MD
DN=MB - 2 × MD
在股市分析软件中,BOLL指标一共由四条线组成,即上轨线UP 、中轨线MB、下轨线DN和价格线。其中上轨线UP是UP数值的连线,用黄色线表示;中轨线MB是MB数值的连线,用白色线表示;下轨线DN是DN数值的连线,用紫色线表示;价格线是以美国线表示,颜色为浅蓝色。
python代码:
# 导入及处理数据
import pandas as pd
import numpy as np
# 绘图
import matplotlib.pyplot as plt
# 设置图像标签显示中文
plt.rcParams['font.family'] = 'Heiti TC'
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
import matplotlib as mpl
# 解决一些编辑器(VSCode)或IDE(PyCharm)等存在的图片显示问题,
# 应用Tkinter绘图,以便对图形进行放缩操作
mpl.use('TkAgg')
# 导入数据并做处理
def import_csv(stock_code):
df = pd.read_csv(stock_code + '.csv')
df.rename(columns={
'date': 'Date',
'open': 'Open',
'high': 'High',
'low': 'Low',
'close': 'Close',
'volume': 'Volume'
},
inplace=True)
df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d')
df.set_index(['Date'], inplace=True)
return df
stock_code = '600276'
# 绘制数据的规模
scale = 500
df = import_csv(stock_code)[-scale:]
# SMA:简单移动平均(Simple Moving Average)
time_period = 20 # SMA的计算周期,默认为20
stdev_factor = 2 # 上下频带的标准偏差比例因子
history = [] # 每个计算周期所需的价格数据
sma_values = [] # 初始化SMA值
upper_band = [] # 初始化阻力线价格
lower_band = [] # 初始化支撑线价格
# 构造列表形式的绘图数据
for close_price in df['Close']:
#
history.append(close_price)
# 计算移动平均时先确保时间周期不大于20
if len(history) > time_period:
del (history[0])
# 将计算的SMA值存入列表
sma = np.mean(history)
sma_values.append(sma)
# 计算标准差
stdev = np.sqrt(np.sum((history - sma) ** 2) / len(history))
upper_band.append(sma + stdev_factor * stdev)
lower_band.append(sma - stdev_factor * stdev)
# 将计算的数据合并到DataFrame
df = df.assign(收盘价=pd.Series(df['Close'], index=df.index))
df = df.assign(中界线=pd.Series(sma_values, index=df.index))
df = df.assign(阻力线=pd.Series(upper_band, index=df.index))
df = df.assign(支撑线=pd.Series(lower_band, index=df.index))
# 绘图
ax = plt.figure()
# 设定y轴标签
ax.ylabel = '%s price in ¥' % (stock_code)
df['收盘价'].plot(color='k', lw=1., legend=True)
df['中界线'].plot(color='b', lw=1., legend=True)
df['阻力线'].plot(color='r', lw=1., legend=True)
df['支撑线'].plot(color='g', lw=1., legend=True)
plt.show()
显示效果:
股价在下轨的下方运行,突然向上突破中轨,表明个股在多方力量的影响下,突破上方的压力位,个股后期可能会继续上涨,创立新高,是一种买入信号。
当上、中、下三条轨道由收敛状态,开始向上发散,则说明个股走势开始由调整阶段,开始进入上涨阶段,是一种买入信号,投资者可以选择买入一些。
股价K线带量向上突破布林线的上轨,并且TRIX指标也已经发出底位“金叉”时,说明股价即将进入一个中长期上升通道之中,这是BOLL指标发出的买入信号。此时,投资者应及时地买入股票。
python代码:
import pandas as pd
import numpy as np
import talib
# 读取股票数据
data = pd.read_csv('000271.csv', index_col=0, parse_dates=True)
# 计算BOLL指标
bollinger_k = talib.BBANDS(data['close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)['K']
bollinger_d = talib.BBANDS(data['close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)['D']
# 判断是否发出买入信号
buy_signal = np.where((data['close'] > bollinger_k) & (bollinger_d < bollinger_k), 1, 0)
# 输出结果
print(data[['close', 'bollinger_k', 'bollinger_d', 'buy_signal']])
股价在中轨的上方运行,向下跌破中轨,说明个股在空方力量的影响下,跌破中轨的支撑位,个股后期可能会继续下跌,创立新低,是一种卖出信号。
当上、中、下三条轨道由收敛状态,开始向下发散,则说明个股走势开始由调整阶段,开始进入下跌阶段,是一种卖出信号,投资者应以卖出为主。
股价K线向下突破布林线的中轨线,并且TRIX指标也在已经发出高位“死叉”时,说明股价即将进入一个中长期下降通道之中,这是BOLL指标发出的卖出信号。此时,投资者应尽早清仓离场。
当股价上涨触碰到上轨,或者严重偏离上轨,股价出现拐头向下运行时,则很有可能是主力在上方进行出货操作,是一种见顶的信号,个股即将结束上涨趋势,开启下跌趋势,是一种卖出信号。
python代码
import pandas as pd
import numpy as np
import talib
import matplotlib.pyplot as plt
# 读取股票数据
data = pd.read_csv('000271.csv', index_col=0, parse_dates=True)
# 计算BOLL指标
bollinger_k = talib.BBANDS(data['close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)['K']
bollinger_d = talib.BBANDS(data['close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)['D']
# 假设你已经计算了卖出信号 sell_signal
# sell_signal = np.where((data['close'] < bollinger_k) & (bollinger_d > bollinger_k), 1, 0)
# 绘制BOLL指标和卖出信号
plt.figure(figsize=(10,5))
plt.plot(data.index, data['close'], label='Close Price')
plt.plot(data.index, bollinger_k, label='Bollinger Band (K)')
plt.plot(data.index, bollinger_d, label='Bollinger Band (D)')
# 如果sell_signal存在,则在相应的位置上绘制卖出信号的标记
if 'sell_signal' in data.columns:
plt.plot(data[data['sell_signal']==1].index, data['close'], '^', markersize=10, label='Sell Signal')
plt.legend()
plt.show()
BOLL指标中的收口形态是指布林线的喇叭口逐渐收缩,股价波动空间收窄。这种形态通常出现在市场短期内暴涨行情的初期或市场暴跌行情的初期。当市场经过短时间的大幅拉升后,市场价格在高位出现了急速下跌的行情,此时布林线的上轨线开始急速掉头向下,而下轨线还在加速上升,这样布林线上下轨之间的形状就变成一个类似于倒的大喇叭的特殊形态,这就是收口型喇叭口形态。收口型喇叭口形态的确立是以市场的上轨线开始掉头向下、价格向下跌破短期均线为准。对于收口型喇叭口形态的出现,投资者如能及时卖出则能保住收益、减少较大的下跌损失
BOLL指标中的开口形态是指布林线的喇叭口逐渐放大,股价波动空间扩大。这种形态通常出现在市场短期内暴跌行情的初期或市场暴涨行情的初期。当市场经过短时间的大幅下跌后,市场价格在低位出现了急速上涨的行情,此时布林线的下轨线开始急速掉头向上,而上轨线还在加速下降,这样布林线上下轨之间的形状就变成一个类似于大的喇叭的特殊形态,这就是开口型喇叭口形态。开口型喇叭口形态的确立是以市场的下轨线开始掉头向上、价格向上突破短期均线为准。对于开口型喇叭口形态的出现,投资者如能及时买入则能抓住上涨机会、获取较大的收获
代码:
import pandas as pd
import numpy as np
import talib
# 读取股票数据
data = pd.read_csv('600271.csv', index_col=0, parse_dates=True)
# 计算BOLL指标
bollinger_k = talib.BBANDS(data['close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)['K']
bollinger_d = talib.BBANDS(data['close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)['D']
# 计算开口和收口
bollinger_open = np.where((bollinger_k > bollinger_d) & (data['close'] > bollinger_k), 1, 0)
bollinger_close = np.where((bollinger_k < bollinger_d) & (data['close'] < bollinger_k), 1, 0)
# 输出结果
print(data[['close', 'bollinger_k', 'bollinger_d', 'bollinger_open', 'bollinger_close']])
注意:BOLL指标还有多巧妙的用法,如果大家感兴趣看看相关的书籍,同时BOLL的买卖指标一定要结合其他的指标一起用,增加成功概率,谢谢大家?
?