本项目基于您的卡尔曼滤波权重数据,构建了一个完整的板块轮动策略验证框架。该框架包含板块择时因子、个股选择因子、策略回测验证和可视化分析等功能模块。
- 触底反弹因子:识别权重触底并开始反弹的板块
- 趋势持续因子:捕捉权重连续几天上涨/下跌的趋势
- 权重变化百分比因子:计算不同周期的权重变化幅度
- 相对强弱因子:评估板块相对于整体市场的表现
- 动量因子:基于均线系统的动量指标
- 均线排列因子:MA5 ≥ MA10 ≥ MA20 ≥ MA60 的多头排列
- 均线发散度控制:控制发散度在合理范围内(2%-8%)
- 市值因子:优先选择50-500亿中等市值股票
- 技术指标:RSI、布林带、成交量等技术分析
- 基本面筛选:ROE、PE等财务指标
- 回测系统:支持自定义时间段和调仓频率
- 绩效评估:收益率、夏普比率、最大回撤等指标
- 风险管理:波动率控制和回撤管理
- 权重热力图:直观展示各板块权重变化
- 因子分析图:多维度因子表现分析
- 信号仪表板:实时交易信号展示
- 交互式Dashboard:基于Plotly的动态分析
Factor_klm_cursor/
├── w_2025-07-28.json # 卡尔曼滤波权重数据
├── sector_rotation_strategy.py # 主策略框架
├── joinquant_stock_selection.py # JoinQuant个股选择模块
├── visualization_tools.py # 可视化分析工具
├── README.md # 使用文档
└── example_usage.py # 完整使用示例
# 安装必要的Python包
pip install pandas numpy matplotlib seaborn plotly openpyxlfrom sector_rotation_strategy import SectorRotationStrategy
from visualization_tools import StrategyVisualizer
# 初始化策略
strategy = SectorRotationStrategy('w_2025-07-28.json')
# 加载数据并构建因子
weights_df = strategy.load_kalman_weights()
factors = strategy.build_sector_timing_factors()
# 获取最新交易信号
latest_date = weights_df.index[-1]
signals = strategy.get_sector_signals(latest_date, top_n=5)
print(f"推荐板块: {signals['selected_sectors']}")
# 可视化分析
visualizer = StrategyVisualizer(strategy)
visualizer.plot_weights_heatmap()
visualizer.plot_sector_signals_dashboard(latest_date)# 在JoinQuant研究环境中运行
from joinquant_stock_selection import JQStockSelector, run_stock_selection_example
# 执行个股选择
selected_stocks = run_stock_selection_example()# 参数说明
lookback_days = 10 # 回看天数
bottom_pct = 20 # 底部百分位数阈值
# 信号逻辑
# 当前权重 <= 历史20%分位数 且 近期涨幅 > 1%# 检测连续3天以上的单边趋势
min_days = 3
# 连续上涨得分为正,连续下跌得分为负# 计算1日、3日、5日、10日权重变化率
periods = [1, 3, 5, 10]
# 用于识别短期和中期趋势变化# 完美多头排列:当前价格 > MA5 > MA10 > MA20 > MA60
bullish_alignment = (current_price > ma5 > ma10 > ma20 > ma60)
# 发散度控制:2%-8%为理想范围
ideal_divergence = 0.02 <= ma_divergence <= 0.08# 市值偏好:50-500亿中等市值
preferred_market_cap = 50 <= market_cap <= 500
# 估值合理:PE在10-30之间
reasonable_pe = 10 <= pe_ratio <= 30
# 盈利能力:ROE > 15%
high_roe = roe > 0.15# RSI避免极端:30-70区间
normal_rsi = 30 <= rsi <= 70
# 适度放量:1.2-3倍平均成交量
volume_expansion = 1.2 <= volume_ratio <= 3.0
# 正动量:20日动量 > 0
positive_momentum = momentum_20d > 0# 1. 初始化和数据加载
strategy = SectorRotationStrategy('w_2025-07-28.json')
strategy.load_kalman_weights()
strategy.build_sector_timing_factors()
# 2. 策略回测
backtest_results = strategy.backtest_strategy(
start_date='2025-01-01',
end_date='2025-05-23',
rebalance_freq='5D' # 每5天调仓
)
# 3. 绩效分析
performance = strategy.analyze_performance(backtest_results)
# 输出示例:
# === 策略表现分析 ===
# 总收益率: 8.45%
# 年化收益率: 15.23%
# 年化波动率: 12.67%
# 夏普比率: 1.20
# 最大回撤: -3.21%
# 调仓次数: 25
# 4. 可视化分析
visualizer = StrategyVisualizer(strategy)
visualizer.plot_backtest_performance(backtest_results)
visualizer.create_interactive_dashboard()# 获取最新日期的交易信号
latest_date = strategy.weights_df.index[-1]
strategy.generate_signals_report(latest_date)
# 输出示例:
# === 2025-05-23 板块信号报告 ===
# 推荐板块: ['电子', '汽车', '医药生物', '计算机', '电力设备']
# 电子: 评分=0.867, 当前权重=0.124
# 汽车: 评分=0.743, 当前权重=0.058
# 医药生物: 评分=0.692, 当前权重=0.081展示所有板块在时间序列上的权重变化模式
visualizer.plot_weights_heatmap(start_date='2025-01-01')深入分析各个因子的表现和相关性
visualizer.plot_factor_analysis('momentum')
visualizer.plot_factor_analysis('relative_strength')创建包含多个图表的交互式HTML仪表板
visualizer.create_interactive_dashboard('my_dashboard.html')将所有分析结果导出为Excel文件
visualizer.export_analysis_report(backtest_results, 'analysis_report.xlsx')# 在JoinQuant研究环境中
from joinquant_stock_selection import JQStockSelector
# 初始化选股器
selector = JQStockSelector()
# 从推荐板块中选择个股
target_sectors = ['电子', '汽车', '医药生物']
selected_stocks = selector.select_stocks_from_sectors(
sectors=target_sectors,
date=datetime.now().date(),
max_stocks_per_sector=5
)
# 生成详细报告
selector.generate_stock_report(selected_stocks)# 在JoinQuant交易环境中的策略模板
def initialize(context):
# 初始化策略参数
g.stock_selector = JQStockSelector()
g.rebalance_period = 5 # 5天调仓一次
g.max_stocks = 15
def before_trading_start(context):
# 每日开盘前执行
if g.day_count % g.rebalance_period == 0:
# 获取板块信号(需要集成您的权重数据)
target_sectors = get_sector_signals() # 自定义函数
# 选择个股
selected_stocks = g.stock_selector.select_stocks_from_sectors(
sectors=target_sectors,
date=context.current_dt.date(),
max_stocks_per_sector=5
)
# 更新股票池
update_stock_pool(selected_stocks)
def handle_data(context, data):
# 交易逻辑
pass- 调仓频率:建议5-10天,平衡交易成本和信号敏感度
- 选择板块数:3-5个板块,确保足够分散
- 因子权重:触底反弹30%,动量20%,相对强弱20%,趋势持续20%,权重变化10%
- 每板块股票数:3-5只,避免过度集中
- 市值范围:50-500亿,兼顾流动性和成长性
- 均线发散度:2%-8%,避免过度或不足发散
- 单股票权重:不超过5%
- 单板块权重:不超过30%
- 止损阈值:单股票-10%,组合-5%
- 数据质量:确保卡尔曼滤波权重数据的准确性和及时性
- 交易成本:考虑频繁调仓的交易成本影响
- 市场环境:不同市场环境下因子有效性可能发生变化
- 参数稳定性:定期检视和调整参数设置
- 风险管理:严格执行止损和仓位控制规则
可以基于历史数据训练模型,自动优化因子权重
接入实时行情数据,实现intraday信号更新
扩展更多技术和基本面因子,提高选股精度
集成更完善的风险模型和组合优化算法
如有问题或需要定制化开发,请参考以下资源:
- JoinQuant API文档:https://www.joinquant.com/help/api/
- 策略开发指南:查看example_usage.py中的详细示例
- 因子工程:参考sector_rotation_strategy.py中的因子构建方法
免责声明:本框架仅供学习和研究使用,投资有风险,使用本策略进行实际交易时请谨慎评估风险。