# VND/USD FxForward 예제 (ORE 1.8.15)

https://ore-xml-reference.netlify.app 에 게시된 ORE 1.8.15 XML 레퍼런스(스키마 + 예제 입력)만을 근거로 작성한
VND/USD 선물환(FxForward) 최소 실행 예제. 시장 데이터는 샘플 값이며 asof = 2026-09-18.

## 구조

```
vnd_usd_fxforward/
├── ore.xml                      # ORE 실행 설정 (NPV / Cashflow / Curves analytics)
├── Input/
│   ├── portfolio.xml            # FxForward trade: 3M 만기 USD 1MM buy / VND 25.4792BN sell
│   ├── market_20260918.txt      # 시장 데이터 (아래)
│   ├── conventions.xml          # SOFR MM / SOFR OIS / USD-VND FX 포워드 컨벤션
│   ├── curveconfig.xml          # USD1D, VND-FWD 두 커브
│   ├── todaysmarket.xml         # market configuration (discounting, FX spot)
│   ├── pricingengine.xml        # DiscountingFxForwardEngine
│   └── fixings_20260918.txt     # 빈 파일 (필요 fixings 없음)
└── Output/                      # ORE 실행 결과 출력
```

## 커브 구성 (요청 사양 반영)

**USD1D — USD 커브: SOFR MM rate + IRSWAP**
- Deposit 세그먼트: `MM/RATE/USD/0D/1D`(ON), `2D/1W`, `2D/2W`, `2D/3W` — SOFR 머니마켓 레이트,
  컨벤션 `USD-SOFR-MM-CONVENTIONS` (index-based, `USD-SOFR`)
- OIS 세그먼트: `IR_SWAP/RATE/USD/2D/1D/1M … 30Y` — SOFR OIS 스왑 레이트,
  컨벤션 `USD-SOFR-OIS-CONVENTIONS` (`USD-SOFR`, A360, Annual/Following, PaymentLag 2, RateCutoff 2)
- 이 구성은 사이트 `shared/curveconfig.xml` 의 EUR1D (EONIA MM + OIS) 구조를 SOFR에 그대로 대응한 것
  (ORE 1.8.15 예제 입력은 2016년 LIBOR/EONIA 시대 데이터라 SOFR 예제가 사이트에 없음)

**VND-FWD — VND 커브: FX Forward(Swap) Points 로 임플라이**
- CrossCurrency 세그먼트 `Type=FX Forward`: `FXFWD/RATE/USD/VND/1W … 2Y` 포인트 +
  `DiscountCurve=USD1D` + `SpotRate=FX/RATE/USD/VND` (spot 25,400)
- 즉 `DF_vnd(t) = DF_usd(t) × F(t) / S` — VND 금리 커브 없이 포워드 포인트에서 도출
- 컨벤션 `USD-VND-FX-CONVENTIONS`: SpotDays 2, **PointsFactor 1** (VND 포인트는 USD당 VND 단위로
  직접 표시: 예 3M +79.2 → outright 25,479.20), AdvanceCalendar US
- 이 구성은 사이트 `shared/curveconfig.xml` 의 `SEK-IN-USD` 커브("SEK FX Fwd discount curve",
  FXFWD/RATE/USD/SEK/…) 패턴의 적용

**Trade** (`Input/portfolio.xml`)
- ValueDate 2026-12-22 = spot(2026-09-22, T+2 US) + 3M
- Bought USD 1,000,000 / Sold VND 25,479,200,000 (= 1MM × outright 25,479.20) → 기입 시점 NPV ≈ 0

## 시장 데이터 (샘플)

| 구분 | Quote | 값 |
|---|---|---|
| FX spot | `FX/RATE/USD/VND` | 25,400.00 |
| SOFR MM | `MM/RATE/USD/0D/1D` … `2D/3W` | 4.32% ~ 4.35% |
| SOFR OIS | `IR_SWAP/RATE/USD/2D/1D/1M` … `30Y` | 4.37% → 3.83% (역글로벌) |
| VND 포인트 | `FXFWD/RATE/USD/VND/1W` … `2Y` | +6.1 ~ +635.0 (VND-USD 베이시스 약 +1.25% p.a.) |

## 실행

```
cd vnd_usd_fxforward && ore ore.xml        # ORE 1.8.15
```

로컬 빌드 ORE 1.8.15.0 (`~/dev/Engine/build/App/ore`, git tag `1.8.15.0`)로 실행 테스트 완료 —
레퍼런스 사이트(ORE 1.8.15)와 동일 버전 기준 테스트:

```
Pricing: Build Market / Build Portfolio / Cashflow Report / NPV Report / Curves Report  OK
run time: 0.02 sec, ORE done.
```

- `Output/npv.csv`: NPV = **0.000000 USD** (at-market 진입: SoldAmount를 시장 포워드 25,479.20로 설정)
- `Output/flows.csv`: 양 다리 PayDate = 2026-12-22 (ValueDate), USD DF 0.988674 / VND DF 0.985464
  → VND 다리 PV = 25,479,200,000 × 0.985464 / 25,400 = 988,673.52 USD = USD 다리 PV (일치)
- `Output/curves.csv`: USD1D 3M DF 0.98914 (≈4.3%), VND-FWD 3M DF 0.98607 (≈5.6%,
  USD + 약 1.25% 베이시스 — 포워드 포인트로 임플라이된 수준)

실행 중 확인한 ORE 동작 2가지:
1. `todaysmarket.xml` 의 `<FxSpot>` 값은 **curve spec** 형식(`FX/USD/VND`, 3 토큰)이어야 함.
   market quote 이름(`FX/RATE/USD/VND`)을 넣으면 `Unexpected number of tokens in FX curve spec` 에러.
   반면 curveconfig 의 `<SpotRate>`는 market quote 이름(`FX/RATE/USD/VND`)을 사용 — 사이트 shared
   예제(`FX/EUR/USD`, `FX/RATE/USD/SEK`)와 동일하게 구분해서 사용할 것.
2. FxForward 트레이드에 `SettlementData` 를 주지 않으면 ORE가 기본 payment lag(T+2)를 적용해
   PayDate = ValueDate + 2영업일 이 됨. 선물환 값결제일(ValueDate)에 결제하려면
   `<Settlement>Physical</Settlement>` + `<SettlementData><Rules><PaymentLag>0D</PaymentLag>...` 를
   명시 (예제에 반영됨).

## 검증

모든 XML을 사이트 게시 XSD로 검증 (레퍼런스 사이트의 XSD 결함 3건은 로컬 보완 후 — readme 하단):
`ore.xml`, `curveconfig.xml`, `pricingengine.xml` — 게시 XSD 그대로 통과.
`conventions.xml`, `todaysmarket.xml` — XSD가 `ore_types.xsd` include가 빠져 있어 include 추가 후 통과.
`portfolio.xml` — XSD에서 `Portfolio` 루트 선언이 주석처리되어 있어 선언 복원 후 통과.
추가 정합성 체크: quote 이름 ↔ curveconfig/todaysmarket 참조 일치, 컨벤션 ID 정의/참조 일치,
3M outright(25,479.20) = spot + points/PointsFactor 일치 — 모두 통과.

## 참조한 사이트 경로

- 스키마: `/xsd/ore.xsd`, `/xsd/curveconfig.xsd`, `/xsd/conventions.xsd`, `/xsd/todaysmarket.xsd`,
  `/xsd/instruments.xsd`, `/xsd/pricingengines.xsd`
- SEK FX-forward 임플라이드 커브 패턴: `/shared/curveconfig.xml` (`SEK-IN-USD`)
- MM/IR_SWAP/FXFWD quote 네이밍 실례: `/shared/market_20160205.txt`
- Deposit/OIS/FX 컨벤션 형식: `/shared/conventions.xml` (`EUR-EONIA-CONVENTIONS`, `USD-OIS-CONVENTIONS`, `USD-SEK-FX-CONVENTIONS`)
- FxForward 트레이드 XML: `/examples/curvebuilding/bootstrapconsistency/input/_trades/01_fxfwd_eur_usd_3m__fxforward.xml`
- ore.xml 구조: `/examples/curvebuilding/bootstrapconsistency/input/ois_ore.xml`, `/examples/minimalsetup/input/ore.xml`
- quote 네이밍 문서: `/reference/market-quotes`

## 주의사항 / 한계

- **ORE 1.8.15에 베트남(VNM) 캘린더가 없음** (사이트 `/reference/calendars` 확인). FX 포워드 만기
  계산은 US 캘린더로만 진행. VNM 휴일이 필요하면 `calendaradjustment.xsd`로 커스텀 캘린더 정의 가능.
- `USD-SOFR` 인덱스 네이밍은 사이트 예제에 SOFR 실례가 없어 `USD-FedFunds`/`EUR-EONIA`와 동일한
  `CCY-인덱스` 패턴으로 작성함.
- 시장 데이터 값은 실측이 아닌 자체 일관성을 갖춘 샘플.
