我用Python写了个实时板块资金热力图 🎨💰

我用Python写了个实时板块资金热力图 🎨💰

大家好,这里是花姐,今天带来一个有点"热辣滚烫"的Python实战项目------实时板块资金热力图!🔥

这两年,股市的热度时高时低,但大家对资金流向的关注度始终不减。有没有办法直观地看到哪些板块在吸金,哪些板块在被资金抛弃呢?答案是:当然有!

于是,我撸起袖子,用 Python + Streamlit + AkShare + Plotly 搞了一款实时的资金流向可视化工具,颜值爆表,还能自动刷新,堪称炒股助手!🎯

📌 需求分析

在金融市场里,资金流向是一个很重要的指标,主力资金的流入流出往往决定了一个板块的短期走势。

我们希望做到:

实时获取资金流向数据 ,并展示行业板块的资金进出情况

可视化呈现数据 ,用颜色区分资金净流入和净流出,一眼就能看出哪些板块是**"香饽饽",哪些是 "弃儿"**。

自动刷新,让用户无需手动点刷新,信息一直是最新的。

有了目标,就开始撸代码吧!🚀

🛠 技术栈

  • Streamlit:Python神器,一键搞定Web应用。
  • AkShare:国内行情数据神器,能直接获取资金流向数据。
  • Plotly :强大的可视化库,这次用它做树状热力图
  • Pandas:数据处理少不了它。

📊 代码实现

1. 获取资金流向数据

股市数据当然得从靠谱的地方获取,我们用 AkSharestock_sector_fund_flow_rank 来搞定资金流数据:

python 复制代码
import akshare as ak
import pandas as pd

def process_data(indicator):
    """获取并处理资金流数据"""
    try:
        raw = ak.stock_sector_fund_flow_rank(
            indicator=indicator,
            sector_type="行业资金流"
        )
        df = raw.rename(columns={'名称': '板块名称'})
        df['资金净流入(亿)'] = df['主力净流入-净额'] / 100000000  # 转换为"亿"
        df['资金净流入(亿)'] = df['资金净流入(亿)'].round(2)  # 保留两位小数
        df['涨跌幅'] = pd.to_numeric(df['涨跌幅'], errors='coerce')
        df['流向强度'] = abs(df['资金净流入(亿)'])
        return df.dropna(subset=['资金净流入(亿)'])
    except Exception as e:
        print(f"数据获取失败: {e}")
        return pd.DataFrame()

这样,我们可以用 process_data("今日") 来获取今日的行业板块资金流数据。


2. 生成热力图 🎨

有了数据,接下来就是可视化部分了,我们用 Plotly 画一个树状热力图

python 复制代码
import plotly.express as px

COLOR_SCALE = [
    [0.0, "#00ff00"],  # 绿色(流出最大)
    [0.45, "#dfffdf"], # 浅绿色(小幅流出)
    [0.5, "#ffffff"],  # 白色(平衡点)
    [0.55, "#ffe5e5"], # 浅红色(小幅流入)
    [1.0, "#ff0000"]   # 红色(流入最大)
]

def generate_heatmap(df):
    """生成树状热力图"""
    fig = px.treemap(
        df,
        path=['板块名称'],
        values='流向强度',
        color='资金净流入(亿)',
        color_continuous_scale=COLOR_SCALE,
        hover_data={
            '涨跌幅': ':%',
            '资金净流入(亿)': ':'
        },
        height=800
    )
    return fig

这张图的颜色代表资金的流向,红色表示资金流入,绿色表示资金流出,一眼就能看出主力资金的动向


3. 使用 Streamlit 构建交互界面

有了数据和图表,我们用 Streamlit 搭建一个 Web 界面:

python 复制代码
import streamlit as st
from datetime import datetime

def sidebar_controls():
    with st.sidebar:
        st.header("控制面板")
        indicator = st.radio("分析周期", ["今日", "5日", "10日"], index=0, horizontal=True)
        refresh_interval = st.slider("自动刷新间隔 (秒)", 60, 3600, 60, 60)
        return indicator, refresh_interval

def main_display(df):
    st.title("📊 资金流向热力图")
    st.caption(f"数据更新时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

    if not df.empty:
        st.plotly_chart(generate_heatmap(df), use_container_width=True)
    else:
        st.warning("⚠️ 数据获取失败,请检查网络连接")

4. 自动刷新系统

资金流是动态的,当然不能只显示静态数据 ,我们加个 自动刷新功能

python 复制代码
import time

def auto_refresh_system(refresh_interval):
    time.sleep(refresh_interval)
    st.rerun()

5. 整合一键运行 🚀

python 复制代码
if __name__ == "__main__":
    st.set_page_config(layout="wide")
    indicator, refresh_interval = sidebar_controls()
    df = process_data(indicator)
    main_display(df)
    auto_refresh_system(refresh_interval)

只要运行 streamlit run app.py,就能看到实时的资金流向热力图了!🎉


🎯 成果展示

运行之后,你会看到一个 大屏可视化的热力图,资金流向一目了然:

  • 颜色:红色代表资金流入,绿色代表流出,越深代表金额越大。
  • 自动刷新,完全不用手动点击更新!
  • 交互性:鼠标悬停可以查看详细数据。

这比在 Excel 里手动分析好用多了吧?😆


最终源码(粘贴过来就能用)

python 复制代码
import streamlit as st
import akshare as ak
import plotly.express as px
import pandas as pd
import time
from datetime import datetime
from decimal import Decimal, ROUND_HALF_UP

# 自定义颜色映射
COLOR_SCALE = [
    [0.0, "#00ff00"],  # 绿色(资金流出最大)
    [0.45, "#dfffdf"], # 浅绿色(小幅流出)
    [0.5, "#ffffff"],  # 白色(平衡点)
    [0.55, "#ffe5e5"], # 浅红色(小幅流入)
    [1.0, "#ff0000"]   # 红色(资金流入最大)
]

# 数据预处理增强版
@st.cache_data(ttl=300)
def process_data(indicator):
    """强化数据预处理逻辑"""
    try:
        raw = ak.stock_sector_fund_flow_rank(
            indicator=indicator,
            sector_type="行业资金流"
        )
        raw.columns = raw.columns.str.replace(indicator, '', regex=False)
        
        # 数值转换
        df = raw.rename(columns={'名称': '板块名称'})
        
        df['资金净流入(亿)'] = df['主力净流入-净额'] / 100000000
        df['资金净流入(亿)'] = df['资金净流入(亿)'].round(2)

        df['涨跌幅'] = pd.to_numeric(df['涨跌幅'], errors='coerce')
        
        # 流向强度计算
        df['流向强度'] = abs(df['资金净流入(亿)'])
        
        return df.dropna(subset=['资金净流入(亿)'])
    except Exception as e:
        st.error(f"数据错误: {str(e)}")
        return pd.DataFrame()

# 热力图生成引擎
def generate_heatmap(df):
    """生成符合金融行业标准的树状热力图"""
    fig = px.treemap(
        df,
        path=['板块名称'],
        values='流向强度',
        color='资金净流入(亿)',
        color_continuous_scale=COLOR_SCALE,
        range_color=[-max(abs(df['资金净流入(亿)'].min()), abs(df['资金净流入(亿)'].max())),
                 max(abs(df['资金净流入(亿)'].min()), abs(df['资金净流入(亿)'].max()))],
        color_continuous_midpoint=0,
        branchvalues='total',
        hover_data={
            '涨跌幅': ':%',
            '资金净流入(亿)': ':',
            '主力净流入-净占比': ':%'
        },
        height=1000
    )
    
    # 高级样式配置
    fig.update_traces(
        texttemplate=(
            "<b>%{label}</b><br>"
            "📈%{customdata[0]}%<br>"
            "💰%{customdata[1]}亿"
        ),
        hovertemplate=( 
            "<b>%{label}</b><br>"
            "涨跌幅: %{customdata[0]}%<br>"
            "资金净流入: <b>%{customdata[1]}</b>亿<br>"
            "主力占比: %{customdata[2]}%"
        ),
        textfont=dict(size=18, color='black')
    )
    
    fig.update_layout(
        margin=dict(t=0, l=0, r=0, b=0),
        coloraxis_colorbar=dict(
            title="资金流向(亿)",
            ticks="inside",
            thickness=20,
            len=0.6,
            y=0.7
        )
    )
    return fig

# 侧边栏控件组
def sidebar_controls():
    with st.sidebar:
        st.header("控制面板")
        indicator = st.radio(
            "分析周期",
            ["今日", "5日", "10日"],
            index=0,
            horizontal=True
        )
        refresh_interval = st.slider(
            "自动刷新间隔 (秒)",
            min_value=60, max_value=3600,
            value=60, step=60,
            help="设置自动刷新间隔,默认1分钟"
        )
        return indicator, refresh_interval

# 主界面
def main_display(df):
    st.title("📊 资金流向热力图")
    st.caption(f"数据更新于: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    
    if not df.empty:
        with st.spinner("生成可视化..."):
            st.plotly_chart(generate_heatmap(df), use_container_width=True)
        
        # 动态摘要面板
        with st.expander("📌 实时快报", expanded=True):
            col1, col2, col3 = st.columns(3)
            col1.metric("🔥 最强流入", 
                       f"{df['资金净流入(亿)'].max():.2f}亿",
                       df.loc[df['资金净流入(亿)'].idxmax(), '板块名称'])
            col2.metric("💧 最大流出", 
                       f"{df['资金净流入(亿)'].min():.2f}亿",
                       df.loc[df['资金净流入(亿)'].idxmin(), '板块名称'])
            col3.metric("⚖️ 多空比", 
                       f"{len(df[df['资金净流入(亿)']>0])}:{len(df[df['资金净流入(亿)']<0])}",
                       f"总净额 {df['资金净流入(亿)'].sum():.2f}亿")
    else:
        st.warning("⚠️ 数据获取失败,请检查网络连接")

# 自动刷新系统
def auto_refresh_system(refresh_interval):
    time.sleep(refresh_interval)
    st.rerun()
    print("数据刷新了")

# 主程序
if __name__ == "__main__":
    st.set_page_config(layout="wide")
    indicator, refresh_interval = sidebar_controls()
    df = process_data(indicator)
    main_display(df)
    auto_refresh_system(refresh_interval)

🏆 总结

这个项目用 Python 搞定了: ✅ 数据抓取(AkShare)

数据处理(Pandas)

交互式可视化(Plotly)

Web 界面(Streamlit)

自动刷新机制

一句话总结:用最少的代码,做出了最直观的金融数据可视化!💡

对于炒股的朋友,这个工具可以帮助你快速了解市场资金流向,不用再看密密麻麻的表格了!📈

喜欢的话,记得点个赞❤️,咱们下次见!🎉

相关推荐
databook6 分钟前
多变量决策树:机器学习中的“多面手”
python·机器学习·scikit-learn
linux kernel21 分钟前
Python基础语法2
开发语言·python
互联网搬砖老肖38 分钟前
python成功解决AttributeError: can‘t set attribute ‘lines‘
开发语言·python
奋斗者1号1 小时前
深入解析 sklearn 中的 LabelEncoder:功能、使用场景与注意事项
人工智能·python·sklearn
CrawlerCracker1 小时前
小程序逆向|六六找房|请求头Authorization
javascript·爬虫·python·小程序·网络爬虫·js
大霸王龙1 小时前
基于 Streamlit 的 PDF 编辑器
python·pdf·编辑器·streamlit
一瞬祈望1 小时前
从零开始:Python运行环境之VSCode与Anaconda安装配置全攻略 (1)
开发语言·vscode·python
huid1 小时前
# 使用 uv 管理 Python 项目
python
栩栩云生2 小时前
📥 x-cmd install | Toolong - 终端日志分析的瑞士军刀
运维·python·数据分析
前端小干将2 小时前
安装python
python