← Назадconst { findUnusualVolume } = require('../src/analysis/unusualVolume');
// Helper: generate an expiry string N days from now in YYMMDD format
function futureExpiry(daysFromNow) {
const d = new Date(Date.now() + daysFromNow * 86400000);
const yy = String(d.getUTCFullYear()).slice(2);
const mm = String(d.getUTCMonth() + 1).padStart(2, '0');
const dd = String(d.getUTCDate()).padStart(2, '0');
return `${yy}${mm}${dd}`;
}
describe('Unusual Volume Analysis', () => {
const spotPrices = { 'BTC': 80000 };
const EXP = futureExpiry(14); // 14 days out — passes DTE 7-30 filter
it('should ignore extremely high V/OI ratios if premium is under $5,000', () => {
const mockOptions = [
{
symbol: `BTC-${EXP}-80000-C`,
side: 'CALL',
volume: 1,
openInterest: 0,
lastPrice: 39,
strikePrice: 80000
}
];
const result = findUnusualVolume(mockOptions, spotPrices);
expect(result.data.length).toBe(0);
expect(result.count).toBe(0);
});
it('should flag extreme volume if premium is exactly or well over $5,000', () => {
const mockOptions = [
{
symbol: `BTC-${EXP}-85000-C`,
side: 'CALL',
volume: 3000,
openInterest: 50,
lastPrice: 40,
strikePrice: 85000
}
];
const result = findUnusualVolume(mockOptions, spotPrices);
expect(result.data.length).toBe(1);
expect(result.data[0].signal.severity).toBe('EXTREME');
expect(result.data[0].premiumUsd).toBe(120000);
});
it('should reject options with DTE < 7 (theta burn danger)', () => {
const shortExp = futureExpiry(3);
const mockOptions = [
{
symbol: `BTC-${shortExp}-80000-C`,
side: 'CALL',
volume: 5000,
openInterest: 100,
lastPrice: 50,
strikePrice: 80000
}
];
const result = findUnusualVolume(mockOptions, spotPrices);
expect(result.data.length).toBe(0);
});
it('should reject options with DTE > 30', () => {
const longExp = futureExpiry(60);
const mockOptions = [
{
symbol: `BTC-${longExp}-80000-C`,
side: 'CALL',
volume: 5000,
openInterest: 100,
lastPrice: 50,
strikePrice: 80000
}
];
const result = findUnusualVolume(mockOptions, spotPrices);
expect(result.data.length).toBe(0);
});
});