2. 计算存货风险敞口

任务目标

作为做市商,你持有一定数量的证券存货。本案例要求:计算当前存货的市场价值,并评估当市场价格发生变动时,存货价值的变化幅度(即风险敞口)。核心输出为存货市值与价格敏感度(Delta)。

实现方案

采用线性敏感度模型:存货市值 = Σ(持仓数量 × 当前价格)。价格敏感度用Delta表示,即价格每变动1元时存货价值的变动量,等于持仓数量之和(不考虑二阶效应)。为便于观察不同价格情景下的敞口,代码同时计算价格上下波动1%时的市值变化。

关键完整代码

import json
from typing import Dict, List

# ========== 输入数据:做市商当前存货 ==========
# 格式: [{"symbol": "代码", "quantity": 持仓数量, "price": 当前市价}]
inventory = [
    {"symbol": "600519", "quantity": 200, "price": 1685.00},
    {"symbol": "000858", "quantity": 1500, "price": 142.30},
    {"symbol": "300750", "quantity": 800, "price": 189.60},
]

# ========== 核心计算逻辑 ==========
def calc_inventory_exposure(inv: List[Dict]) -> Dict:
    """
    计算存货市值、Delta敞口及1%价格波动下的损益。
    返回结构化结果,便于验证。
    """
    total_value = 0.0
    total_delta = 0  # 价格每变动1元,存货价值的变动量(股数合计)
    details = []

    for item in inv:
        sym = item["symbol"]
        qty = item["quantity"]
        price = item["price"]
        mkt_val = qty * price
        total_value += mkt_val
        total_delta += qty
        details.append({
            "symbol": sym,
            "quantity": qty,
            "price": price,
            "market_value": round(mkt_val, 2)
        })

    # 1% 价格波动情景
    up_1pct = total_value * 0.01
    down_1pct = -total_value * 0.01

    return {
        "inventory_details": details,
        "total_market_value": round(total_value, 2),
        "delta_per_1yuan": total_delta,          # 价格变动1元的敞口
        "delta_per_1pct_up": round(up_1pct, 2),  # 价格上涨1%的损益
        "delta_per_1pct_down": round(down_1pct, 2)  # 价格下跌1%的损益
    }

# ========== 执行与输出 ==========
if __name__ == "__main__":
    result = calc_inventory_exposure(inventory)
    print(json.dumps(result, ensure_ascii=False, indent=2))

运行方式

python inventory_exposure.py

无需安装第三方库,Python 3.6+ 即可运行。

验证方法与通过条件

运行后观察输出,满足以下条件即判定通过:

  • 市值计算正确:手工核对第一行,200 × 1685.00 = 337,000.00,输出中该symbol的market_value应与此一致;
  • 汇总一致:total_market_value 等于三行market_value之和;
  • Delta正确:delta_per_1yuan = 200 + 1500 + 800 = 2500,即价格整体上涨1元时存货增值2500元;
  • 1%情景正确:delta_per_1pct_up = total_market_value × 0.01,且为正数;delta_per_1pct_down为其相反数。

若以上数值与手工计算结果一致,说明存货风险敞口计算逻辑正确。

预期输出(与代码逻辑严格一致)

{
  "inventory_details": [
    {"symbol": "600519", "quantity": 200, "price": 1685.0, "market_value": 337000.0},
    {"symbol": "000858", "quantity": 1500, "price": 142.3, "market_value": 213450.0},
    {"symbol": "300750", "quantity": 800, "price": 189.6, "market_value": 151680.0}
  ],
  "total_market_value": 702130.0,
  "delta_per_1yuan": 2500,
  "delta_per_1pct_up": 7021.3,
  "delta_per_1pct_down": -7021.3
}

风险敞口解读

当前存货总市值约70.2万元。Delta为2500股,意味着若所有持仓价格同步上涨1元,存货价值增加2500元;若下跌1元,则损失2500元。1%涨跌情景下,市值波动约±7021元。该数值即为做市商当前面临的线性存货风险敞口,可用于设定持仓限额或对冲决策参考。