stockPrice method

List<TimeSeriesPoint> stockPrice({
  1. required DateTime start,
  2. required DateTime end,
  3. required Duration interval,
  4. double startPrice = 100,
  5. double annualReturn = 0.1,
  6. double annualVolatility = 0.2,
})

Generates stock-like price data using geometric Brownian motion.

Implementation

List<TimeSeriesPoint> stockPrice({
  required DateTime start,
  required DateTime end,
  required Duration interval,
  double startPrice = 100,
  double annualReturn = 0.1,
  double annualVolatility = 0.2,
}) {
  final points = <TimeSeriesPoint>[];
  var current = start;
  var price = startPrice;

  // Calculate per-interval parameters
  final totalIntervals = end.difference(start).inMinutes / interval.inMinutes;
  final dt = 1 / totalIntervals;
  final mu = annualReturn;
  final sigma = annualVolatility;

  while (!current.isAfter(end)) {
    points.add(TimeSeriesPoint(timestamp: current, value: price));

    final drift = (mu - 0.5 * sigma * sigma) * dt;
    final diffusion = sigma * math.sqrt(dt) * _random.normal(0, 1);
    price = price * math.exp(drift + diffusion);

    current = current.add(interval);
  }

  return points;
}