Files
nexus-quant-terminal/backend/app/routers/export.py
T

44 lines
1.8 KiB
Python
Raw Normal View History

import io, csv
from fastapi import APIRouter
from fastapi.responses import StreamingResponse
from ..schemas import GreeksRequest
from ..core.greeks import portfolio_greeks
from ..core.garman_kohlhagen import gk_price
router = APIRouter(prefix="/export", tags=["export"])
@router.post("/csv")
def export_csv(req: GreeksRequest):
options = [o.model_dump() for o in req.options]
result = portfolio_greeks(options, req.S, req.sigma, req.T, req.r_d, req.r_f)
out = io.StringIO()
w = csv.writer(out)
w.writerow(["QUANTRISK FX — GARMAN-KOHLHAGEN GREEKS REPORT"])
w.writerow(["Spot", req.S, "Sigma", req.sigma, "T", req.T,
"r_d", req.r_d, "r_f", req.r_f])
w.writerow([])
w.writerow(["PORTFOLIO TOTALS"])
w.writerow(["Greek", "Value", "Description"])
desc = {"delta":"Price sensitivity","gamma":"Delta curvature","vega":"Vol sensitivity",
"theta":"Time decay/yr","rho_d":"Dom rate sensitivity","phi":"For rate sensitivity"}
for k, v in result["total"].items():
w.writerow([k.upper(), v, desc.get(k,"")])
w.writerow([])
w.writerow(["LEG BREAKDOWN"])
w.writerow(["Leg","Delta","Gamma","Vega","Theta"])
for leg in result["legs"]:
w.writerow([leg["label"],leg["delta"],leg["gamma"],leg["vega"],leg["theta"]])
w.writerow([])
w.writerow(["OPTION PRICES (Garman-Kohlhagen)"])
w.writerow(["Leg","GK Price"])
for opt in options:
price = gk_price(req.S, opt["K"], opt.get("T",req.T), req.r_d, req.r_f,
req.sigma, opt["type"])
w.writerow([f"{opt['type'].upper()} K={opt['K']} qty={opt['qty']}", round(price,5)])
out.seek(0)
return StreamingResponse(
io.BytesIO(out.getvalue().encode()),
media_type="text/csv",
headers={"Content-Disposition": "attachment; filename=gk_greeks_report.csv"},
)