Streamlit与Qlib:量化投资策略可视化实战
1. 项目背景
在量化投资领域,数据可视化是理解和展示投资策略的关键。本文将详细介绍如何使用Streamlit和Qlib构建一个交互式的量化投资策略可视化应用。
2. 环境准备
2.1 安装依赖
# 安装必要的库
pip install qlib streamlit pandas numpy plotly
2.2 下载Qlib数据
# 下载A股市场数据
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
3. 完整可视化应用代码
import streamlit as st
import qlib
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
# 初始化Qlib
qlib.init(provider_uri="~/.qlib/qlib_data/cn_data", region=qlib.Region.CN)
def load_market_data(start_date='2020-01-01', end_date='2023-12-31', top_n=50):
"""加载市场数据"""
instruments = qlib.data.D.list_instruments(market='CN')
market_data = []
for instrument in instruments[:top_n]:
try:
price_data = qlib.data.D.features(
instrument,
start_time=start_date,
end_time=end_date,
fields=['close', 'market_value', 'volume']
)
price_data['instrument'] = instrument
market_data.append(price_data)
except Exception as e:
st.warning(f"Error processing {instrument}: {e}")
return pd.concat(market_data)
def market_value_strategy(data, percentile=0.1):
"""市值策略分析"""
grouped = data.groupby('instrument')['market_value'].mean().sort_values()
top_percentile = grouped.head(int(len(grouped) * percentile))
return top_percentile
def performance_analysis(data, stocks):
"""计算选中股票的性能指标"""
selected_data = data[data['instrument'].isin(stocks.index)]
performance = selected_data.groupby('instrument')['close'].agg([
('start_price', 'first'),
('end_price', 'last'),
('return_rate', lambda x: (x.iloc[-1] - x.iloc[0]) / x.iloc[0] * 100)
])
return performance
def main():
st.set_page_config(page_title='Qlib量化投资分析', layout='wide')
st.title('🚀 Qlib量化投资策略可视化')
# 侧边栏参数配置
with st.sidebar:
st.header('策略参数')
start_date = st.date_input('开始日期', pd.to_datetime('2020-01-01'))
end_date = st.date_input('结束日期', pd.to_datetime('2023-12-31'))
top_n = st.slider('分析股票数量', 10, 200, 50)
percentile = st.select_slider('市值百分比', options=[0.05, 0.1, 0.15, 0.2], value=0.1)
# 加载数据
with st.spinner('数据加载中...'):
market_data = load_market_data(
start_date.strftime('%Y-%m-%d'),
end_date.strftime('%Y-%m-%d'),
top_n
)
# 市值策略分析
top_stocks = market_value_strategy(market_data, percentile)
# 性能分析
performance = performance_analysis(market_data, top_stocks)
# 创建选项卡
tab1, tab2, tab3 = st.tabs(['市值分析', '价格趋势', '性能详情'])
with tab1:
st.subheader('最小市值股票分布')
fig1 = px.bar(
x=top_stocks.index,
y=top_stocks.values,
title='最小市值股票分布',
labels={'x': '股票代码', 'y': '平均市值'}
)
st.plotly_chart(fig1, use_container_width=True)
with tab2:
st.subheader('选中股票价格走势')
selected_data = market_data[market_data['instrument'].isin(top_stocks.index)]
fig2 = px.line(
selected_data,
x=selected_data.index,
y='close',
color='instrument',
title='选中股票价格走势'
)
st.plotly_chart(fig2, use_container_width=True)
with tab3:
st.subheader('股票性能详情')
st.dataframe(performance)
# 收益率分布
fig3 = px.histogram(
performance,
x='return_rate',
title='选中股票收益率分布'
)
st.plotly_chart(fig3, use_container_width=True)
if __name__ == '__main__':
main()
4. 运行应用
# 保存代码为 qlib_strategy_visualization.py
streamlit run qlib_strategy_visualization.py
5. 功能特点
5.1 交互式界面
- 可调整日期范围
- 动态选择分析股票数量
- 灵活配置市值策略参数
5.2 数据可视化
- 市值分布柱状图
- 股价走势折线图
- 收益率分布直方图
5.3 性能分析
- 计算选中股票的起始价格
- 分析股票收益率
- 展示详细性能数据
6. 进阶优化建议
- 添加更多金融指标
- 实现多策略切换
- 增加风险指标计算
- 优化性能和加载速度
7. 注意事项
- 需要稳定的网络连接
- 大数据量可能影响性能
- 建议使用GPU加速
- 实际投资需要更复杂的策略