首先,我们需要引入一些必要的库。其中,streamlit
是用于快速构建数据应用的库,datetime
和 pandas
用于处理日期和数据,akshare
用于获取 A 股市场的历史数据,ta_functions
则包含了各种技术指标的计算函数。
import streamlit as st
import datetime
import pandas as pd
import akshare as ak
import ta_functions as ta
接着,我们使用 streamlit
设置网页的标题和描述。当用户打开网页时,会看到应用的名称和功能简介,明确知道这个应用是做什么的。
st.write("""
# A股市场技术分析网页应用
下面展示了股票的移动平均线、布林带、MACD、商品通道指数、随机指标、威廉指标等市场技术指标!
""")
为了让用户可以自定义想要分析的股票和时间范围,我们在侧边栏添加了输入选项。通过 st.sidebar.text_input
,用户可以输入股票代码以及开始和结束日期。默认情况下,股票代码是贵州茅台(600519),开始日期是 2019-01-01,结束日期是当前日期。
st.sidebar.header("用户输入参数")
today = datetime.date.today()
def user_input_features():
ticker = st.sidebar.text_input("股票代码(例如 600519)", "600519")
start_date = st.sidebar.text_input("开始日期", "2019-01-01")
end_date = st.sidebar.text_input("结束日期", str(today))
return ticker, start_date, end_date
start = pd.to_datetime(start)
end = pd.to_datetime(end)
有了用户的输入,我们需要获取相应的股票数据。我们定义了一个函数 get_ashare_data
,利用 akshare
库来获取指定股票在指定日期范围内的历史数据。为了方便后续处理,我们将数据的列名重命名为英文,并将日期设置为索引。
def get_ashare_data(symbol, start, end):
start_date_str = start.strftime('%Y%m%d')
end_date_str = end.strftime('%Y%m%d')
data = ak.stock_zh_a_hist(
symbol=symbol, period="daily",
start_date=start_date_str, end_date=end_date_str,
adjust="qfq"
)
data.rename(
columns={
"日期": "Date", "开盘": "Open", "收盘": "Close",
"最高": "High", "最低": "Low", "成交量": "Volume"
},
inplace=True
)
data["Date"] = pd.to_datetime(data["Date"])
data.set_index("Date", inplace=True)
return data
data = get_ashare_data(symbol, start, end)
获取到数据后,我们首先绘制股票的收盘价趋势图。通过 st.line_chart
,我们可以直观地看到股票在选定时间范围内的价格走势。
st.header(f"收盘价走势 - {symbol}")
st.line_chart(data["Close"])
接下来,我们计算并展示简单移动平均线(SMA)和指数移动平均线(EMA)。移动平均线可以帮助我们平滑价格波动,识别价格趋势。其中,SMA 对所有数据赋予相同的权重,而 EMA 对近期数据赋予更大的权重。
data["SMA"] = ta.SMA(data["Close"], timeperiod=20)
data["EMA"] = ta.EMA(data["Close"], timeperiod=20)
st.header(f"简单移动平均线 vs. 指数移动平均线 - {symbol}")
st.line_chart(data[["Close", "SMA", "EMA"]])
为了更好地理解价格的波动范围,我们计算并展示了布林带(Bollinger Bands)。布林带由中轨(移动平均线)、上轨和下轨组成,可以用于判断价格的超买或超卖状态。
data["upper_band"], data["middle_band"], data["lower_band"] = ta.BBANDS(data["Close"], timeperiod=20)
st.header(f"布林带 - {symbol}")
st.line_chart(data[["Close", "upper_band", "middle_band", "lower_band"]])
然后,我们计算并展示了 MACD 指标。MACD 是一种跟踪趋势的指标,通过快慢均线的差值来反映价格变化的动量。当 MACD 线向上突破信号线时,可能是买入信号,反之亦然。
data["macd"], data["macdsignal"], data["macdhist"] = ta.MACD(
data["Close"], fastperiod=12, slowperiod=26, signalperiod=9
)
st.header(f"MACD 指标 - {symbol}")
st.line_chart(data[["macd", "macdsignal"]])
商品通道指数(CCI)也是一个常用的技术指标,用于衡量价格偏离其统计平均值的程度,识别超买或超卖状态。当 CCI 超过 +100 时,可能表示超买;低于 -100 时,可能表示超卖。
data["CCI"] = ta.CCI(data["High"], data["Low"], data["Close"], timeperiod=14)
st.header(f"商品通道指数 (CCI) - {symbol}")
st.line_chart(data["CCI"])
相对强弱指数(RSI)用于衡量价格上涨期和下跌期的力度,反映市场的超买或超卖状态。一般认为,当 RSI 超过 70 时,市场可能超买;低于 30 时,市场可能超卖。
data["RSI"] = ta.RSI(data["Close"], timeperiod=14)
st.header(f"相对强弱指数 (RSI) - {symbol}")
st.line_chart(data["RSI"])
平衡交易量(OBV)将成交量与价格变动结合起来,反映资金的流入和流出情况。OBV 上升可能表示资金流入,下降可能表示资金流出。
data["OBV"] = ta.OBV(data["Close"], data["Volume"]) / 10 ** 6
st.header(f"平衡交易量 (OBV) - {symbol}")
st.line_chart(data["OBV"])
资金流量指数(MFI)结合了价格和成交量,判断资金是流入还是流出市场。它类似于 RSI,但考虑了成交量因素。
data["MFI"] = ta.MFI(data["High"], data["Low"], data["Close"], data["Volume"], timeperiod=14)
st.header(f"资金流量指数 (MFI) - {symbol}")
st.line_chart(data["MFI"])
随机指标(STOCH)通过衡量收盘价在一段时间内相对于价格区间的位置,判断超买或超卖状态。%K 和 %D 线的交叉可以作为交易信号。
data["slowk"], data["slowd"] = ta.STOCH(
data["High"], data["Low"], data["Close"], fastk_period=14, slowk_period=3
)
st.header(f"随机指标 (STOCH) - {symbol}")
st.line_chart(data[["slowk", "slowd"]])
威廉指标(WILLR)也是用于判断超买或超卖状态的指标。当威廉指标值在 -20 以上时,可能表示超买;在 -80 以下时,可能表示超卖。
data["WILLR"] = ta.WILLR(data["High"], data["Low"], data["Close"], timeperiod=14)
st.header(f"威廉指标 (WILLR) - {symbol}")
st.line_chart(data["WILLR"])
为了了解资金的累积和分配情况,我们计算并展示了 Chaikin A/D 线(AD)。该指标将价格和成交量结合起来,用于确认价格趋势或预示趋势反转。
data["AD"] = ta.AD(data["High"], data["Low"], data["Close"], data["Volume"])
st.header(f"Chaikin A/D 线 (AD) - {symbol}")
st.line_chart(data["AD"])
平均方向性指数(ADX)用于衡量趋势的强度,无论趋势方向如何。当 ADX 高于 25 时,表示趋势强劲;低于 20 时,表示趋势疲弱。
data["ADX"] = ta.ADX(data["High"], data["Low"], data["Close"], timeperiod=14)
st.header(f"平均方向指数 (ADX) - {symbol}")
st.line_chart(data["ADX"])
标准化平均真实波幅(NATR)用于衡量价格的波动性,考虑了价格的相对变化。当波动性高时,NATR 的数值会增大。
data["NATR"] = ta.NATR(data["High"], data["Low"], data["Close"], timeperiod=14)
st.header(f"标准化平均真实波动范围 (NATR) - {symbol}")
st.line_chart(data["NATR"])
为了衡量股票相对于整体市场的波动性,我们计算了贝塔系数(BETA)。我们将上证指数(000001)作为市场基准。当 BETA 大于 1 时,股票的波动性高于市场;小于 1 时,低于市场。
market_data = get_ashare_data("000001", start, end)
data["BETA"] = ta.BETA(data["Close"], market_data["Close"], timeperiod=5)
st.header(f"贝塔系数 (BETA) - {symbol}")
st.line_chart(data["BETA"])
真实波动范围(TRANGE)反映了当天价格的真实波幅,考虑了跳空和涨跌停板的影响。
data["TRANGE"] = ta.TRANGE(data["High"], data["Low"], data["Close"])
st.header(f"真实波动范围 (TRANGE) - {symbol}")
st.line_chart(data["TRANGE"])
动量指标(Momentum)用于衡量价格的变化速度,反映市场的强弱程度。
data["MOM"] = ta.MOM(data["Close"], timeperiod=10)
st.header(f"动量 (MOM) - {symbol}")
st.line_chart(data["MOM"])
变化率指标(ROC)表示价格相对于过去一定时期的百分比变化,用于判断价格的变化趋势。
data["ROC"] = ta.ROC(data["Close"], timeperiod=10)
st.header(f"变化率 (ROC) - {symbol}")
st.line_chart(data["ROC"])
平均价格(AVGPRICE)是开盘价、最高价、最低价和收盘价的平均值,反映当日整体价格水平。
data["AVGPRICE"] = ta.AVGPRICE(data["Open"], data["High"], data["Low"], data["Close"])
st.header(f"平均价格 (AVGPRICE) - {symbol}")
st.line_chart(data["AVGPRICE"])
线性回归指标(LINEARREG)用于预测价格的趋势线,帮助我们了解价格的总体趋势。
data["LINEARREG"] = ta.LINEARREG(data["Close"], timeperiod=14)
st.header(f"线性回归 (LINEARREG) - {symbol}")
st.line_chart(data["LINEARREG"])
最后,标准差(STDDEV)衡量价格的波动性,数值越大,表示价格波动越剧烈。
data["STDDEV"] = ta.STDDEV(data["Close"], timeperiod=5)
st.header(f"标准差 (STDDEV) - {symbol}")
st.line_chart(data["STDDEV"])
通过这个应用,我们可以直观地查看一只股票的各种技术指标,为投资决策提供参考。大家可以根据自己的需求,修改代码或添加更多的技术指标。
温馨提示:技术指标仅供参考,投资有风险,入市需谨慎。建议结合基本面和市场行情综合分析。
希望这篇文章对大家有所帮助,感兴趣的朋友可以自行尝试,体验数据分析的乐趣!欢迎扫码下载本文完整代码并观看教学视频!
点击阅读原文,加入「宽客邦量化俱乐部」