Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Common/Securities/Future/Futures.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1388,6 +1388,12 @@ public static class Indices
/// <returns>The symbol</returns>
public const string VIX = "VX";

/// <summary>
/// VIX Mini Futures
/// </summary>
/// <returns>The symbol</returns>
public const string VIXMini = "VXM";

/// <summary>
/// E-mini Russell 2000 Futures
/// </summary>
Expand Down
25 changes: 25 additions & 0 deletions Common/Securities/Future/FuturesExpiryFunctions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -543,6 +543,31 @@ public static Func<DateTime, DateTime> FuturesExpiryFunction(Symbol symbol)
return expiryDate.Add(new TimeSpan(13, 0, 0));
})
},
// VIX Mini Futures (VXM): https://cdn.cboe.com/resources/futures/VXM_Contract_Specifications.pdf
{Symbol.Create(Futures.Indices.VIXMini, SecurityType.Future, Market.CFE), (time =>
{
// Trading occurs 30 days before S&P 500 option expiration (third Friday of contract month).
// Last trading day is the Wednesday 30 days prior to the third Friday of the contract month.
var market = Market.CFE;
var symbol = Futures.Indices.VIXMini;
var nextThirdFriday = FuturesExpiryUtilityFunctions.ThirdFriday(time.AddMonths(1));
var expiryDate = nextThirdFriday.AddDays(-30);
var holidays = FuturesExpiryUtilityFunctions.GetExpirationHolidays(market, symbol);

// If the reference 3rd Friday is a holiday, shift expiry back one day per spec.
if (holidays.Contains(nextThirdFriday))
{
expiryDate = expiryDate.AddDays(-1);
}
// Ensure the computed expiry date is itself a valid tradable day.
while (holidays.Contains(expiryDate) || !expiryDate.IsCommonBusinessDay())
{
expiryDate = expiryDate.AddDays(-1);
}
// Trading hours for expiring VXM futures contracts end at 8:00 a.m. Chicago time on the final settlement date.
return expiryDate.Add(new TimeSpan(13, 0, 0));
})
},
// Bloomberg Commodity Index (AW): https://www.cmegroup.com/trading/agricultural/commodity-index/bloomberg-commodity-index_contract_specifications.html
{Symbol.Create(Futures.Indices.BloombergCommodityIndex, SecurityType.Future, Market.CBOT), (time =>
{
Expand Down
3 changes: 3 additions & 0 deletions Data/future/cfe/margins/VXM.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# we don't have historical information for this symbol
date,initial,maintenance
19900101,1200,960
118 changes: 118 additions & 0 deletions Data/market-hours/market-hours-database.json
Original file line number Diff line number Diff line change
Expand Up @@ -71632,6 +71632,124 @@
"saturday": [],
"holidays": []
},
"Future-cfe-VXM": {
"dataTimeZone": "UTC",
"exchangeTimeZone": "America/Chicago",
"sunday": [
{
"start": "17:00:00",
"end": "1.00:00:00",
"state": "premarket"
}
],
"monday": [
{
"start": "00:00:00",
"end": "08:30:00",
"state": "premarket"
},
{
"start": "08:30:00",
"end": "15:00:00",
"state": "market"
},
{
"start": "15:00:00",
"end": "16:00:00",
"state": "postmarket"
},
{
"start": "17:00:00",
"end": "1.00:00:00",
"state": "postmarket"
}
],
"tuesday": [
{
"start": "00:00:00",
"end": "08:30:00",
"state": "premarket"
},
{
"start": "08:30:00",
"end": "15:00:00",
"state": "market"
},
{
"start": "15:00:00",
"end": "16:00:00",
"state": "postmarket"
},
{
"start": "17:00:00",
"end": "1.00:00:00",
"state": "postmarket"
}
],
"wednesday": [
{
"start": "00:00:00",
"end": "08:30:00",
"state": "premarket"
},
{
"start": "08:30:00",
"end": "15:00:00",
"state": "market"
},
{
"start": "15:00:00",
"end": "16:00:00",
"state": "postmarket"
},
{
"start": "17:00:00",
"end": "1.00:00:00",
"state": "postmarket"
}
],
"thursday": [
{
"start": "00:00:00",
"end": "08:30:00",
"state": "premarket"
},
{
"start": "08:30:00",
"end": "15:00:00",
"state": "market"
},
{
"start": "15:00:00",
"end": "16:00:00",
"state": "postmarket"
},
{
"start": "17:00:00",
"end": "1.00:00:00",
"state": "postmarket"
}
],
"friday": [
{
"start": "00:00:00",
"end": "08:30:00",
"state": "premarket"
},
{
"start": "08:30:00",
"end": "15:00:00",
"state": "market"
},
{
"start": "15:00:00",
"end": "16:00:00",
"state": "postmarket"
}
],
"saturday": [],
"holidays": []
},
"Future-cme-E3G": {
"dataTimeZone": "UTC",
"exchangeTimeZone": "America/New_York",
Expand Down
1 change: 1 addition & 0 deletions Data/symbol-properties/symbol-properties-database.csv
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@ usa,AEX,index,,EUR,1,0.01,1

# for backwards compatibility, order here is important for futures, since we could have the same symbol for more than 1 market in which case Lean will use the first
cfe,VX,future,VIX futures ,USD,1000.0,0.05,1.0
cfe,VXM,future,VIX Mini Futures,USD,100.0,0.01,1.0
cbot,2YY,future,Micro 2-Year Yield Futures,USD,1000,0.001,1
cbot,5YY,future,Micro 5-Year Yield Futures,USD,1000,0.001,1
cbot,10Y,future,Micro 10-Year Yield Futures,USD,1000,0.001,1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@ public void FinancialsExpiryDateFunction_WithDifferentDates_ShouldFollowContract
[TestCase(QuantConnect.Securities.Futures.Indices.Russell2000EMini, NineThirtyEasternTime)]
[TestCase(QuantConnect.Securities.Futures.Indices.Nikkei225Dollar, FiveOClockPMEasternTime)]
[TestCase(QuantConnect.Securities.Futures.Indices.VIX, EightOClockChicagoTime)]
[TestCase(QuantConnect.Securities.Futures.Indices.VIXMini, EightOClockChicagoTime)]
[TestCase(QuantConnect.Securities.Futures.Indices.Nikkei225Yen, TwoThirtyPM)]
[TestCase(QuantConnect.Securities.Futures.Indices.MSCITaiwanIndex, OneFortyFivePM)]
[TestCase(QuantConnect.Securities.Futures.Indices.Nifty50, ThreeThirtyPM)]
Expand Down
Binary file modified Tests/TestData/FuturesExpiryFunctionsTestData.xml
Binary file not shown.
Loading