小摩Quant Risk面试回忆,难度螺旋升天
最近北美小摩(J.P. Morgan)的Quant Risk面试bar提得非常高,不再是以前那种考考基础VaR、聊聊Black-Scholes就完事的时代了。现在的面试深度和广度都上了一个大台阶,特别是在监管知识和模型实操上,问得非常细致,感觉就是想招能立刻上手干活的人。
第一部分:Risk Modeling & Regulatory Knowledge
这一轮现在是重中之重,面试官会假设你对核心的监管法规有非常扎实的理解,并且能把这些理论应用到实际的模型问题中。
第一题: FRTB (Fundamental Review of the Trading Book)
Question:
Explain the key differences between the Standardised Approach (SA) and the Internal Models Approach (IMA) under FRTB. What are the main challenges for a bank when moving from SA to IMA for a specific trading desk? Discuss the P&L attribution test (PLAT) and its role in model validation under IMA.
解析:
这道题是现在Market Risk岗位的必考题。FRTB是巴塞尔委员会为了修正之前市场风险资本框架的不足而推出的,核心目标是更清晰地划分银行的交易账户(Trading Book)和银行账户(Banking Book),并对交易账户的风险资本计量提出更严格的要求。
回答这个问题的关键在于要结构化。首先,清晰地对比SA和IMA的区别:
Standardised Approach (SA): 这是银行的默认选项。它是一个由监管机构设定好公式和参数的标准化方法。银行只需要把自己的头寸(positions)代入公式,就能算出对应的资本要求。它的优点是简单、可比性强,但缺点是比较保守(one-size-fits-all),可能会导致资本要求偏高,不能精确反映银行自身的风险状况。 Internal Models Approach (IMA): 如果银行想用更精细、更符合自己风险特征的方法,就可以申请使用内部模型法。银行需要开发自己的风险模型(通常是基于VaR和Expected Shortfall, ES)来计算资本。优点是风险敏感度高,可能更节约资本,但前提是模型必须通过监管的严格审批。
接下来,讨论从SA转向IMA的挑战。这个是开放性问题,主要看你的思考深度。
- 数据要求 (Data Requirements): IMA对数据的质量和长度要求极高。你需要有足够长的历史数据来校准(calibrate)和回测(backtest)你的模型,而且数据必须是“real price observations”。对于一些流动性差的资产,获取这样的数据本身就是个巨大的挑战。
- 模型开发与验证 (Model Development & Validation): 开发一个能通过监管审批的内部模型,技术难度非常大。你需要证明你的模型在各种市场环境下都足够稳健。这涉及到大量的统计检验和模型验证工作。
- P&L归因测试 (P&L Attribution Test - PLAT): 这是FRTB下IMA的一个核心要求,也是面试官追问的重点。PLAT的目的是确保银行前台交易系统里计算的理论损益(Hypothetical P&L)和风险管理部门的风险模型计算出的损益(Risk-Theoretical P&L)能够高度匹配。如果两者偏差太大,就说明风险模型不能准确捕捉交易台的风险来源,那么这个交易台就会被监管强制退回到SA。这个测试非常严格,是很多银行实施IMA的主要障碍之一。
- 系统和架构 (Systems & Infrastructure): 实施IMA需要强大的IT系统支持,能够处理海量数据、运行复杂模型并生成各种报告,这对银行的系统架构是个巨大的考验。
最后,在讨论PLAT时,可以进一步展开,比如解释Hypothetical P&L和Risk-Theoretical P&L的区别,以及PLAT失败的后果。这会显得你对细节的理解非常到位。
第二题: CCAR Stress Testing
Question:
Describe the general process of a CCAR (Comprehensive Capital Analysis and Review) stress test. If you were asked to design a stress test scenario for J.P. Morgan's mortgage Portfolio, what macroeconomic variables would you consider and how would you model the potential losses? Discuss the concept of model risk in the context of stress testing.
解析:
CCAR是美联储在08年金融危机后推出的,针对大型银行的年度“大考”,目的是确保银行在极端不利的经济环境下,依然有足够的资本来抵御风险。这个问题考察的是你对宏观经济、风险建模和模型风险的综合理解。
首先,简要介绍CCAR的流程:
- 情景设定 (Scenario Design): 美联储每年会发布几个宏观经济情景,包括基准(Baseline)、不利(Adverse)和严重不利(Severely Adverse)等。这些情景会包含一系列宏观经济变量的未来路径,比如GDP增长率、失业率、利率、房价指数(HPI)等。
- 银行建模 (Bank Modeling): 银行需要根据美联储给出的情景,利用自己的内部模型,预测在这些情景下未来9个季度的财务状况,包括收入、亏损、风险加权资产(RWA)的变化,并最终计算出资本充足率。
- 结果提交与评估 (Submission & Assessment): 银行将预测结果提交给美联储。美联储会评估银行的预测是否合理,以及在压力情景下银行的资本是否充足。
然后,重点来了,设计针对小摩按揭贷款组合的压力测试情景。这里需要你展现商业嗅觉(business sense)和建模思路。
宏观变量选择 (Macroeconomic Variables): 对于按揭贷款组合,核心的风险驱动因素包括: 失业率 (Unemployment Rate): 失业率飙升会直接导致借款人违约率(Probability of Default, PD)上升。 房价指数 (House Price Index, HPI): 房价大幅下跌,会导致抵押品价值缩水,从而提高银行在借款人违约后的损失率(Loss Given Default, LGD)。 利率 (Interest Rates): 利率的急剧变化,特别是对于浮动利率的按揭产品,会影响借款人的还款能力。 损失建模 (Loss Modeling): 你可以提出一个经典的损失模型框架:Expected Loss = PD * LGD * EAD (Exposure at Default)。 PD模型: 可以用一个宏观经济模型来预测PD。比如,将PD作为因变量,将失业率、HPI等宏观变量作为自变量,通过回归分析(如Logistic Regression)建立关系。PD_t = f(Unemployment_t, HPI_t, ...)。 LGD模型: LGD主要取决于房价。可以用一个模型来预测在不同HPI冲击下的回收率(Recovery Rate),从而得到LGD。LGD_t = 1 - Recovery_t = 1 - g(HPI_t, ...)。 EAD模型: 对于按揭贷款,EAD相对简单,可以约等于当前的贷款余额。
最后,讨论模型风险(Model Risk)。这是任何一个Quant岗都会关心的话题。在压力测试的背景下,模型风险尤其突出。
模型设定风险 (Model Specification Risk): 你选择的模型结构可能就是错的。比如,你假设PD和失业率是线性关系,但实际上可能是非线性的。 参数估计风险 (Parameter Estimation Risk): 即使模型结构对了,你用来估计模型参数的数据可能不够好,或者时间窗口不对,导致参数有偏。 模型实施风险 (Implementation Risk): 模型在代码实现的过程中可能出现bug。
可以提一下如何管理模型风险,比如进行严格的模型验证(Model Validation)、敏感性分析(Sensitivity Analysis)、设定模型使用的限制(Model Limitations)等。这会展示你作为一个Risk Quant的严谨性。
第二部分:Technical & Programming
这一轮会直接给你一个问题,让你在CoderPad或者类似的平台上写代码,并且要能解释你的思路。
第三题: Monte Carlo Simulation for VaR
Question:
You are holding a portfolio of two assets: a stock and a European call option on that stock. The stock price follows a Geometric Brownian Motion (GBM). Write a Python script to calculate the 1-day 99% Value at Risk (VaR) of this portfolio using Monte Carlo simulation. Explain your choice of parameters and the steps involved.
解析:
这道题考察的是你的金融工程知识和编程实现能力。VaR是市场风险管理的核心指标,而蒙特卡洛模拟是计算衍生品组合VaR的常用方法。
思路步骤:
1. 定义模型和参数 (Define Model & Parameters):
股票价格模型:[DS](/blog/data-interview-storytelling)/S = μ*dt + σ*dW,其中μ是漂移率,σ是波动率,dW是维纳过程。在风险中性的假设下,μ可以用无风险利率r代替。你需要向面试官明确你的假设,比如当前的股价S0、无风险利率r、波动率σ、期权到期时间T、行权价K等。
投资组合价值:Portfolio Value = Stock Price + Option Price。期权的价格需要用Black-Scholes公式来计算。
2. 模拟股票价格路径 (Simulate Stock Price Paths):
根据GBM的离散化形式 S_t = S_{t-1} * exp((r - 0.5 * σ^2) * Δt + σ * sqrt(Δt) * Z),其中Z是标准正态分布的随机数,Δt是时间步长(这里是1天,即1/252)。
进行大量的模拟(比如10000次),生成10000个一天后的股票价格 S_1。
3. 计算投资组合的未来价值 (Calculate Future Portfolio Value):
对于每一个模拟出的S_1,计算一天后投资组合的价值。
Portfolio Value_1 = S_1 + BlackScholes(S_1, K, T-Δt, r, σ)。注意,期权的剩余到期时间要减去Δt。
4. 计算损益分布 (Calculate P&L Distribution):
计算出当前投资组合的价值 Portfolio Value_0 = S_0 + BlackScholes(S_0, K, T, r, σ)。
P&L = Portfolio Value_1 - Portfolio Value_0。这样你就得到了10000个可能的P&L值。
5. 计算VaR (Calculate VaR):
将这10000个P&L值从低到高排序。
99% VaR就是这组P&L分布的1%分位数。比如,在10000个P&L中,第100个最低的P&L值就是VaR的估计值(通常取负数)。
代码实现:
在写Python代码时,要体现出良好的编程习惯。比如,把Black-Scholes公式和蒙特卡洛模拟封装成函数,使用numpy进行向量化计算以提高效率。
import numpy as np from scipy.stats import norm
def black_scholes_call(S, K, T, r, sigma): d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T)) d2 = d1 - sigma * np.sqrt(T) call_price = (S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)) return call_price
def portfolio_var_mc(S0, K, T, r, sigma, num_simulations, dt, confidence_level): initial_option_price = black_scholes_call(S0, K, T, r, sigma) initial_portfolio_value = S0 + initial_option_price
Z = np.random.standard_normal(num_simulations)
S1 = S0 * np.exp((r - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z)
future_option_price = black_scholes_call(S1, K, T - dt, r, sigma)
future_portfolio_value = S1 + future_option_price
pnl = future_portfolio_value - initial_portfolio_value
var = -np.percentile(pnl, 100 * (1 - confidence_level))
return var
S0 = 100 K = 105 T = 0.5 r = 0.05 sigma = 0.2 num_simulations = 10000 dt = 1/252 confidence_level = 0.99
var_estimate = portfolio_var_mc(S0, K, T, r, sigma, num_simulations, dt, confidence_level)
