ewmaRiskEngine

首发版本:3.00.6.4

语法

ewmaRiskEngine(factorReturns, portfolio, settings)

详情

基于 EWMA(Exponentially Weighted Moving Average,指数加权移动平均)协方差估计和条件多元正态模拟计算组合在模拟风险因子冲击场景下的损益,生成风险原语(Risk Primitive)。

该函数使用 mktRiskFactorReturns 生成的历史风险因子收益对象,根据指数衰减权重估计风险因子协方差矩阵,并基于多元正态分布生成指定数量的联合收益场景;随后在每个场景下还原风险因子水平、重建市场数据,并对组合中的资产逐一重新估值,最终输出各资产在所有模拟场景下的收益 / 盈亏(Profit and Loss, PnL)结果。

参数

factorReturns 字典(STRING → ANY)。由 mktRiskFactorReturns 返回的风险因子收益对象,包含基准日期、风险因子定义、历史收益矩阵、基准因子水平和基准市场数据等信息。

portfolio 字典(STRING → ANY)。组合信息,用于描述需要重估的资产及持仓数量。通常包含以下键:

  • names:STRING 向量,资产名称或资产标识。

  • instruments:ANY 向量,资产对应的 INSTRUMENT 实例。

  • amounts:DOUBLE 向量,各资产的持仓数量或面值。其长度应与 names 和 instruments 一致。

settings 字典(STRING → ANY)。风险引擎配置项,用于控制估值日期、币种、维度输出和定价行为等。支持的配置包括:

  • baseCurrency:STRING 标量,必填。组合基准币种。为后续版本支持跨币种折算预留的接口参数,当前版本不参与计算、不影响计算结果。

  • analysisHorizon:INT 标量,可选,默认值为 1。分析期/持有期,单位为交易日,必须大于 0。

  • samplingHorizon:INT 标量,可选,默认值为 1。历史收益采样期,单位为交易日,必须大于 0。

  • decay:DOUBLE 标量,可选,默认值为 0.94。EWMA 衰减系数。

  • nSimulations:INT 标量,可选,默认值为 1000。模拟场景数,必须大于 0。

  • randomSeed:INT 标量,可选,默认值为 NULL。随机数种子,必须大于等于 0。

  • assetDimensions:STRING 向量,可选,默认值为 NULL。资产输出维度。当前版本仅支持为空或 "assetType"。

  • riskDimensions:STRING 向量,可选,默认值为 NULL。风险维度。当前版本必须为空。

返回值

返回一个字典(STRING → ANY),包含以下键:

  • riskPrimitive:一个表。表示资产级风险场景损益结果表,表的每一行对应组合中的一个资产,包含以下列:

    • assetName:STRING 向量。资产名称或标识。

    • assetType:STRING 向量。资产类型(如 Stock、Bond 等)。

    • assetPnLs:DOUBLE[] 数组向量。记录各资产在所有 EWMA 模拟场景下的全量损益(PnL)分布。每一行是一个长度等于模拟场景总数 nSimulations 的 DOUBLE 向量。

  • modelResult:字典(STRING → ANY)。模型运行结果与中间工件,包含以下键:

    • nSimulations:INT 标量。实际生成的 EWMA 模拟场景总数。

    • returns:DOUBLE 矩阵。模拟因子收益率矩阵,每一行代表一个模拟场景下全部因子的联合收益率。

    • artifacts:字典。包含 EWMA 模型估计与模拟的内部工件:

      • factorMatrix:DOUBLE 矩阵。输入的基础历史因子收益率矩阵。

      • weightedMatrix:DOUBLE 矩阵。EWMA 加权历史收益矩阵 R。

      • covariance:DOUBLE 矩阵。基于 EWMA 估计的因子协方差矩阵 Sigma。

      • variance:DOUBLE 向量。协方差矩阵的对角元素(各因子方差)。

      • randomSeed:INT 标量。实际生效的随机数种子。

例子

以下示例以固定利率债券投资组合和多期人民币国债收益率曲线为例,演示基于 EWMA 模拟法进行市场风险全值重估的完整流程。示例首先使用指定区间内的交易日批量构造历史曲线,并通过 mktRiskFactorReturns 提取历史因子收益;随后在 settings 中配置基准货币、10 日分析期以及 EWMA 参数(设置衰减因子 decay=0.94、生成 5000 个多元正态联合冲击场景,并指定随机种子 randomSeed=42 以保证结果可复现)。最后调用 ewmaRiskEngine 完成资产全值重估,并展示如何提取模型估计的因子协方差矩阵工件与资产级场景损益表(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
    })
}

// 获取指定区间内的交易日,并批量构造历史曲线
// 示例使用多期历史数据演示 EWMA 风险引擎的典型调用流程
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]

// 配置 EWMA 专属参数
riskSettings = dict(STRING, ANY)
riskSettings["baseCurrency"] = "CNY"
riskSettings["analysisHorizon"] = 10
riskSettings["decay"] = 0.94
riskSettings["nSimulations"] = 5000
riskSettings["randomSeed"] = 42
riskSettings["assetDimensions"] = ["assetType"]

// 调用 EWMA 风险引擎
ewmaResult = ewmaRiskEngine(factorReturns=mfr, portfolio=portfolio, settings=riskSettings)

// 提取资产级场景损益表与协方差矩阵工件
riskPrimitive = ewmaResult.riskPrimitive
covMatrix = ewmaResult.modelResult.artifacts.covariance

相关函数:mktRiskFactorReturns, historicalRiskEngine, parseMktData, parseInstrument, instrumentPricer