核心内容摘要
顺丰丰桥电子面单API对接实战:从配置到打印的完整指南
前言风险预算是量化交易中的核心概念通过合理分配风险预算可以在控制整体风险的同时最大化收益。
风险预算管理是专业量化交易系统的重要组成部分。
本文将介绍如何实现风险预算管理。
本文将介绍风险预算的基本概念风险度量方法风险预算分配动态风险调整风险监控与预警
为什么选择天勤量化TqSdkTqSdk风险预算管理支持功能说明账户信息支持查询账户资金和持仓实时数据支持实时行情数据风险计算支持实时风险计算数据统计pandas/numpy支持风险分析安装方法pipinstalltqsdk pandas numpy scipy
风险预算基础
1 风险预算概念概念说明风险预算分配给各策略/品种的风险额度风险度量VaR、CVaR、波动率等风险限额单笔、单日、总风险限制风险监控实时监控风险使用情况
2 风险度量方法方法说明优点缺点波动率收益率标准差简单直观假设正态分布VaR风险价值直观易懂尾部风险不足CVaR条件风险价值考虑尾部风险计算复杂最大回撤最大亏损幅度实际风险历史依赖
风险度量
1 波动率风险#!/usr/bin/env python# -*- coding: utf-8 -*- 功能波动率风险度量 说明本代码仅供学习参考 importpandasaspdimportnumpyasnpfromtqsdkimportTqApi,TqAuth apiTqApi(authTqAuth(快期账户,快期密码))SYMBOLSHFE.rb2510klinesapi.get_kline_serial(SYMBOL,3600,
api.wait_update()defcalculate_volatility_risk(returns,window20,confidence
0.
: 计算波动率风险 参数: returns: 收益率序列 window: 窗口大小 confidence: 置信度 # 滚动波动率rolling_volreturns.rolling(window).std()# 年化波动率annual_volrolling_vol*np.sqrt(
# VaR假设正态分布fromscipy.statsimportnorm z_scorenorm.ppf(1-confidence)var-annual_vol*z_scorereturn{volatility:annual_vol,var:var,current_vol:annual_vol.iloc[-1]iflen(annual_vol)0else0,current_var:var.iloc[-1]iflen(var)0else0}# 计算收益率returnsklines[close].pct_change()# 计算风险risk_metricscalculate_volatility_risk(returns,window20,confidence
0.
print(波动率风险度量:)print(f 当前年化波动率:{risk_metrics[current_vol]:.2%})print(f 当前VaR (95%):{risk_metrics[current_var]:.2%})api.close()
2 VaR和CVaR计算#!/usr/bin/env python# -*- coding: utf-8 -*- 功能VaR和CVaR计算 说明本代码仅供学习参考 importpandasaspdimportnumpyasnpfromtqsdkimportTqApi,TqAuth apiTqApi(authTqAuth(快期账户,快期密码))SYMBOLSHFE.rb2510klinesapi.get_kline_serial(SYMBOL,3600,
api.wait_update()defcalculate_var_cvar(returns,confidence
95,methodhistorical): 计算VaR和CVaR 参数: returns: 收益率序列 confidence: 置信度 method: historical 或 parametric ifmethodhistorical:# 历史模拟法var-np.percentile(returns,(1-confidence)*
cvar-returns[returns-var].mean()else:# 参数法假设正态分布fromscipy.statsimportnorm meanreturns.mean()stdreturns.std()z_scorenorm.ppf(1-confidence)var-(meanz_score*std)cvar-(mean-std*norm.pdf(z_score)/(1-confidence))return{var:var,cvar:cvar,confidence:confidence}# 计算收益率returnsklines[close].pct_change().dropna()# 计算风险risk_metricscalculate_var_cvar(returns,confidence
95,methodhistorical)print(VaR和CVaR:)print(f VaR (95%):{risk_metrics[var]:.4f}({risk_metrics[var]*100:.2%}))print(f CVaR (95%):{risk_metrics[cvar]:.4f}({risk_metrics[cvar]*100:.2%}))api.close()
风险预算分配
1 等风险预算分配#!/usr/bin/env python# -*- coding: utf-8 -*- 功能等风险预算分配 说明本代码仅供学习参考 importpandasaspdimportnumpyasnpfromtqsdkimportTqApi,TqAuthclassEqualRiskBudget:等风险预算分配def__init__(self,symbols,total_risk_budget
0.
: 初始化 参数: symbols: 品种列表 total_risk_budget: 总风险预算如2% self.symbolssymbols self.total_risk_budgettotal_risk_budget self.risk_budget_per_symboltotal_risk_budget/len(symbols)defcalculate_position(self,symbol,price,volatility,account_value): 计算仓位基于风险预算 参数: symbol: 合约代码 price: 当前价格 volatility: 波动率 account_value: 账户价值 # 风险预算金额risk_amountaccount_value*self.risk_budget_per_symbol# 根据波动率计算仓位# 假设止损为2倍波动率stop_loss_pctvolatility*2ifstop_loss_pct0:positionint(risk_amount/(price*stop_loss_pct))else:position0returnposition,risk_amount# 使用示例apiTqApi(authTqAuth(快期账户,快期密码))SYMBOLS[SHFE.rb2510,SHFE.cu2510,SHFE.au2510]risk_managerEqualRiskBudget(SYMBOLS,total_risk_budget
0.
account_value100000# 获取各品种数据forsymbolinSYMBOLS:klinesapi.get_kline_serial(symbol,3600,
api.wait_update()quoteapi.get_quote(symbol)api.wait_update()# 计算波动率returnsklines[close].pct_change()volatilityreturns.std()# 计算仓位position,risk_amountrisk_manager.calculate_position(symbol,quote.last_price,volatility,account_value)print(f{symbol}:)print(f 风险预算:{risk_manager.risk_budget_per_symbol:.2%})print(f 风险金额:{risk_amount:.2f})print(f 建议仓位:{position}手)api.close()
2 风险平价预算分配#!/usr/bin/env python# -*- coding: utf-8 -*- 功能风险平价预算分配 说明本代码仅供学习参考 importpandasaspdimportnumpyasnpfromscipy.optimizeimportminimizefromtqsdkimportTqApi,TqAuthclassRiskParityBudget:风险平价预算分配def__init__(self,symbols,total_risk_budget
0.
: 初始化 参数: symbols: 品种列表 total_risk_budget: 总风险预算 self.symbolssymbols self.total_risk_budgettotal_risk_budget self.risk_weightsNonedefcalculate_covariance(self,api,days
:计算协方差矩阵returns_dict{}forsymbolinself.symbols:klinesapi.get_kline_serial(symbol,3600,days)api.wait_update()returnsklines[close].pct_change()returns_dict[symbol]returns returns_dfpd.DataFrame(returns_dict)returns_dfreturns_df.dropna()returnreturns_df.cov().valuesdefoptimize_risk_weights(self,cov_matrix): 优化风险权重风险平价 参数: cov_matrix: 协方差矩阵 nlen(self.symbols)defobjective(weights):weightsnp.array(weights)portfolio_volnp.sqrt(weights cov_matrix weights)risk_contributionsweights*(cov_matrix weights)/portfolio_vol target_riskportfolio_vol/n diffrisk_contributions-target_riskreturnnp.sum(diff**
constraints{type:eq,fun:lambdaw:np.sum(w)-1}bounds[(0,
for_inrange(n)]initial_weightsnp.ones(n)/n resultminimize(objective,initial_weights,methodSLSQP,boundsbounds,constraintsconstraints)self.risk_weightsdict(zip(self.symbols,result.x))returnself.risk_weights# 使用示例apiTqApi(authTqAuth(快期账户,快期密码))SYMBOLS[SHFE.rb2510,SHFE.cu2510,SHFE.au2510]risk_managerRiskParityBudget(SYMBOLS,total_risk_budget
0.
# 计算协方差矩阵cov_matrixrisk_manager.calculate_covariance(api,days
# 优化风险权重risk_weightsrisk_manager.optimize_risk_weights(cov_matrix)print(风险平价预算分配:)forsymbol,weightinrisk_weights.items():risk_budgetrisk_manager.total_risk_budget*weightprint(f{symbol}: 风险权重{weight:.4f}, 风险预算{risk_budget:.4%})api.close()
动态风险调整
1 风险监控#!/usr/bin/env python# -*- coding: utf-8 -*- 功能风险监控 说明本代码仅供学习参考 importpandasaspdimportnumpyasnpfromtqsdkimportTqApi,TqAuthclassRiskMonitor:风险监控器def__init__(self,risk_limits): 初始化 参数: risk_limits: 风险限额字典 { max_var:
02, # 最大VaR max_drawdown:
2, # 最大回撤 max_position_risk:
05 # 单品种最大风险 } self.risk_limitsrisk_limits self.current_risks{}self.alerts[]defcalculate_portfolio_risk(self,positions,prices,volatilities,account_value): 计算组合风险 参数: positions: 持仓字典 {symbol: position} prices: 价格字典 {symbol: price} volatilities: 波动率字典 {symbol: volatility} account_value: 账户价值 total_risk0forsymbol,positioninpositions.items():ifsymbolinpricesandsymbolinvolatilities:position_valueposition*prices[symbol]position_riskposition_value*volatilities[symbol]/account_value total_riskposition_risk self.current_risks[symbol]position_risk self.current_risks[total]total_riskreturntotal_riskdefcheck_risk_limits(self):检查风险限额alerts[]# 检查总风险ifself.current_risks.get(total,
self.risk_limits.get(max_var,
0.
:alerts.append({type:warning,message:f总风险{self.current_risks[total]:.2%}超过限额{self.risk_limits[max_var]:.2%}})# 检查单品种风险forsymbol,riskinself.current_risks.items():ifsymbol!totalandriskself.risk_limits.get(max_position_risk,
0.
:alerts.append({type:warning,message:f{symbol}风险{risk:.2%}超过限额})self.alertsalertsreturnalerts# 使用示例apiTqApi(authTqAuth(快期账户,快期密码))risk_limits{max_var:
02,max_drawdown:
2,max_position_risk:
05}monitorRiskMonitor(risk_limits)# 模拟持仓和风险positions{SHFE.rb2510:10,SHFE.cu2510:5}prices{SHFE.rb2510:4000,SHFE.cu2510:70000}volatilities{SHFE.rb2510:
02,SHFE.cu2510:
015}account_value100000# 计算风险total_riskmonitor.calculate_portfolio_risk(positions,prices,volatilities,account_value)print(f组合总风险:{total_risk:.2%})# 检查风险限额alertsmonitor.check_risk_limits()ifalerts:print(\n风险预警:)foralertinalerts:print(f{alert[message]})else:print(\n风险在限额内)api.close()
七、
常见问题Q1: 风险预算管理一定有效吗A: 有效但需要注意风险度量方法要准确风险预算分配要合理风险监控要及时风险调整要适度Q2: 如何选择风险度量方法A: 建议简单场景波动率需要直观VaR考虑尾部CVaR实际风险最大回撤Q3: 风险预算如何动态调整A: 方法根据市场波动率调整根据账户表现调整根据策略表现调整定期重新评估
八、
总结要点说明风险度量VaR、CVaR、波动率等预算分配等风险或风险平价风险监控实时监控风险使用动态调整根据市场变化调整风险预警设置风险预警机制下一步学习建议学习更复杂的风险度量方法研究动态风险预算调整探索机器学习风险预测学习组合风险优化免责声明本文仅供学习交流使用不构成任何投资建议。
期货交易有风险入市需谨慎。
更多资源天勤量化官网https://www.shinnytech.comGitHub开源地址https://github.com/shinnytech/tqsdk-python官方文档https://doc.shinnytech.com/tqsdk/latest