Python實戰:基于Streamlit的股票篩選系統,實時K線圖+數據緩存優化

基于?Streamlit?構建的股票篩選分析工具,整合了?Tushare?接口獲取股票數據,并通過交互式界面實現股票篩選、信息展示和 K 線圖分析。以下是深度解讀:


一、代碼結構概覽

  1. 依賴庫導入

    import streamlit as st
    import tushare as ts
    import pandas as pd
    import plotly.graph_objects as go
    • Streamlit:用于構建 Web 應用界面。
    • Tushare:提供股票市場數據接口。
    • Pandas:數據處理和分析。
    • Plotly:生成交互式圖表(如 K 線圖)。
  2. Tushare API 配置

    ts.set_token("Your_API_Token_Here")
    pro = ts.pro_api()
    • 需替換為實際的 Tushare Token,否則無法獲取數據。

二、核心功能模塊分析

1. 獲取股票基礎信息(get_stock_list
@st.cache_data
def get_stock_list():# 獲取股票基本信息(如代碼、名稱、行業、市值等)df = pro.stock_basic(list_status="L", fields="ts_code,symbol,name,area,industry,list_date")# 填充缺失值df["area"] = df["area"].fillna("Unknown")df["industry"] = df["industry"].fillna("Unknown")# 獲取并處理市值數據market_cap_data = pro.daily_basic()market_cap_data["total_mv"] = market_cap_data["total_mv"] / 10000  # 轉換為億元# 合并數據集df = pd.merge(df, market_cap_data[["ts_code", "total_mv"]], on="ts_code", how="left")df = df.rename(columns={"total_mv": "market_cap"})return df
  • 功能:獲取股票基礎信息并合并市值數據。
  • 優化點
    • list_status="L"?表示只獲取上市股票(非停牌)。
    • @st.cache_data?緩存數據,避免重復請求。
    • 市值數據轉換為億元(/10000)提高可讀性。

2. 獲取股票日線數據(get_daily_data
@st.cache_data
def get_daily_data(ts_code):data = pro.daily(ts_code=ts_code)data["trade_date"] = pd.to_datetime(data["trade_date"])return data.sort_values("trade_date")
  • 功能:根據股票代碼獲取日線數據(如開盤價、收盤價等)。
  • 優化點
    • @st.cache_data?緩存數據,提升性能。
    • 日期格式轉換為?datetime?類型,便于后續篩選。

3. 主界面邏輯(main()
def main():st.title("股票篩選分析工具")# 側邊欄篩選min_market_cap = st.sidebar.number_input("最小市值(億)", value=100)max_market_cap = st.sidebar.number_input("最大市值(億)", value=1000)selected_industry = st.sidebar.multiselect("選擇行業", stocks["industry"].unique())selected_area = st.sidebar.multiselect("選擇地域", stocks["area"].unique())# 應用篩選條件filtered_stocks = stocks[(stocks["market_cap"] >= min_market_cap) & (stocks["market_cap"] <= max_market_cap)]if selected_industry: filtered_stocks = filtered_stocks[filtered_stocks["industry"].isin(selected_industry)]if selected_area: filtered_stocks = filtered_stocks[filtered_stocks["area"].isin(selected_area)]# 展示結果st.dataframe(filtered_stocks.sort_values(by="market_cap", ascending=False))
  • 功能:通過側邊欄提供篩選選項(市值、行業、地域),并展示符合條件的股票列表。
  • 交互亮點
    • 動態篩選:實時響應用戶輸入(無需刷新頁面)。
    • 數據排序:按市值從高到低展示,便于用戶快速定位。

4. 個股詳情分析
if not filtered_stocks.empty:selected_stock = st.selectbox("選擇股票查看詳情", filtered_stocks["name"])start_date = st.date_input("開始日期", value=today - pd.Timedelta(days=365))end_date = st.date_input("結束日期", value=today)# 獲取日線數據并繪制K線圖stock_code = filtered_stocks[filtered_stocks["name"] == selected_stock]["ts_code"].values[0]daily_data = get_daily_data(stock_code)daily_data = daily_data[(daily_data["trade_date"] >= start_date) &(daily_data["trade_date"] <= end_date)]# 繪制K線圖fig = go.Figure(data=[go.Candlestick(x=daily_data["trade_date"],open=daily_data["open"],high=daily_data["high"],low=daily_data["low"],close=daily_data["close"],increasing_line_color="green",decreasing_line_color="red",)])st.plotly_chart(fig, use_container_width=True)
  • 功能:選擇某只股票后,展示其歷史 K 線圖。
  • 圖表設計
    • 使用?Plotly?的?Candlestick?組件生成交互式 K 線圖。
    • 顏色區分漲跌(漲:綠色,跌:紅色)。
    • 用戶可縮放/平移查看歷史數據。

三、代碼特征

  1. 交互式篩選與可視化

    • 通過?Streamlit?的組件(如?number_inputmultiselectselectbox)實現動態交互。
    • 實時響應:用戶操作后,界面立即更新,無需手動刷新。
  2. 數據緩存優化

    • 使用?@st.cache_data?緩存股票列表和日線數據,減少 API 請求次數。
    • 適用于頻繁訪問的場景(如股票篩選)。
  3. 異常處理與用戶體驗

    • 缺失值處理:填充?area?和?industry?的缺失值為 "Unknown"。
    • 數據缺失提示:若 K 線數據缺失,提示用戶并使用前值填充。
    • 空結果提示:若篩選條件不匹配,顯示警告信息。

四、完整代碼

import streamlit as st
import tushare as ts
import pandas as pd
import plotly.graph_objects as go
import sys
import os# 設置Tushare API(需替換為您的實際Token)
ts.set_token("Your_API_Token_Here")
pro = ts.pro_api()# 緩存股票基礎數據
@st.cache_data
def get_stock_list():# 獲取股票基本信息df = pro.stock_basic(exchange="", list_status="L", fields="ts_code,symbol,name,area,industry,list_date")# 處理缺失值df["area"] = df["area"].fillna("Unknown")df["industry"] = df["industry"].fillna("Unknown")# 獲取并處理市值數據market_cap_data = pro.daily_basic()market_cap_data["total_mv"] = market_cap_data["total_mv"] / 10000  # 轉換為億元# 合并數據集df = pd.merge(df, market_cap_data[["ts_code", "total_mv"]], on="ts_code", how="left")df = df.rename(columns={"total_mv": "market_cap"})return df# 緩存股票日線數據
@st.cache_data
def get_daily_data(ts_code):data = pro.daily(ts_code=ts_code)data["trade_date"] = pd.to_datetime(data["trade_date"])return data.sort_values("trade_date")# 主應用界面
def main():st.title("股票篩選分析工具")# 側邊欄篩選選項st.sidebar.header("篩選條件")# 獲取股票數據stocks = get_stock_list()# 市值范圍篩選min_market_cap = st.sidebar.number_input("最小市值(億)", min_value=0, value=100)max_market_cap = st.sidebar.number_input("最大市值(億)", min_value=0, value=1000)# 行業篩選industry_list = stocks["industry"].unique().tolist()selected_industry = st.sidebar.multiselect("選擇行業", industry_list)# 地域篩選area_list = stocks["area"].unique().tolist()selected_area = st.sidebar.multiselect("選擇地域", area_list)# 應用篩選條件filtered_stocks = stocks[(stocks["market_cap"] >= min_market_cap) & (stocks["market_cap"] <= max_market_cap)]if selected_industry:filtered_stocks = filtered_stocks[filtered_stocks["industry"].isin(selected_industry)]if selected_area:filtered_stocks = filtered_stocks[filtered_stocks["area"].isin(selected_area)]# 格式化并展示結果display_df = filtered_stocks.copy()display_df["market_cap"] = display_df["market_cap"].round(2)st.dataframe(display_df.sort_values(by="market_cap", ascending=False))# 個股詳情部分if not filtered_stocks.empty:st.subheader("個股詳情分析")# 股票選擇器selected_stock = st.selectbox("選擇股票查看詳情", filtered_stocks["name"])# 日期范圍選擇today = pd.Timestamp.today()col1, col2 = st.columns(2)with col1:start_date = st.date_input("開始日期", value=today - pd.Timedelta(days=365), max_value=today)with col2:end_date = st.date_input("結束日期", value=today, min_value=start_date, max_value=today)# 獲取選定股票的日線數據stock_code = filtered_stocks[filtered_stocks["name"] == selected_stock]["ts_code"].values[0]daily_data = get_daily_data(stock_code)# 按日期范圍篩選daily_data = daily_data[(daily_data["trade_date"] >= pd.Timestamp(start_date)) &(daily_data["trade_date"] <= pd.Timestamp(end_date))]# 處理缺失值if daily_data[["open", "high", "low", "close"]].isnull().values.any():st.warning("部分價格數據缺失 - 使用前值填充")daily_data[["open", "high", "low", "close"]] = daily_data[["open", "high", "low", "close"]].ffill()# 繪制K線圖if not daily_data.empty:fig = go.Figure(data=[go.Candlestick(x=daily_data["trade_date"],open=daily_data["open"],high=daily_data["high"],low=daily_data["low"],close=daily_data["close"],increasing_line_color="green",decreasing_line_color="red",)])fig.update_layout(title=f"{selected_stock} K線圖",xaxis_title="日期",yaxis_title="價格")st.plotly_chart(fig, use_container_width=True)else:st.warning("所選日期范圍內無可用數據")else:st.warning("沒有符合篩選條件的股票")if __name__ == "__main__":# 檢查依賴是否安裝try:import streamlitimport tushareimport pandasimport plotlymain()except ImportError as e:print(f"缺少依賴庫: {e}")print("請執行以下命令安裝依賴:")print("pip install streamlit tushare pandas plotly")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915894.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915894.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915894.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡安全威脅和防御措施

網絡安全基礎概念網絡安全指保護網絡系統及其數據免受未經授權的訪問、破壞或泄露。涵蓋硬件、軟件、數據及服務的安全防護&#xff0c;涉及技術、管理和法律等多層面措施。常見網絡安全威脅惡意軟件&#xff1a;病毒、蠕蟲、勒索軟件等通過漏洞感染系統。網絡釣魚&#xff1a;…

Spring DeferredResult 實現長輪詢

1、背景 在項目開發中&#xff0c;有一個流程性的方法執行&#xff0c;這個方法會調用各種方法&#xff0c;可能會導致時間比較長 &#xff0c;如果一直等待響應結果的話&#xff0c;可能會造成超時&#xff0c;如果直接使用異步的方式的話&#xff0c;前端無法知道整體流程什…

Python設計模式 - 橋接模式

定義 橋接模式是一種結構型設計模式&#xff0c;它的核心思想是將抽象部分與實現部分分離&#xff0c;使它們可以獨立變化。 結構抽象類&#xff08;Abstraction&#xff09;&#xff1a;定義抽象接口&#xff0c;持有實現部分的引用。具體抽象類&#xff08;Refined Abstracti…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 用戶注冊實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解用戶注冊實現 視頻在線地址&#xff1a; …

華為7月23日機考真題

&#x1f4cc; 點擊直達筆試專欄 &#x1f449;《大廠筆試突圍》 &#x1f4bb; 春秋招筆試突圍在線OJ 筆試突圍OJ](bishipass.com) 03. 山峰觀測站數據分析 問題描述 LYA是一名地理數據分析師&#xff0c;負責分析山峰觀測站收集的海拔高度數據。觀測站在一條直線上設置了…

圖像分析學習筆記(4):機器學習圖像特征與描述

圖像分析學習筆記&#xff08;4&#xff09;&#xff1a;機器學習圖像特征與描述深度學習基礎深度學習技巧深度模型構建深度學習基礎 深度學習概念&#xff1a;深度學習是機器學習的一個分支&#xff0c;它基于一系列算法&#xff0c;試圖通過使用多個處理層建立數據的高級抽象…

鎖付機器人,如何精準鎖附革新新能源鋰電裝配效率

其實呢&#xff0c;隨著科技的不斷發展&#xff0c;新能源電池、智能制造、精密裝配、工藝升級以及工業自動化這些領域都在飛速前進。新能源行業如今可是炙手可熱&#xff0c;中國新能源行業進入快速發展階段&#xff0c;就像一列高速行駛的火車&#xff0c;勢不可擋。在這個過…

Vue項目開發注意事項(包含node/npm/cnpm等)

事項一&#xff1a;項目代碼放在本地怎么運行起來 1、首先確定項目對應的node和npm版本 node下載地址 Index of /dist/https://nodejs.org/dist/ node 與 npm版本對應關系 Node.js — Node.js Releases 2、node卸載的時候&#xff0c;會自動把對應的npm卸載掉 情況1&…

GitHub:只支持 Git 作為唯一的版本庫格式進行托管

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

秋招Day17 - Spring - MVC

Spring MVC有哪些核心組件&#xff1f;DispatcherServlet&#xff1a;前端控制器&#xff0c;所有HTTP請求首先經過它&#xff0c;分發請求到正確的處理器&#xff0c;并與其他組件協調。HandlerMapping&#xff1a;維護URL和處理器的映射關系Handler&#xff1a;處理器&#x…

使用mybatis實現模糊查詢和精準查詢切換的功能

1、首先在前端頁面添加勾選框&#xff08;name設置為check&#xff09;2、mybatis代碼當check勾選時&#xff0c;check不為null&#xff0c;走模糊查詢like當check未勾選時&#xff0c;check為null&#xff0c;走精準查詢 <if test"check ! null and check ! "&g…

Android模塊化實現方案深度分析

模塊化是現代 Android 開發應對項目復雜度激增、團隊協作效率、編譯速度瓶頸、功能復用與動態化等挑戰的核心架構思想。其核心目標是高內聚、低耦合、可插拔、易維護。 一、模塊化的核心價值與目標 降低復雜度&#xff1a; 將龐大單體應用拆分為獨立、職責清晰的模塊。加速編譯…

網絡基礎16--VRRP技術

一、VRRP核心概念定義虛擬路由器冗余協議&#xff08;VRRP&#xff0c;Virtual Router Redundancy Protocol&#xff09;&#xff0c;可以將多個路由器加入到備份組中&#xff0c;形成一臺虛擬路由器&#xff0c;承擔網關功能。RFC 3768標準定義的VRRP是一種容錯協議&#xff0…

最長公共前綴-leetcode

編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 輸入&#xff1a;strs [“flower”,“flow”,“flight”] 輸出&#xff1a;“fl” 示例 2&#xff1a; 輸入&#xff1a;strs [“dog”,“racecar”,…

vs2022:C++安裝opencv

vs2022:C安裝opencv https://opencv.org/releases/ 1.配置包含目錄 2.配置庫目錄 3.配置連接器 4.配置環境變量 5.重新啟動VS2015/VS2017 6.測試 1.配置包含目錄 (頭文件) 2.配置庫目錄&#xff08;dll存放的庫目錄&#xff09; 3.配置連接器(庫) 4.配置環境變量 5.重新啟動VS…

智聯智造:國內新能源汽車品牌AGV小車無線控制系統創新實踐

行業背景&#xff1a;智能制造浪潮下的通信剛需 在全球制造業智能化轉型浪潮中&#xff0c;工業4.0技術已成為提升生產效率與產品質量的核心驅動力。國內某新能源汽車品牌作為智能制造的標桿企業&#xff0c;積極投身自動化設備與智能生產系統的革新。其中&#xff0c;無線控制…

QT6 源,七章對話框與多窗體(8) 消息對話框 QMessageBox :屬性,信號函數,成員函數,以及靜態成員函數,源代碼帶注釋

&#xff08;1&#xff09;消息對話框里&#xff0c;分為通知消息&#xff0c;詢問消息&#xff0c;提醒消息&#xff0c;錯誤消息。可以直接使用本類的靜態函數&#xff0c;簡單。但 QT 的官方說明里&#xff0c;建議使用動態成員函數組件的消息框&#xff0c;而非使用靜態函數…

DAY 7|算法篇——棧與隊列(及重溫數組篇章有感)

今天本來應該寫兩道題把這一章節結束掉&#xff0c;奈何第二題前k個高頻元素需要用的二叉樹相關代碼實在不會寫&#xff08;倒是能看懂&#xff09;等我學完二叉樹再把這道題親自寫一遍吧 今天工作量比較小&#xff0c;準備從第一天的任務開始把題目重新再做一遍 239. 滑動窗…

go語言基礎與進階

&#x1f680; Go語言終極高手之路&#xff1a;從基礎到架構的終極指南 Go語言&#xff0c;以其簡潔的語法、卓越的性能和原生的并發模型&#xff0c;席卷了云原生和后端開發領域。然而&#xff0c;要真正駕馭Go&#xff0c;僅僅停留在會寫if-else和for循環是遠遠不夠的。真正的…

Oracle數據恢復—Oracle數據庫所在分區被刪除后報錯的數據恢復案例

Oracle數據庫數據恢復環境&故障&#xff1a; 一臺服務器上一個分區存放Oracle數據庫數據。由于管理員誤操作不小心刪除了該分區&#xff0c;數據庫報錯&#xff0c;無法使用。 北亞企安數據恢復工程師到達現場后&#xff0c;將故障服務器中所有硬盤以只讀方式進行完整鏡像。…