核心内容摘要
手把手教你绘制工业传感器前端PCB原理图
前言策略失效是量化交易中常见的问题。
市场环境变化、策略参数过时、数据质量问题等都可能导致策略失效。
及时检测策略失效可以避免重大损失。
本文将介绍如何检测策略失效。
本文将介绍策略失效的原因性能监控方法统计检验方法实时失效检测失效应对策略
为什么选择天勤量化TqSdkTqSdk策略失效检测支持功能说明实时数据支持实时行情数据账户信息支持查询账户表现历史数据支持历史回测验证数据统计pandas/numpy支持统计分析安装方法pipinstalltqsdk pandas numpy scipy
策略失效基础
1 失效原因原因说明应对市场环境变化市场结构改变适应新环境参数过时参数不再适用重新优化数据质量数据异常数据清洗过度拟合回测过拟合样本外验证竞争加剧策略被广泛使用策略创新
2 失效表现表现说明收益下降收益率持续下降回撤增大最大回撤超过阈值胜率下降交易胜率明显下降信号失效信号不再有效
性能监控
1 实时性能监控#!/usr/bin/env python# -*- coding: utf-8 -*- 功能实时性能监控 说明本代码仅供学习参考 importpandasaspdimportnumpyasnpfromtqsdkimportTqApi,TqAuthclassPerformanceMonitor:性能监控器def__init__(self,baseline_sharpe
5,baseline_return
1,window
: 初始化 参数: baseline_sharpe: 基准夏普比率 baseline_return: 基准收益率 window: 监控窗口大小 self.baseline_sharpebaseline_sharpe self.baseline_returnbaseline_return self.windowwindow self.returns_history[]self.alerts[]defupdate(self,daily_return): 更新每日收益 参数: daily_return: 日收益率 self.returns_history.append(daily_return)# 保持窗口大小iflen(self.returns_history)self.window:self.returns_history.pop(
defcheck_performance(self): 检查性能 返回: status: normal, warning, critical metrics: 性能指标 iflen(self.returns_history)self.window:returnnormal,{}returnsnp.array(self.returns_history)# 计算指标total_return(1returns).prod()-1annual_return(1total_return)**(252/len(returns))-1volatilityreturns.std()*np.sqrt(
sharpeannual_return/volatilityifvolatility0else0max_drawdownself._calculate_drawdown(returns)metrics{annual_return:annual_return,sharpe:sharpe,max_drawdown:max_drawdown,volatility:volatility}# 判断状态ifsharpeself.baseline_sharpe*
5ormax_drawdown-
3:statuscriticalelifsharpeself.baseline_sharpe*
7ormax_drawdown-
2:statuswarningelse:statusnormalreturnstatus,metricsdef_calculate_drawdown(self,returns):计算最大回撤cumulative(1returns).cumprod()running_maxnp.maximum.accumulate(cumulative)drawdown(cumulative-running_max)/running_maxreturndrawdown.min()# 使用示例monitorPerformanceMonitor(baseline_sharpe
5,baseline_return
1,window
# 模拟收益数据np.random.seed(
simulated_returnsnp.random.normal(
001,
02,
forretinsimulated_returns:monitor.update(ret)iflen(monitor.returns_history)monitor.window:status,metricsmonitor.check_performance()ifstatus!normal:print(f状态:{status})print(f 年化收益:{metrics[annual_return]:.2%})print(f 夏普比率:{metrics[sharpe]:.2f})print(f 最大回撤:{metrics[max_drawdown]:.2%})
统计检验
1 收益显著性检验#!/usr/bin/env python# -*- coding: utf-8 -*- 功能收益显著性检验 说明本代码仅供学习参考 importpandasaspdimportnumpyasnpfromscipyimportstatsfromtqsdkimportTqApi,TqAuthdeftest_return_significance(returns,benchmark_return
: 检验收益显著性 参数: returns: 收益率序列 benchmark_return: 基准收益率如0或市场收益率 # t检验t_stat,p_valuestats.ttest_1samp(returns,benchmark_return)# 判断is_significantp_value
05is_positivereturns.mean()benchmark_returnreturn{t_statistic:t_stat,p_value:p_value,is_significant:is_significant,is_positive:is_positive,mean_return:returns.mean(),std_return:returns.std()}# 使用示例apiTqApi(authTqAuth(快期账户,快期密码))SYMBOLSHFE.rb2510klinesapi.get_kline_serial(SYMBOL,86400,
# 日线api.wait_update()# 计算策略收益简化假设买入持有strategy_returnsklines[close].pct_change().dropna()# 检验resulttest_return_significance(strategy_returns,benchmark_return
print(收益显著性检验:)print(f 平均收益:{result[mean_return]:.4f}({result[mean_return]*100:.2%}))print(f t统计量:{result[t_statistic]:.4f})print(f p值:{result[p_value]:.4f})print(f 是否显著:{result[is_significant]})print(f 是否为正:{result[is_positive]})api.close()
2 性能衰减检验#!/usr/bin/env python# -*- coding: utf-8 -*- 功能性能衰减检验 说明本代码仅供学习参考 importpandasaspdimportnumpyasnpfromscipyimportstatsfromtqsdkimportTqApi,TqAuthdeftest_performance_decay(returns,split_pointNone): 检验性能衰减 参数: returns: 收益率序列 split_point: 分割点如None则自动选择中点 ifsplit_pointisNone:split_pointlen(returns)//2early_returnsreturns[:split_point]late_returnsreturns[split_point:]# 比较前后期收益early_meanearly_returns.mean()late_meanlate_returns.mean()# t检验t_stat,p_valuestats.ttest_ind(early_returns,late_returns)# 判断是否衰减is_decayinglate_meanearly_meanandp_value
05return{early_mean:early_mean,late_mean:late_mean,t_statistic:t_stat,p_value:p_value,is_decaying:is_decaying,decay_ratio:(late_mean-early_mean)/abs(early_mean)ifearly_mean!0else0}# 使用示例apiTqApi(authTqAuth(快期账户,快期密码))SYMBOLSHFE.rb2510klinesapi.get_kline_serial(SYMBOL,86400,
api.wait_update()strategy_returnsklines[close].pct_change().dropna()resulttest_performance_decay(strategy_returns)print(性能衰减检验:)print(f 前期平均收益:{result[early_mean]:.4f})print(f 后期平均收益:{result[late_mean]:.4f})print(f 衰减比例:{result[decay_ratio]:.2%})print(f p值:{result[p_value]:.4f})print(f 是否衰减:{result[is_decaying]})api.close()
实时失效检测
1 滑动窗口检测#!/usr/bin/env python# -*- coding: utf-8 -*- 功能滑动窗口失效检测 说明本代码仅供学习参考 importpandasaspdimportnumpyasnpfromtqsdkimportTqApi,TqAuthclassSlidingWindowDetector:滑动窗口失效检测器def__init__(self,window60,threshold_sharpe
5,threshold_return-
0.
: 初始化 参数: window: 窗口大小 threshold_sharpe: 夏普比率阈值 threshold_return: 收益率阈值 self.windowwindow self.threshold_sharpethreshold_sharpe self.threshold_returnthreshold_return self.returns_history[]defupdate(self,daily_return):更新收益self.returns_history.append(daily_return)iflen(self.returns_history)self.window*2:self.returns_history.pop(
defdetect_failure(self): 检测失效 返回: is_failed: 是否失效 metrics: 指标 iflen(self.returns_history)self.window:returnFalse,{}# 使用最近窗口的数据recent_returnsnp.array(self.returns_history[-self.window:])# 计算指标total_return(1recent_returns).prod()-1annual_return(1total_return)**(252/len(recent_returns))-1volatilityrecent_returns.std()*np.sqrt(
sharpeannual_return/volatilityifvolatility0else0metrics{annual_return:annual_return,sharpe:sharpe,volatility:volatility}# 判断失效is_failed(sharpeself.threshold_sharpe)or(annual_returnself.threshold_return)returnis_failed,metrics# 使用示例detectorSlidingWindowDetector(window60,threshold_sharpe
5,threshold_return-
0.
# 模拟收益前期好后期差np.random.seed(
good_returnsnp.random.normal(
002,
015,
bad_returnsnp.random.normal(-
001,
02,
all_returnsnp.concatenate([good_returns,bad_returns])forretinall_returns:detector.update(ret)iflen(detector.returns_history)detector.window:is_failed,metricsdetector.detect_failure()ifis_failed:print(f检测到策略失效!)print(f 年化收益:{metrics[annual_return]:.2%})print(f 夏普比率:{metrics[sharpe]:.2f})break
失效应对策略
1 自动应对机制#!/usr/bin/env python# -*- coding: utf-8 -*- 功能失效应对策略 说明本代码仅供学习参考 classFailureResponse:失效应对def__init__(self):初始化self.response_actions{warning:self._reduce_position,critical:self._stop_trading}def_reduce_position(self,current_position,reduction
0.
:减少仓位new_positionint(current_position*reduction)print(f警告减少仓位{current_position}-{new_position})returnnew_positiondef_stop_trading(self,current_position):停止交易print(f严重停止交易平仓{current_position}手)return0defrespond(self,status,current_position): 响应失效 参数: status: 失效状态 current_position: 当前持仓 ifstatusinself.response_actions:new_positionself.response_actions[status](current_position)returnnew_positionreturncurrent_position# 使用示例responseFailureResponse()# 模拟不同状态test_cases[(warning,
,(critical,
,(normal,
]forstatus,positionintest_cases:new_positionresponse.respond(status,position)print(f状态:{status}, 原仓位:{position}, 新仓位:{new_position})
八、
常见问题Q1: 如何区分策略失效和市场波动A: 方法使用统计检验比较相对表现分析失效持续性考虑市场环境Q2: 失效检测的误报率如何控制A: 建议设置合理的阈值使用多个指标考虑时间窗口避免过度敏感Q3: 策略失效后如何处理A: 步骤立即减少或停止交易分析失效原因重新优化参数样本外验证逐步恢复交易
九、
总结要点说明性能监控实时监控策略表现统计检验检验收益显著性衰减检测检测性能衰减实时检测滑动窗口检测应对策略自动应对机制下一步学习建议学习更复杂的失效检测方法研究机器学习失效预测探索自适应策略调整学习策略生命周期管理免责声明本文仅供学习交流使用不构成任何投资建议。
期货交易有风险入市需谨慎。
更多资源天勤量化官网https://www.shinnytech.comGitHub开源地址https://github.com/shinnytech/tqsdk-python官方文档https://doc.shinnytech.com/tqsdk/latest