historicalRiskEngine
首发版本:3.00.6.4
语法
historicalRiskEngine(factorReturns, portfolio, settings)
详情
基于历史模拟法计算组合在历史风险因子冲击场景下的损益,生成风险原语(Risk Primitive)。该函数使用 mktRiskFactorReturns 生成的风险因子收益矩阵,将每个历史日期对应的一行收益作为一个联合市场场景;在每个场景下还原风险因子水平、重建市场数据,并对组合中的资产逐一重新估值,最终输出各资产在所有历史场景下的收益 / 盈亏(Profit and Loss, PnL)结果。
由于历史模拟法直接以历史观测作为冲击场景,因此生成的场景总数固定等于输入历史数据中的有效收益率天数(即历史市场数据行数减 1),不受 settings.nSimulations 参数控制。
注意:当前函数主要用于生成后续计算 VaR、ES 等风险指标所需的资产级场景损益(Risk Primitive),不直接计算最终的 VaR 或 ES 汇总指标。
参数
factorReturns 由 mktRiskFactorReturns 返回的字典,包含基准日期、风险因子定义、历史收益矩阵、基准因子水平和基准市场数据等信息。
portfolio 字典(STRING → ANY)。组合信息,用于描述需要重估的资产及持仓数量。通常包含以下键:
-
names:STRING 向量,资产名称或资产标识。
-
instruments:ANY 向量,资产对应的 INSTRUMENT 实例。
-
amounts:DOUBLE 向量,各资产的持仓数量或面值(可为正数表示多头、负数表示空头、或 0 表示空仓)。其长度应与 names 和 instruments 一致。
注意:当前版本引擎不提供跨币种自动折算功能,用户须自行确保组合中的所有资产均使用同一货币计价。
settings 字典(STRING → ANY)。风险引擎配置项,用于控制估值日期、币种、维度输出和定价行为等。支持的配置包括:
-
baseCurrency:STRING 标量,必填。组合基准币种。为后续版本支持跨币种折算预留的接口参数,当前版本不参与计算、不影响计算结果。
-
analysisHorizon:INT 标量,可选,默认值为 1。分析期/持有期,单位为交易日,必须大于 0。
-
samplingHorizon:INT 标量,可选,默认值为 1。历史收益采样期,单位为交易日,必须大于 0。
-
assetDimensions:STRING 向量,可选,默认值为 NULL。资产输出维度。当前版本仅支持为空或 "assetType"。
-
riskDimensions:STRING 向量,可选,默认值为 NULL。风险维度。当前版本必须为空。
返回值
返回一个字典(STRING → ANY),包含以下键:
-
riskPrimitive:表。资产级风险场景损益结果表,表的每一行对应组合中的一个资产,包含以下列:
-
assetName:STRING 向量。资产名称或标识。
-
assetType:STRING 向量。资产类型(如 Stock、Bond 等)。
-
assetPnLs:DOUBLE[] 数组向量。记录各资产在所有历史模拟场景下的全量损益(PnL)分布。每一行是一个长度等于历史模拟场景总数(即历史收益有效天数)的 DOUBLE 向量。
-
-
modelResult:字典(STRING → ANY),表示历史模拟收益及审计工件,包含以下键:
-
nSimulations:INT 标量,历史模拟场景数量,即历史收益观测数。
-
returns:DOUBLE 类型矩阵,缩放后的历史场景收益矩阵。
-
artifacts:字典,审计工件,包含以下键:
-
factorMatrix:DOUBLE 类型矩阵,表示原始历史收益矩阵。
-
weightedMatrix:历史模拟法直接使用历史收益构建场景,不涉及 EWMA 加权历史收益矩阵,此处为 NULL。
-
covariance:历史模拟法不估计协方差矩阵,此处为 NULL。
-
variance:历史模拟法不估计因子方差,此处为 NULL。
-
randomSeed:历史模拟法不涉及随机抽样,因此不使用随机数种子,此处为 NULL。
-
-
例子
以下示例以人民币国债收益率曲线和固定利率债券组合为例,先使用指定区间内的交易日批量构造多期历史曲线并计算因子收益,再通过历史模拟法对投资组合进行全值重估,获取资产级历史场景损益表(riskPrimitive)。
// 构造单期利率曲线
def makeExampleCurve(d, rates) {
return parseMktData({
"mktDataType": "Curve",
"curveType": "IrYieldCurve",
"curveName": "CNY_TREASURY_BOND",
"referenceDate": d,
"currency": "CNY",
"dayCountConvention": "Actual365",
"compounding": "Continuous",
"frequency": "Annual",
"interpMethod": "Linear",
"extrapMethod": "Flat",
"dates": d + 365 * (1..size(rates)),
"values": rates
})
}
// 获取指定区间内的交易日,并批量构造历史曲线
// 示例使用多期历史数据演示历史模拟风险引擎的典型调用流程
dates = getMarketCalendar("SSE", 2025.10.01, 2025.12.31)
curveHistory = array(ANY, 0)
for (i in 0..(size(dates)-1)) {
// 模拟带有微小波动的收益率曲线
rates = [0.020, 0.022, 0.025] + rand(0.002, 3) - 0.001
curveHistory.append!(makeExampleCurve(dates[i], rates))
}
mktDataTable = table(dates as dates, curveHistory as CNY_TREASURY_BOND)
asOf = mktDataTable.dates.last()
mfr = mktRiskFactorReturns(mktDataTable=mktDataTable, asOf=asOf)
// 构造包含两笔固定利率债券的投资组合
instrumentA = parseInstrument({
"productType": "Cash", "assetType": "Bond", "bondType": "FixedRateBond",
"instrumentId": "EXAMPLE_BOND_A", "start": 2025.01.07, "maturity": 2028.01.07,
"issuePrice": 100.0, "coupon": 0.03, "frequency": "Annual",
"dayCountConvention": "Actual365", "currency": "CNY",
"discountCurve": "CNY_TREASURY_BOND"
})
instrumentB = parseInstrument({
"productType": "Cash", "assetType": "Bond", "bondType": "FixedRateBond",
"instrumentId": "EXAMPLE_BOND_B", "start": 2025.01.07, "maturity": 2029.01.07,
"issuePrice": 100.0, "coupon": 0.04, "frequency": "Annual",
"dayCountConvention": "Actual365", "currency": "CNY",
"discountCurve": "CNY_TREASURY_BOND"
})
instruments = array(ANY, 0)
instruments.append!(instrumentA)
instruments.append!(instrumentB)
portfolio = dict(STRING, ANY)
portfolio["names"] = ["positionA", "positionB"]
portfolio["instruments"] = instruments
portfolio["amounts"] = [1000.0, -500.0]
// 配置引擎参数
riskSettings = dict(STRING, ANY)
riskSettings["baseCurrency"] = "CNY"
riskSettings["analysisHorizon"] = 10
riskSettings["assetDimensions"] = ["assetType"]
// 调用历史模拟风险引擎
histResult = historicalRiskEngine(factorReturns=mfr, portfolio=portfolio, settings=riskSettings)
相关函数:mktRiskFactorReturns, ewmaRiskEngine, parseMktData, parseInstrument, instrumentPricer
