Bollinger Bands是John Bollinger在20世纪80年代开发的技术分析工具。交易员用它来衡量潜在的价格走势。下图显示了股票的20天滚动平均线样本及其相应的布林带。

在本文中,我们将讨论如何获取给定股票的历史数据,计算和绘制其移动平均线和布林带,并解释图表。我们将分别使用python库、yfinance和matplotlib来获取数据和绘制图表。
yfinance是一个Python库,为访问雅虎财经的历史市场数据、实时数据和其他财务信息提供了一个简单的界面。它允许用户轻松检索历史股价、股息、公司行为等数据。运行以下命令来安装yfinance。
pip安装yfinance
了解布林带
布林带由价格图表上绘制的三条线组成:一条中线表示简单移动平均线(通常在20个周期内计算),以及通常距离移动平均线两个标准差的上线和下线。随着市场波动性的增加或减少,这些频段根据波动性、扩张和收缩进行动态调整。
以下是布林带组件的细分:
- 中线(简单移动平均线):
- 布林带的中线是特定时期(通常为20个时期)收盘价的简单移动平均线(SMA)。
- 它作为基线,代表所选期间证券的平均价格。
2.上频段:
- 上带是通过在中间线上加两个标准差来计算的。
- 它代表了预期价格走势的上限。
- 在上升趋势期间,它往往充当阻力水平。
3.下频段:
- 下带是通过从中线减去两个标准差来计算的。
- 它代表了预期价格走势的下限。
- 在下降趋势期间,它往往充当支撑水平。
解释和使用:
- 波动性测量:布林带根据市场波动性扩张和收缩。宽带表示高波动性,而窄频段表示低波动性。
- 超买和超卖条件:当价格触及或超过上区间时,可能表明证券超买,并可能发生逆转或回调。相反,当价格触及或跌破较低区间时,可能表明证券超卖,并可能出现上行的潜在逆转。
- 趋势确认:布林带可用于确认其他指标或分析方法确定的趋势。在上升趋势中,价格倾向于拥抱上带,而在下行趋势中,它倾向于保持在下带附近。
- 交易信号:交易员经常使用布林带来识别交易的进入和退出点。例如,当价格接触到下波段时买入,当它触及上波段时卖出(反之亦然)。
总体而言,布林带是交易员和分析师使用的多功能工具,用于评估市场波动性,识别潜在的逆转,确认趋势并生成交易信号。它们提供了关于价格行动的宝贵见解,并可以纳入不同金融市场的各种交易策略。
使用Python绘制布林带
我们需要使用雅虎金融API(yfinance)获取股票数据,使用Pandas库将其转换为结构化格式,然后使用matplotlib将其与Bollinger Bands一起可视化。
- 获取库存数据:
def fetch_stock_data(stock_symbol):
尝试:
# 获取股票数据
股票 = yf.Ticker(stock_symbol)
stock_data = stock.history(period="12mo")
#将“关闭”列转换为数字
stock_data['Close'] = pd.to_numeric(stock_data['Close'])
返回股票_数据
例外情况除外:
print("获取股票数据时出错:", str(e))
返回无
- fetch_stock_data(stock_symbol)函数将股票符号作为输入参数。
- 它利用yfinance库获取过去12个月(period=”12mo”指定符号的历史股票数据。
- 股票数据的“关闭”列转换为数字格式。
现在,让我们尝试为TATASTEEL运行此方法,并检查响应。
stock_data = fetch_stock_data(stock_symbol='TATASTEEL.NS')
打印(stock_data.head())

- 绘制布林带:
def plot_bollinger_bands(stock_data):plt.figure(figsize=(12,6)) #绘制股票收盘价plt.plot(stock_data['关闭'],标签=“关闭价格”)plt.figure(figsize=(12,6)) # 计算和绘制20天滚动平均值stock_data['MA20'] = stock_data['Close'].rolling(window=20).mean()plt.plot(stock_data['MA20'],label='20-Day Rolling Average') # 计算和绘制布林带stock_data['20D_MA'] = stock_data['Close'].rolling(window=20).mean()stock_data['Upper_band'] = stock_data['20D_MA'] + 2 * stock_data['Close'].rolling(window=20).std()stock_data['Lower_band'] = stock_data['20D_MA'] - 2 * stock_data['Close'].rolling(window=20).std()plt.plot(stock_data['Upper_band'], label='Upper Bollinger Band', linestyle='--', color='red')plt.plot(stock_data['Lower_band'], label='Lower Bollinger Band', linestyle='--', color='green') plt.title(“滚动平均和布林带的股票数据”)plt.xlabel('日期')plt.ylabel('价格')plt.legend()plt.show()
- 函数plot_bollinger_bands(stock_data)将获取的股票数据作为输入。
- 它创建了一个matplotlib数字,并绘制了股票的收盘价。
- 它计算股票收盘价的20天滚动平均数并绘制出来。
- 它根据20天滚动平均值和标准差计算上下布林带。
- 然后将这些波段与收盘价一起绘制。

现在,你需要做的就是在蓝线到达下频段时买入,在超过红线时卖出!交易愉快 :)
如果您想与其他股票代码一起玩,这是完整代码。
from datetime import datetime
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt
def fetch_stock_data(stock_symbol):
try:
# Fetching stock data
stock = yf.Ticker(stock_symbol)
stock_data = stock.history(period="12mo")
print(stock_data.head())
# Convert 'Close' column to numeric
stock_data['Close'] = pd.to_numeric(stock_data['Close'])
return stock_data
except Exception as e:
print("Error fetching stock data:", str(e))
return None
def plot_bollinger_bands(stock_data):
plt.figure(figsize=(12, 6))
# Plotting stock closing price
plt.plot(stock_data['Close'], label='Close Price')
plt.figure(figsize=(12, 6))
# Calculating and plotting 20-day rolling average
stock_data['MA20'] = stock_data['Close'].rolling(window=20).mean()
plt.plot(stock_data['MA20'], label='20-Day Rolling Average')
# Calculating and plotting Bollinger Bands
stock_data['20D_MA'] = stock_data['Close'].rolling(window=20).mean()
stock_data['Upper_band'] = stock_data['20D_MA'] + 2 * stock_data['Close'].rolling(window=20).std()
stock_data['Lower_band'] = stock_data['20D_MA'] - 2 * stock_data['Close'].rolling(window=20).std()
plt.plot(stock_data['Upper_band'], label='Upper Bollinger Band', linestyle='--', color='red')
plt.plot(stock_data['Lower_band'], label='Lower Bollinger Band', linestyle='--', color='green')
plt.title('Stock Data with Rolling Average and Bollinger Bands')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/283855
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!