Skip to content

Python + Streamlit:一键实现股票趋势分析可视化,带你看清投资方向(附工具)

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

写在前面的话:在股市的浪潮里,我们都怀揣着财富增值的梦想。可面对复杂多变的股票走势,怎样才能拨开迷雾,找准投资方向呢?今天就给大家分享一个超实用的方法:利用 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 代码,结合相关程序库,可以对股票趋势进行量化和可视化分析。
  • 实践操作:大家可以自己动手尝试用代码分析股票趋势,也可以通过互动应用或 下载源代码进一步探索。

感谢您阅读到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!


本文内容仅限技术探讨和学习,不构成任何投资建议。

Published inAI&Invest专栏

Be First to Comment

    发表回复