一、前言
提升量化交易收益是每个交易者的目标。除了开发好的策略,还有很多技巧可以帮助提升收益。本文将分享一些实用的技巧和经验。
本文将介绍:
- 策略优化技巧
- 执行优化方法
- 组合管理技巧
- 风险控制优化
- 持续改进方法
二、为什么选择天勤量化(TqSdk)
TqSdk收益优化支持:
| 功能 | 说明 |
|---|---|
| 快速执行 | 支持快速下单执行 |
| 数据质量 | 高质量数据支持 |
| 灵活扩展 | 支持自定义优化 |
| 实时监控 | 支持实时监控优化 |
安装方法:
pipinstalltqsdk pandas numpy三、策略优化技巧
3.1 参数优化
#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:提升收益技巧 说明:本代码仅供学习参考 """fromtqsdkimportTqApi,TqAuthfromtqsdk.tafuncimportmaimportpandasaspdimportnumpyasnpfromitertoolsimportproductdefoptimize_ma_parameters(klines,fast_range=(3,10),slow_range=(15,30)):"""优化均线参数"""best_params=Nonebest_return=-np.infforfast,slowinproduct(range(*fast_range),range(*slow_range)):iffast>=slow:continue# 回测return_rate=backtest_ma_strategy(klines,fast,slow)ifreturn_rate>best_return:best_return=return_rate best_params=(fast,slow)returnbest_params,best_returndefbacktest_ma_strategy(klines,fast_period,slow_period):"""回测均线策略"""capital=100000position=0entry_price=0ma_fast=ma(klines['close'],fast_period)ma_slow=ma(klines['close'],slow_period)foriinrange(slow_period,len(klines)):ifma_fast.iloc[i]>ma_slow.iloc[i]andma_fast.iloc[i-1]<=ma_slow.iloc[i-1]:ifposition==0:position=1entry_price=klines['close'].iloc[i]elifma_fast.iloc[i]<ma_slow.iloc[i]andma_fast.iloc[i-1]>=ma_slow.iloc[i-1]:ifposition>0:pnl=(klines['close'].iloc[i]-entry_price)/entry_price capital*=(1+pnl)position=0return(capital-100000)/100000# 使用示例api=TqApi(auth=TqAuth("快期账户","快期密码"))klines=api.get_kline_serial("SHFE.rb2510",3600,1000)api.wait_update()best_params,best_return=optimize_ma_parameters(klines)print(f"最优参数:{best_params}, 收益率:{best_return:.2%}")api.close()3.2 信号过滤
deffilter_signals(klines,base_signal,filter_method='volume'):"""信号过滤"""filtered_signal=base_signal.copy()iffilter_method=='volume':# 成交量过滤volume_ma=klines['volume'].rolling(20).mean()volume_ratio=klines['volume']/volume_ma# 只有成交量放大时才确认信号filtered_signal[volume_ratio<1.2]=0eliffilter_method=='volatility':# 波动率过滤returns=klines['close'].pct_change()volatility=returns.rolling(20).std()# 波动率过低时过滤信号filtered_signal[volatility<volatility.quantile(0.3)]=0returnfiltered_signal# 使用示例base_signal=pd.Series([1,-1,0,1,-1],index=klines.index[-5:])filtered=filter_signals(klines,base_signal,'volume')print("过滤后信号:",filtered)四、执行优化方法
4.1 滑点控制
defoptimize_execution(api,symbol,direction,volume,max_slippage=0.001):"""优化执行"""quote=api.get_quote(symbol)api.wait_update()ifdirection=="BUY":target_price=quote.ask_price1 max_price=target_price*(1+max_slippage)else:target_price=quote.bid_price1 min_price=target_price*(1-max_slippage)# 限价单ifdirection=="BUY":order=api.insert_order(symbol,direction,"OPEN",volume,limit_price=max_price)else:order=api.insert_order(symbol,direction,"OPEN",volume,limit_price=min_price)api.wait_update()returnorder# 使用示例api=TqApi(auth=TqAuth("快期账户","快期密码"))order=optimize_execution(api,"SHFE.rb2510","BUY",1,max_slippage=0.001)api.close()4.2 分批执行
defbatch_execution(api,symbol,direction,total_volume,batch_size=1,interval=1):"""分批执行"""orders=[]remaining_volume=total_volumewhileremaining_volume>0:current_volume=min(batch_size,remaining_volume)order=api.insert_order(symbol,direction,"OPEN",current_volume)api.wait_update()orders.append(order)remaining_volume-=current_volumeifremaining_volume>0:time.sleep(interval)returnorders# 使用示例orders=batch_execution(api,"SHFE.rb2510","BUY",5,batch_size=1,interval=1)print(f"分批执行完成,共{len(orders)}笔订单")五、组合管理技巧
5.1 策略组合
defcombine_strategies(strategies,weights=None):"""组合多个策略"""ifweightsisNone:weights=[1/len(strategies)]*len(strategies)defcombined_signal(klines):signals=[strategy(klines)forstrategyinstrategies]weighted_signal=sum(s*wfors,winzip(signals,weights))# 归一化到-1, 0, 1ifweighted_signal>0.5:return1elifweighted_signal<-0.5:return-1else:return0returncombined_signal# 使用示例defma_strategy(klines):ma5=ma(klines['close'],5)ma20=ma(klines['close'],20)ifma5.iloc[-1]>ma20.iloc[-1]andma5.iloc[-2]<=ma20.iloc[-2]:return1elifma5.iloc[-1]<ma20.iloc[-1]andma5.iloc[-2]>=ma20.iloc[-2]:return-1return0defrsi_strategy(klines):fromtqsdk.tafuncimportrsi rsi_value=rsi(klines['close'],14)ifrsi_value.iloc[-1]<30:return1elifrsi_value.iloc[-1]>70:return-1return0combined=combine_strategies([ma_strategy,rsi_strategy],weights=[0.6,0.4])5.2 动态权重调整
defdynamic_weight_adjustment(strategy_returns,base_weights,lookback=20):"""动态调整权重"""# 计算近期表现recent_returns=[returns[-lookback:].mean()forreturnsinstrategy_returns]# 根据表现调整权重total_performance=sum(max(0,r)forrinrecent_returns)iftotal_performance>0:adjusted_weights=[max(0,r)/total_performanceforrinrecent_returns]else:adjusted_weights=base_weights# 平滑处理final_weights=[0.7*base+0.3*adjforbase,adjinzip(base_weights,adjusted_weights)]final_weights=[w/sum(final_weights)forwinfinal_weights]# 归一化returnfinal_weights# 使用示例strategy_returns=[pd.Series(np.random.normal(0.001,0.02,100)),pd.Series(np.random.normal(0.0015,0.025,100))]base_weights=[0.5,0.5]adjusted=dynamic_weight_adjustment(strategy_returns,base_weights)print(f"调整后权重:{adjusted}")六、风险控制优化
6.1 动态止损
defdynamic_stop_loss(entry_price,current_price,highest_price,initial_stop=0.02,trailing_stop=0.01):"""动态止损"""# 初始止损initial_stop_price=entry_price*(1-initial_stop)# 移动止损trailing_stop_price=highest_price*(1-trailing_stop)# 取较高者stop_loss_price=max(initial_stop_price,trailing_stop_price)returnstop_loss_price# 使用示例entry_price=4000current_price=4100highest_price=4150stop_loss=dynamic_stop_loss(entry_price,current_price,highest_price)print(f"动态止损价:{stop_loss:.2f}")6.2 风险预算管理
defrisk_budget_management(account_balance,current_risk,max_risk=0.05):"""风险预算管理"""risk_budget=account_balance*max_risk remaining_risk=risk_budget-current_riskifremaining_risk<0:returnFalse,"风险预算已用完"returnTrue,f"剩余风险预算:{remaining_risk:.2f}"# 使用示例api=TqApi(auth=TqAuth("快期账户","快期密码"))account=api.get_account()api.wait_update()current_risk=account.margin# 简化处理check_result,msg=risk_budget_management(account.balance,current_risk)print(f"风险预算检查:{check_result},{msg}")api.close()七、持续改进方法
7.1 策略监控
classStrategyMonitor:"""策略监控"""def__init__(self,api,symbol):self.api=api self.symbol=symbol self.performance_history=[]deftrack_performance(self,entry_price,current_price,position):"""跟踪表现"""ifposition!=0:pnl_ratio=(current_price-entry_price)/entry_price*position self.performance_history.append(pnl_ratio)defevaluate_performance(self,window=20):"""评估表现"""iflen(self.performance_history)<window:returnNonerecent_performance=self.performance_history[-window:]avg_return=np.mean(recent_performance)win_rate=len([pforpinrecent_performanceifp>0])/len(recent_performance)return{'avg_return':avg_return,'win_rate':win_rate,'performance':'good'ifavg_return>0andwin_rate>0.5else'poor'}# 使用示例monitor=StrategyMonitor(api,"SHFE.rb2510")# 定期调用track_performanceperformance=monitor.evaluate_performance()ifperformance:print(f"策略表现:{performance}")7.2 参数自适应
defadaptive_parameters(klines,base_params,market_state):"""自适应参数"""ifmarket_state=='trending':# 趋势市场:使用较长周期params=(base_params[0]*1.2,base_params[1]*1.2)elifmarket_state=='ranging':# 震荡市场:使用较短周期params=(base_params[0]*0.8,base_params[1]*0.8)else:params=base_paramsreturnparams# 使用示例base_params=(5,20)market_state='trending'# 需要根据市场状态判断adaptive_params=adaptive_parameters(klines,base_params,market_state)print(f"自适应参数:{adaptive_params}")八、总结
8.1 收益提升要点
| 要点 | 说明 |
|---|---|
| 策略优化 | 持续优化策略参数 |
| 执行优化 | 优化交易执行 |
| 组合管理 | 合理组合策略 |
| 风险控制 | 优化风险控制 |
8.2 注意事项
- 避免过拟合- 不要过度优化
- 实盘验证- 回测后需要实盘验证
- 持续改进- 持续监控和改进
- 风险优先- 始终把风险控制放在首位
免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。
更多资源:
- 天勤量化官网:https://www.shinnytech.com
- GitHub开源地址:https://github.com/shinnytech/tqsdk-python
- 官方文档:https://doc.shinnytech.com/tqsdk/latest