
本文將介紹如何通過 Python、Streamlit 和 Tushare,搭建一個簡單易用的股票篩選器,它不僅可以篩選股票,還能查看某個股票的詳細數據生成動態(tài) K 線圖,讓你對股票市場有更全面的了解。
概述
這個股票篩選器提供將提供幾個篩選能力,包括市值范圍、行業(yè)、地域條件。還支持股票的 K 線圖,直觀易用。
效果如下:

這個小工具的實現離不開一個關鍵的 Python 開源庫 - Streamlit。它可以快速構建交互式 Web 應用,只需幾行代碼,即可分享你的數據。對 streamlit 有興趣可以深入了解下,這里不展開介紹。
如果不想看下面的詳細步驟可直接從 github gist[1] 拿到代碼,完成第一部分的準備即可運行。
想進一步擴展的話,還可以添加更多篩選指標,此外還可為單只股票增加技術指標(如均線、RSI)分析、多股票價格走勢對比、實時數據更新、模擬投資組合功能甚至是按篩選分析結果生成股票分析報告等功能。
接下來,講解代碼的每一步實現過程。
準備開始
安裝要用到 python 庫:
pip install tushare ploty streamlit
并提前導入依賴包:
import streamlit as st
import tushare as ts
import pandas as pd
import plotly.graph_objects as go
通過 pro = ts.pro\_api()
配置了 Tushare 接口,為數據獲取做好準備。
ts.set_token('Your API Token')
pro = ts.pro_api()
注:tushare pro 依賴于 API Key,如果沒有的話,到 tushare pro 平臺注冊獲取。
股票數據
為了完成股票數據的篩選,要用到 tushare 的兩個,分別是 stock_basic
股票基礎數據和 stock_daily
每日最新指標,這里有要用到的市值數據。
基礎信息
首先,獲取所有上市股票的基本信息,包括股票代碼、名稱、行業(yè)、地域和上市日期。如果某些行業(yè)或地域數據缺失,用 'Unknown' 填補空值。
@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')
為了提高性能和減少重復計算,這里用了 @st.cache_data
裝飾器緩存數據結果,股票的基礎數據是不怎么變化的,這樣可避免每次交互重復加載數據。
市值數據
為了篩選高市值股票,調用每日基礎數據接口,獲取市值數據,并將其與基本信息合并。
market_cap_data = pro.daily_basic()
market_cap_data['total_mv'] = market_cap_data['total_mv'] / 10000 # 轉換為'億'
df = pd.merge(df, market_cap_data, on='ts_code', how='left')
df = df.rename(columns={'total_mv': 'market_cap'})
到這里,我們生成了一份包含公司基本信息和市值的完整股票列表,為后續(xù)篩選做好準備。
界面和篩選條件
接下來,創(chuàng)建用戶界面和篩選項。
st.title('Stock Screener')
st.sidebar.header('Filter Options')
側邊欄設置以下篩選條件:
- · 行業(yè)和地域:按行業(yè)或地域選擇股票。
篩選實現
以下代碼實現了這些過濾功能:
# 股票的基本信息
stocks = get_stock_list()
# 篩選市值范圍
min_market_cap = st.sidebar.number_input('Minimum Market Cap (億)', min_value=0, value=100)
max_market_cap = st.sidebar.number_input('Maximum Market Cap (億)', min_value=0, value=1000)
# 篩選行業(yè)和地域
industry_list = stocks['industry'].unique().tolist()
selected_industry = st.sidebar.multiselect('Select Industry', industry_list)
area_list = stocks['area'].unique().tolist()
selected_area = st.sidebar.multiselect('Select Area', area_list)
根據這些條件,我們過濾股票數據:
filtered_stocks = stocks.copy()
filtered_stocks = filtered_stocks[
(filtered_stocks['market_cap'] >= min_market_cap) &
(filtered_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)]
這樣可以看到符合條件的股票列表。
結果顯示
我們繼續(xù)通過 streamlit
的表格形式展示篩選后的股票列表,按照市值大小排序。
display_df = filtered_stocks.copy()
display_df['market_cap'] = display_df['market_cap'].round(2)
display_df = display_df.sort_values(by='market_cap', ascending=False)
st.dataframe(display_df)
這樣就可以清晰地看到結果,并快速找到目標股票。
單只股票詳情
有了篩選的股票列表后,還可以繼續(xù)擴展,查看單只股票的情況,如蠟燭圖、價格表格。
日線數據
先通過 Tushare 接口獲取用戶選擇的股票的日線數據,并根據日期范圍過濾。
@st.cache_data
def get_daily_data(ts_code):
return pro.daily(ts_code=ts_code)
daily_data = get_daily_data(stock_code)
daily_data['trade_date'] = pd.to_datetime(daily_data['trade_date'])
daily_data = daily_data.sort_values('trade_date', ascending=True)
篩選界面
配置篩選條件,包括股票選擇框和日期范圍。
# Show details for selected stock
selected_stock = st.selectbox('Select a stock to view details', filtered_stocks['name'])
today = pd.Timestamp.today()
col1, col2 = st.columns(2)
with col1:
start_date = st.date_input(
'Start date', value=today - pd.Timedelta(days=365), max_value=today
)
with col2:
end_date = st.date_input(
'End date', value=today, min_value=start_date, max_value=today
)
篩選邏輯
如果設置了 selected_stock
進入到篩選邏輯中。
if selected_stock:
stock_code = filtered_stocks[filtered_stocks['name'] == selected_stock][
'ts_code'
].values[0]
daily_data = get_daily_data(stock_code)
daily_data['trade_date'] = pd.to_datetime(daily_data['trade_date'])
daily_data = daily_data.sort_values('trade_date', ascending=True)
# 按時間過濾
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('Some price data is missing - filling with previous values')
daily_data[['open', 'high', 'low', 'close']] = daily_data[
['open', 'high', 'low', 'close']
].ffill()
繪制 K 線圖
使用 Plotly 繪制動態(tài) 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',
)
]
)
fig.update_layout(title=f'{selected_stock} Candlestick Chart', xaxis_title='Date', yaxis_title='Price')
st.plotly_chart(fig, use_container_width=True)
總結與擴展
通過以上步驟簡單構建了一個股票篩選分析工具,它支持按市值、行業(yè)、地域和上市日期篩選股票,可視化 K 線圖。
希望本文對你有用,開始構建屬于你的股票分析工具吧!
引用鏈接
[1]
github gist: https://gist.github.com/poloxue/b45324e478d97110e8f9969225e33e1a