Существует фантастический модуль под названием pandas , который был написан парнем из AQR (хедж-фонд), который отлично справляется с такими расчетами ... что вам нужно, так это способ обработки "пропущенных данных" ... как кто-то упоминал выше, в основах используется нан (а не число) возможностей scipy или numpy; однако, даже эти библиотеки не делают финансовые расчеты намного проще ... если вы используете панд, вы можете пометить данные, которые вы не хотите рассматривать, как nan
, и тогда любые будущие вычисления отклонят их при выполнении обычные операции над другими данными.
Я использую панд на своей торговой платформе около 8 месяцев ... Хотелось бы, чтобы я начал использовать ее раньше.
Уэс (автор) выступил на pyCon 2010 с докладом о возможностях модуля ... см. Слайды и видео на веб-странице pyCon 2010 . В этом видео он демонстрирует, как получать ежедневные доходы, запускать 1000 с линейных регрессий на матрице возвратов (за доли секунды), данные временных меток / графиков ... все это делается с помощью этого модуля. В сочетании с psyco, это зверь инструмента финансового анализа.
Другая замечательная вещь, которую он обрабатывает, это данные поперечного сечения ... так что вы можете получать ежедневные цены закрытия, их скользящие средние и т. Д. ... затем отметку времени каждый расчет и сохранять все это в что-то похожее на словарь Python (см. класс pandas.DataFrame
) ... тогда вы получаете доступ к фрагментам данных так же просто, как:
close_prices['stdev_5d']
См. Документы о моментах качания панд для получения дополнительной информации о расчете stdev (это однострочник).
Уэс изо всех сил пытался ускорить работу модуля с помощью Cython, хотя я признаю, что рассматриваю возможность обновления своего сервера (более старого Xeon) из-за моих требований к анализу.
РЕДАКТИРОВАТЬ ДЛЯ ВОПРОСА STRIMP:
После того, как вы преобразовали свой код для использования структур данных pandas, мне все еще неясно, как вы индексируете свои данные в фрейме данных pandas и требования к составной функции для обработки пропущенных данных (или в этом отношении условия для возврата 0.0 ... или если вы используете NaN
в пандах ..). Я продемонстрирую, используя мою индексацию данных ... день был выбран случайным образом ... df
- это кадр данных с котировками ES Futures ... проиндексирован в секунду ... пропущенные цитаты заполняются numpy.nan
. Индексы DataFrame - это объекты datetime
, смещенные на объекты часового пояса модуля pytz
.
>>> df.info
<bound method DataFrame.info of <class 'pandas.core.frame.DataFrame'>
Index: 86400 entries , 2011-03-21 00:00:00-04:00 to 2011-03-21 23:59:59-04:00
etf 18390 non-null values
etfvol 18390 non-null values
fut 29446 non-null values
futvol 23446 non-null values
...
>>> # ET is a pytz object...
>>> et
<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>
>>> # To get the futures quote at 9:45, eastern time...
>>> df.xs(et.localize(dt.datetime(2011,3,21,9,45,0)))['fut']
1291.75
>>>
Чтобы дать простой пример того, как вычислить столбец непрерывных возвратов (в pandas.TimeSeries
), который ссылается на цитату 10 минут назад (и заполняет отсутствующие тики), я бы сделал это:
>>> df['fut'].fill(method='pad')/df['fut'].fill(method='pad').shift(600)
В этом случае лямбда не требуется, просто разделив столбец значений 600 секунд назад. Это .shift(600)
часть, потому что мои данные индексируются в секунду.
НТН,
\ * 1043 микрофон *