volatilityEstimator.test.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import { describe, it, expect } from "vitest";
  2. import { VolatilityEstimator } from "../packages/utils/src/volatilityEstimator";
  3. describe("VolatilityEstimator", () => {
  4. it("tracks hourly volatility in bps", () => {
  5. const estimator = new VolatilityEstimator({ windowMinutes: 60, minSamples: 2 });
  6. const start = Date.now();
  7. estimator.update(100, start - 60 * 60 * 1000);
  8. estimator.update(110, start);
  9. const hourlyBps = estimator.getHourlyVolatilityBps();
  10. expect(hourlyBps).toBeDefined();
  11. expect(hourlyBps).toBeCloseTo(1000);
  12. });
  13. it("computes annualized volatility from returns", () => {
  14. const estimator = new VolatilityEstimator({ windowMinutes: 30, minSamples: 2 });
  15. const base = Date.now();
  16. estimator.update(100, base - 3 * 60 * 1000);
  17. estimator.update(102, base - 2 * 60 * 1000);
  18. estimator.update(98, base - 60 * 1000);
  19. estimator.update(101, base);
  20. const annualized = estimator.getAnnualizedVolatility();
  21. expect(annualized).toBeDefined();
  22. expect(annualized).toBeGreaterThan(0);
  23. });
  24. it("exposes status snapshot", () => {
  25. const estimator = new VolatilityEstimator({ windowMinutes: 5, minSamples: 2 });
  26. const now = Date.now();
  27. estimator.update(50_000, now - 10_000);
  28. estimator.update(50_500, now);
  29. const status = estimator.getStatus();
  30. expect(status.historySize).toBeGreaterThanOrEqual(2);
  31. expect(status.latestPrice).toBeCloseTo(50_500);
  32. expect(status.hourlyVolBps).toBeGreaterThan(0);
  33. });
  34. });