Пересчет временных рядов исторических торговых данных

0

У меня есть историческая дата торговли в CSV файле в формате: unixtime, price, том II, который хочет проанализировать эти данные.

Мне удалось сделать это на Python, но это очень медленно (мне требуется около 2 дней для запуска алгоритма для 30-дневного теста данных).

Я пытаюсь сделать это в c/c++ или даже Java или Scala, но моя главная проблема заключается в том, что у меня нет способа перепрограммировать данные. Мне нужно переформатировать эти данные в формате: дата, время открытия, высокий, низкий, закрытый, объем в течение 15-минутных интервалов, но я не могу найти способ сделать это в c/c++

В Python это делает то, что я хочу (он использует pandas Dataframe):

def resample_data(raw_data, time_frame):
    # resamples the ticker data in ohlc
    resampledData = raw_data.copy()
    ohlc_dict = {
        'open':'first',
        'high':'max',
        'low':'min',
        'close':'last',
        'price':'first'
        }

    resampledData = resampledData.resample(time_frame, how={'price':ohlc_dict, 'amount':'sum'})
    resampledData.amount = resampledData['amount']['sum'].fillna(0.0)
    resampledData['price']['close'] = resampledData['price']['close'].fillna(method='pad')
    resampledData = resampledData.apply(lambda x: x.fillna(resampledData['price']['close']))

    return resampledData

Любые идеи (или библиотека), которые делают это в c/c++/Java/scala?

  • 0
    Почему бы вам не отсортировать данные по дате, если это необходимо, а затем разбить их на куски по 15 минут и объединить каждый. Это может быть сделано итеративно, поэтому вам не нужно хранить слишком много данных в памяти. Вы можете использовать стандартные функции Scala. Может быть, вы также можете запустить это параллельно.
  • 0
    Проблема в том, что выполнение этого «вручную» кажется слишком подверженным ошибкам для меня. Принимая во внимание изменение часов, дней, месяцев, лет, чтобы продолжать проверять интервалы в 15 минут (или другие), это просто то, что потребует обширного тестирования, чтобы проверить, все ли вычисляется правильно. Было бы намного лучше использовать некоторую библиотеку (например, pandas для Python или Zoo для R), которая уже прошла необходимый контроль качества.
Показать ещё 3 комментария
Теги:
time-series
resampling

2 ответа

1

Просто быстрый пример того, что вы можете делать со стандартными библиотеками Scala. Этот код можно запустить в Scala REPL:

// not importing external libraries like Joda time and its Scala wrappers
import java.util.Date
import scala.annotation.tailrec

case class Sample(value: Double, timeMillis: Long)
case class SampleAggregate(startTimeMillis: Long, endTimeMillis: Long,
  min: Sample, max: Sample)

val currentMillis = System.currentTimeMillis
val inSec15min = 15 * 60
val inMillis15min = inSec15min * 1000
// sample each second:
val data = (1 to inSec15min * 100).map { i =>
  Sample(i, currentMillis + i*1000) }.toList

@tailrec
def aggregate(xs: List[Sample], intervalDurationMillis: Long,
  accu: List[SampleAggregate]): List[SampleAggregate] =
  xs match {
    case h :: t =>
      val start = h.timeMillis
      val (slice, rest) = xs.span(_.timeMillis < (start + intervalDurationMillis))
      val end = slice.last.timeMillis
      val aggr = SampleAggregate(start, end, slice.minBy(_.value),
        slice.maxBy(_.value))
      aggregate(rest, intervalDurationMillis, aggr :: accu)
    case Nil =>
      accu.reverse
  }

val result = aggregate(data, inMillis15min, Nil)

Поддельные данные:

data.take(10).foreach(println)
Sample(1.0,1388809630677)
Sample(2.0,1388809631677)
Sample(3.0,1388809632677)
Sample(4.0,1388809633677)
Sample(5.0,1388809634677)
Sample(6.0,1388809635677)
Sample(7.0,1388809636677)
Sample(8.0,1388809637677)
Sample(9.0,1388809638677)
Sample(10.0,1388809639677)

Результаты:

result.foreach(println)
SampleAggregate(1388809630677,1388810529677,Sample(1.0,1388809630677),Sample(900.0,1388810529677))
SampleAggregate(1388810530677,1388811429677,Sample(901.0,1388810530677),Sample(1800.0,1388811429677))
SampleAggregate(1388811430677,1388812329677,Sample(1801.0,1388811430677),Sample(2700.0,1388812329677))
SampleAggregate(1388812330677,1388813229677,Sample(2701.0,1388812330677),Sample(3600.0,1388813229677))
SampleAggregate(1388813230677,1388814129677,Sample(3601.0,1388813230677),Sample(4500.0,1388814129677))
SampleAggregate(1388814130677,1388815029677,Sample(4501.0,1388814130677),Sample(5400.0,1388815029677))
SampleAggregate(1388815030677,1388815929677,Sample(5401.0,1388815030677),Sample(6300.0,1388815929677))

Мы можем передать функцию в span который будет определять интервалы (часы или дни). Это также можно преобразовать в поток, поскольку он считывается из файла.

  • 1
    Большое спасибо, я попробую это последнее и сообщу вам результаты.
0

Попробуйте взглянуть на седло для манипулирования данными. Я только что нашел это сам, поэтому не уверен в полном возможностях, но вдохновлен Пандами.

  • 0
    Здравствуйте, Saddle был моей первой попыткой на самом деле. Но хотя он реализует Pandas вроде DataFrame, у него нет функций передискретизации для работы с TimeSeries.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню