33 lines
893 B
Python
33 lines
893 B
Python
def pnl_path(spot_series, obs_forward, notional=1_000_000):
|
|
"""
|
|
Given a time series of spot prices (list of floats) and a
|
|
locked-in forward price (obs_forward), returns a list of
|
|
PnL values under a +1 lot trade.
|
|
PnL_t = notional * (spot_t - obs_forward)
|
|
"""
|
|
return [notional * (s - obs_forward) for s in spot_series]
|
|
|
|
import random
|
|
# e.g. 10 days of spot returns ±0.5%
|
|
base = 1.16987
|
|
path = []
|
|
for _ in range(10):
|
|
shock = random.uniform(-0.005, 0.005)
|
|
base = base * (1 + shock)
|
|
path.append(round(base, 6))
|
|
|
|
from risk import pnl_path
|
|
|
|
# assume obs_forward from your engine, e.g. 1.17105
|
|
obs_forward = 1.17105
|
|
pnls = pnl_path(path, obs_forward)
|
|
print("Day-by-day PnL:", pnls)
|
|
|
|
import numpy as np
|
|
|
|
# compute daily PnL changes
|
|
diffs = np.diff(pnls)
|
|
# find the 5th percentile loss
|
|
var95 = -np.percentile(diffs, 5)
|
|
print(f"1-day 95% VaR: ${var95:,.2f}")
|