CSV для тиков худший вариант. Я раскладываю в parquet: один символ, один месяц, один файл. Время храню int64 в миллисекундах, bid и ask не float, а целыми в пунктах, то есть умножаю на 10 в степени digits и кладу в int32. Флаги тоже целым. Сжатие раз в семь-восемь против CSV, месяц читается за пару секунд. И читай только нужные колонки: для спреда нужны время, bid и ask, остальное не грузи.
Если тебе нужно распределение спреда по часам, вообще не держи все тики в памяти. Пройдись по месяцам, для каждого посчитай гистограмму спреда по часу и сложи. А если смотришь поведение цены после резких движений, грузи кусками с запасом на стыках месяцев, иначе потеряешь события на границе.