作者:老余捞鱼
原创不易,转载请标明出处及原作者。

写在前面的话:在股市的浪潮里,我们都怀揣着财富增值的梦想。可面对复杂多变的股票走势,怎样才能拨开迷雾,找准投资方向呢?今天就给大家分享一个超实用的方法:利用 Python 和 Streamlit 实现股票趋势的可视化分析,大家赶紧码住!
一、什么是股票趋势分析?
简单来说,股票趋势就是股票市场在某段时间内的总体走向。一般可以把它分为三种:

- 上升趋势:这种趋势下,股票价格就像坐了火箭一样,蹭蹭往上涨,买了这只股票的人心里肯定乐开了花。
- 下降趋势:和上升趋势相反,股票价格持续下跌,持有股票的人估计得愁坏了。
- 横盘趋势:这时候股票市场就像在 “原地踏步”,价格在一个相对稳定的区间内波动,买卖双方好像都有点犹豫不决。
了解这些趋势可不仅仅是满足好奇心,更重要的是,它能帮你制定出更靠谱的投资策略,在股市里多赚钱。
那股票趋势分析为什么显得这么重要?主要是因为以下几点原因:

- 分析历史业绩:通过研究股票的历史数据,我们能发现一些规律和模式,这些信息可以帮助我们预测股票未来的走势。我们可以重点关注 200 天简单移动平均线(SMA),它能让我们更直观地了解股票价格的变化趋势。
- 把握投资时机:知道股票是处于上升趋势还是下降趋势,对我们什么时候买入和卖出股票非常关键。在上升趋势中买入股票,随着股价的上涨,我们就能获得不错的收益;相反,如果在下降趋势中买入,可能就会亏损。所以,把握好投资时机,能让我们的收益最大化。
- 控制投资风险:了解股票趋势的周期,还能帮助我们更好地控制风险。比如,我们可以根据趋势的变化设置止损订单,当股票价格下跌到一定程度时,自动卖出股票,这样就能避免损失进一步扩大。
为此,我编写了一个股票趋势的可视化分析,实现起来 so easy。

体验地址如下:
https://trends-and-their-cycles-ejycvqsgshjo5eqz7fafog.streamlit.app
二、四步搞定可视化股票趋势分析
说了这么多,大家肯定想知道怎么才能更准确地可视化分析股票趋势吧?今天我就教大家用 来实现这个功能,让你轻松掌握股票走势分析技巧。
步骤 1:搭建分析工具
要开启我们的股票趋势分析之旅,首先得准备好 “武器”。Python,作为当下最热门的编程语言之一,拥有强大的数据处理和分析能力,在金融领域也是大显身手。而 Streamlit 这个神奇的工具,能让我们轻松搭建出网页应用,把分析结果直观地展示出来。
import streamlit as st
import yfinance as yf
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime, timedelta
from pathlib import Path
import appdirs as ad
streamlit
:用来搭建网页应用程序界面,方便我们操作和展示分析结果。yfinance
:可以从雅虎财经获取股票的历史数据,包括开盘价、收盘价、最高价、最低价和成交量等。pandas
:这是一个功能强大的数据处理和分析库,能帮我们对股票数据进行整理和分析。plotly.graph_objects
:用于创建交互式的绘图和图表,让我们能更直观地看到股票走势。datetime
和timedelta
:它们主要负责处理日期和时间相关的操作。
步骤 2:确定分析目标与获取数据
接着,我们要挑选一只股票进行分析。代码里已经预先准备了美股中热门的 100 个股票代码,像苹果(AAPL)、微软(MSFT)等,当然您也可以手动输入yfinance
能识别的股票代码(包括A股)。
是Streamlit 的selectbox
组件让我们可以很方便地选择自己感兴趣的股票:
tickers = [
'AAPL', 'MSFT', 'GOOGL', 'AMZN', 'META', 'TSLA', 'BRK-B', 'NVDA', 'JPM', 'JNJ',
'V', 'PG', 'UNH', 'HD', 'MA', 'DIS', 'PYPL', 'NFLX', 'CMCSA', 'PEP',
'VZ', 'T', 'MRK', 'INTC', 'CSCO', 'ABT', 'NKE', 'PFE', 'XOM', 'TMO',
'ACN', 'IBM', 'CVX', 'LLY', 'PM', 'WMT', 'MDT', 'COST', 'AMGN', 'TXN',
'AVGO', 'ADBE', 'QCOM', 'BMY', 'NOW', 'LMT', 'ISRG', 'SBUX', 'CAT',
'HON', 'NEM', 'SYY', 'AMAT', 'ATVI', 'CHTR', 'GILD', 'ADI', 'SYK', 'FISV',
'DHR', 'MMC', 'LRCX', 'SPGI', 'C', 'BA', 'ADP', 'CME', 'BIIB', 'MS',
'ZTS', 'GS', 'NTRS', 'LHX', 'MET', 'SRE', 'KMB', 'ADSK', 'NTES', 'CDW',
'CB', 'PXD', 'LNT', 'DOW', 'CARR', 'MPC', 'ETR', 'HIG', 'VRTX', 'NDAQ',
'FIS', 'DTE', 'TSN', 'OXY', 'MDLZ', 'PSA', 'CDK', 'MAR', 'FANG'
]
selected_ticker = st.selectbox('选择股票代码:', tickers)
有了目标股票,下一步就是获取它的历史数据。我们设定从 2019 年 1 月 1 日到 2025 年 3 月 24 日这个时间段来获取数据,代码如下:
start_date = '2019-01-01'
end_date = '2025-03-24'
st.write(f"尝试下载 {selected_ticker} 的数据,从 {start_date} 到 {end_date}...")
data = yf.download(selected_ticker, start=start_date, end=end_date, progress=False, timeout=10)
if data.empty:
st.write(f"无法获取 {selected_ticker} 的数据,可能是股票代码无效、数据不可用或 Yahoo Finance API 限制。")
st.write("请尝试其他股票代码或稍后重试。")
st.stop()
步骤 3:趋势计算与分析
在这堆数据里,有个很重要的指标 ——200 日移动平均线(SMA_200),它能帮助我们看清股票价格的长期趋势。计算它的代码很简单:
data['SMA_200'] = data['Close'].rolling(window=200).mean()
有了 200 日移动平均线,接下来就要确定股票处于上升趋势还是下降趋势,以及这些趋势的周期。代码通过比较每天的 200 日 SMA 和前一天的 SMA 来判断:
for i in range(1, len(data)):
if pd.isna(data['SMA_200'].iloc[i]) or pd.isna(data['SMA_200'].iloc[i - 1]):
continue
if data['SMA_200'].iloc[i] > data['SMA_200'].iloc[i - 1]:
if current_trend != 'uptrend':
if current_trend == 'downtrend' and downtrend_periods:
downtrend_periods[-1][1] = data.index[i - 1]
uptrend_periods.append([data.index[i - 1], None])
current_trend = 'uptrend'
elif data['SMA_200'].iloc[i] < data['SMA_200'].iloc[i - 1]:
if current_trend != 'downtrend':
if current_trend == 'uptrend' and uptrend_periods:
uptrend_periods[-1][1] = data.index[i - 1]
downtrend_periods.append([data.index[i - 1], None])
current_trend = 'downtrend'
如果当天的 200 日 SMA 大于前一天,股票可能处于上升趋势;反之,则可能处于下降趋势。程序会把这些趋势的起始时间和结束时间记录下来,形成一个个趋势周期。
但不是所有的趋势周期都有参考价值,我们希望保留那些持续时间较长的趋势。代码会过滤掉持续时间小于 50 天的趋势期:
filtered_uptrend_periods = [period for period in uptrend_periods if (period[1] - period[0]).days > 50]
filtered_downtrend_periods = [period for period in downtrend_periods if (period[1] - period[0]).days > 50]
同时,注意我们还会合并连续的、间隔在 50 天以内的相同趋势周期。经过这样的筛选和合并,得到的趋势周期更能反映股票价格的真实走向,分析结果也就更精准。
步骤 4:分析图表展示
一切准备就绪,最后就是把分析结果用图表展示出来。这里我们用Plotly
来创建图表,并在图表下方把趋势周期的数量以及每个周期的详细信息展示出来。
fig = go.Figure()
fig.add_trace(go.Scatter(
x=data.index,
y=data['Close'],
mode='lines',
name=f'{selected_ticker} 收盘价',
line=dict(color='blue')
))
fig.add_trace(go.Scatter(
x=data.index,
y=data['SMA_200'],
mode='lines',
name='200日移动平均线(完整)',
line=dict(color='gray', dash='dash')
))
# 篇幅所限,完整代码在文末下载。
# 在图表下方显示趋势周期数量
st.markdown(f"**上升趋势周期数量: {len(merged_uptrend_periods)}**")
for start, end in merged_uptrend_periods:
duration = (end - start).days
st.write(f"**下降趋势周期:** 开始: {start.strftime('%Y-%m-%d')}, 结束: {end.strftime('%Y-%m-%d')}, 持续时间: {duration} 天")

图表里,蓝色线条代表股票的收盘价,绿色线条是上升趋势下的 200 日移动平均线,红色线条是下降趋势下的 200 日移动平均线,而黄色线条则表示趋势之间的间隔。通过这个图表,我们可以一目了然地看到股票价格的走势,以及不同趋势阶段的变化情况。

我们还可以清楚地看到上升趋势和下降趋势各有多少个周期,每个周期从什么时候开始,到什么时候结束,持续了多少天。这些信息对于我们判断股票的未来走势,制定投资策略非常有帮助。
通过 Python 和 Streamlit 的完美配合,我们实现了股票趋势的可视化分析,从数据获取到结果展示,一气呵成。现在,你也可以用这个方法,去分析自己关注的股票,看清投资方向,在股市里迈出更稳健的步伐。
三、观点总结
股票趋势分析对于我们在股市投资至关重要。了解股票趋势及其周期,不仅能帮助我们分析股票的历史业绩、把握投资时机,还能更好地控制风险。通过Python 和 Streamlit ,我们可以更科学、准确地分析股票走势,为投资决策提供有力支持。
- 趋势类型:股票趋势分为上升、下降和横盘三种,不同趋势代表着不同的市场情况。
- 趋势周期:趋势有积累、公众参与、分销和恐慌抛售四个阶段,认识这些阶段有助于把握投资时机。
- 重要性:分析股票趋势能帮助我们分析历史业绩、把握投资时机和控制风险。
- 分析方法:利用 Python 代码,结合相关程序库,可以对股票趋势进行量化和可视化分析。
- 实践操作:大家可以自己动手尝试用代码分析股票趋势,也可以通过互动应用或 下载源代码进一步探索。
感谢您阅读到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!
本文内容仅限技术探讨和学习,不构成任何投资建议。
Be First to Comment