# Commodities

## Commodities

### Overview

Ventuals commodity perps provide synthetic exposure to physical commodity futures benchmarks. Unlike equity index perps which track ETF spot prices, commodity perps reference designated futures contracts on major exchanges and implement a deterministic roll schedule to maintain continuous exposure.

The perp tracks a rolling futures benchmark — not a physical delivery price, not a generic spot price, and not all grades or varieties of a commodity.

***

### Oracle Price

#### External pricing

Ventuals derives external prices for commodity perps from CBOT futures settlement data. External pricing is available during CBOT Globex trading hours, which differ from the near-continuous sessions available for energy or metals contracts.

CBOT wheat and soy futures trade on CME Globex in two sessions with a multi-hour daily close:

| Session                        | Days          | Hours (ET)        |
| ------------------------------ | ------------- | ----------------- |
| Evening                        | Sunday–Friday | 8:00 PM – 8:45 AM |
| Day                            | Monday–Friday | 9:30 AM – 2:20 PM |
| Daily close (no external data) | Monday–Friday | 2:20 PM – 8:00 PM |

Total external coverage is approximately 17.5 hours per weekday. When fresh external pricing data is available, it is used directly as the oracle price.

#### Internal pricing

When external pricing is unavailable, the oracle switches to an internal pricing mechanism which initializes on the last available external price.

The switchover to internal pricing happens when external pricing is unavailable for more than 30 seconds; for example during the daily CBOT close window, weekends, or holidays.

| Session     | Start                    | End                      |
| ----------- | ------------------------ | ------------------------ |
| Daily close | Monday–Friday 2:20 PM ET | Monday–Friday 8:00 PM ET |
| Weekend     | Friday 2:20 PM ET        | Sunday 8:00 PM ET        |

The daily close gap is approximately 5.5 hours each weekday afternoon/evening. Traders should be aware that the oracle operates in internal pricing mode during this window.

If external pricing becomes stale during active exchange hours (e.g., due to exchange price limits, data feed interruptions, or exchange outages), the oracle transitions to internal pricing using the same mechanism. When fresh external data resumes, the oracle snaps back to external pricing on the next tick.

**Internal oracle price formula**

The oracle for internal pricing initializes on the last available external price, and is defined as:

```
Oracle_t = (1 - k) · Oracle_{t-1} + k · ImpactPx_t
```

Where:

* ImpactPx = median(impactBidPx, impactAskPx)
* k = dynamic adjustment coefficient

**Dynamic Adjustment Coefficient (k)**

The coefficient k controls the sensitivity at which impact price adjusts the oracle price. It adapts based on the short-term deviation between the current impact price and its 1-hour EMA:

| Δ (ImpactPx vs EMA) | k value |
| ------------------- | ------- |
| < 0.02%             | 0.7     |
| \[0.02, 0.05)%      | 0.5     |
| \[0.05, 0.1)%       | 0.3     |
| \[0.1, 0.2)%        | 0.2     |
| \[0.2, 0.4)%        | 0.1     |
| ≥ 0.4%              | 0.0     |

When external pricing resumes, the oracle snaps to the external pricing mechanism on the next tick.

***

### Futures Reference & Roll Schedule

#### Designated contract schedule

Commodity perps reference a specific futures contract at any given time. The following schedule defines the active (front) contract at the start of each calendar month:

| Asset | Underlying                              | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
| ----- | --------------------------------------- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| WHEAT | 1 bushel of CBOT Chicago SRW Wheat (ZW) | H   | H   | K   | K   | N   | N   | U   | U   | Z   | Z   | Z   | H   |
| SOY   | 1 bushel of CBOT Soybeans (ZS)          | H   | H   | K   | K   | N   | N   | X   | X   | X   | X   | F   | F   |

Contract month codes: F = Jan, H = Mar, K = May, N = Jul, U = Sep, X = Nov, Z = Dec.

Wheat has 5 contract months per year (Mar, May, Jul, Sep, Dec).

Soy has 5 active contract months (Mar, May, Jul, Nov, Jan), skipping the less liquid August and September contracts.

#### Roll mechanics

The oracle transitions from the expiring front contract to the next contract over a deterministic 5-business-day roll period. The roll runs from the 6th to the 10th business day of each roll month, with the 5th business day being the last day of 100% front-contract pricing.

Oracle transitions happen on roll days at 5:30 PM ET.

| Business Day of Month | Front Contract Weight | Next Contract Weight |
| --------------------- | --------------------- | -------------------- |
| 5th (last pure front) | 100%                  | 0%                   |
| 6th (roll begins)     | 80%                   | 20%                  |
| 7th                   | 60%                   | 40%                  |
| 8th                   | 40%                   | 60%                  |
| 9th                   | 20%                   | 80%                  |
| 10th (roll complete)  | 0%                    | 100%                 |

During the roll window, the oracle price is computed as:

```
oracle = (front_weight × front_settlement) + (next_weight × next_settlement)
```

#### Roll calendar

**WHEAT**

Rolls occur 5 times per year, in the months preceding each contract's First Notice Day (FND).

| Roll Month | From → To           | Roll Period (BD) | First Notice Day |
| ---------- | ------------------- | ---------------- | ---------------- |
| February   | H (Mar) → K (May)   | BD 6 – BD 10     | Feb 27           |
| April      | K (May) → N (Jul)   | BD 6 – BD 10     | Apr 30           |
| June       | N (Jul) → U (Sep)   | BD 6 – BD 10     | Jun 30           |
| August     | U (Sep) → Z (Dec)   | BD 6 – BD 10     | Aug 31           |
| November   | Z (Dec) → H (Mar+1) | BD 6 – BD 10     | Nov 30           |

**SOY**

Rolls occur 5 times per year. The June roll (N → X) spans a longer calendar period as the oracle transitions from the July contract directly to November, skipping the less liquid August and September contracts.

| Roll Month | From → To             | Roll Period (BD) | First Notice Day |
| ---------- | --------------------- | ---------------- | ---------------- |
| February   | H (Mar) → K (May)     | BD 6 – BD 10     | Feb 27           |
| April      | K (May) → N (Jul)     | BD 6 – BD 10     | Apr 30           |
| June       | N (Jul) → X (Nov)     | BD 6 – BD 10     | Jun 30           |
| October    | X (Nov) → F (Jan+1)   | BD 6 – BD 10     | Oct 31           |
| December   | F (Jan+1) → H (Mar+1) | BD 6 – BD 10     | Dec 31           |

***

### Mark Price

Mark price is the fair price of the perpetual contract, used for margining, liquidations, stop/limit triggers, funding rates, and computing unrealized PnL.

Mark prices, along with oracle prices, are updated approximately every 3 seconds.

Ventuals calculates the mark price as the median of:

1. Oracle price
2. Oracle price + 150s EMA of difference between oracle price and the perp's mid-price
3. The median of best bid, best ask, last trade on Hyperliquid

#### Mark price bands

The mark price is constrained to remain within a price band relative to its oracle price. This band is defined as ±(1 / max\_leverage) of the last external-pricing oracle price, and remains in effect during all trading sessions.

***

### Velocity Limit

Mark and oracle price movements are limited to a max 0.50% move every 3 second update. This prevents overly large price moves over a short period of time.

***

### Funding Rate

For Ventuals commodity markets, a multiplier of 0.5 is applied to Hyperliquid's funding rate formula. This results in a baseline funding rate of \~5.5% annualized, which brings borrow rates closer to industry standards for traditional asset classes.

```
Funding Rate (F) = 0.5 × [Average Premium Index (P) + clamp(interest rate - Premium Index (P), -0.0005, 0.0005)]
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ventuals.com/perp-specifications/commodities.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
