用Python 和 Streamlit 对A股技术分析

科技   2024-10-09 21:45   广东  

大家好,我是橙哥!最近两天,股市出现了回调,给过度狂热的市场降了温。在这个关键时刻,正是我们学习量化交易的绝佳机会。通过抓住当前市场的变化,我们可以更深入地理解量化交易的原理和应用,为未来的投资奠定坚实的基础。今天我想和大家分享一个使用 Python 和 Streamlit 开发的 A 股市场技术分析网页应用。这个应用可以展示股票的移动平均线、布林带、MACD、CCI、RSI 等多种技术指标,对于想要快速了解股票技术面情况的朋友来说,是一个非常实用的工具。加入宽客邦量化俱乐部」或在文末扫码获取本文完整源码。

首先,我们需要引入一些必要的库。其中,streamlit 是用于快速构建数据应用的库,datetimepandas 用于处理日期和数据,akshare 用于获取 A 股市场的历史数据,ta_functions 则包含了各种技术指标的计算函数。

import streamlit as stimport datetimeimport pandas as pdimport akshare as akimport 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 ** 6st.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"])

通过这个应用,我们可以直观地查看一只股票的各种技术指标,为投资决策提供参考。大家可以根据自己的需求,修改代码或添加更多的技术指标。

温馨提示:技术指标仅供参考,投资有风险,入市需谨慎。建议结合基本面和市场行情综合分析。

希望这篇文章对大家有所帮助,感兴趣的朋友可以自行尝试,体验数据分析的乐趣!欢迎扫码下载本文完整代码并观看教学视频!


点击阅读原文,加入「宽客邦量化俱乐部

开发者阿橙
宽客邦量化创始人。专注AI技术应用、机器学习与量化投资。
 最新文章