Это моя последняя попытка после публикации нескольких вопросов, которые могли быть плохо рассмотрены / описаны. Я хочу получить этот DataFrame как результат:
Signal price buy_units sell_units cashflow balance
Index
0 0 40 0 0 0 100000
1 1 50 2000 0 -100000 0
2 -1 100 0 -2000 +200000 200000
3 1 50 4000 0 -200000 0
4 -1 70 0 -4000 +280000 280000
Это бэктест стратегии биржевой торговли. Когда Signal
равно == 1, buy_units
равно текущему balance
(значение из предыдущей строки), разделенному на price
. Затем balance
уменьшается на cashflow
(то есть единицы x цена * -1). Остальное не требует пояснений. Проблема: вычисление buy_units
без итерации, но в векторизованном виде. У кого есть идеи как это решить?
В конечном итоге я хотел бы спроектировать это в классе с методами «Расчет единиц» и «Расчет баланса», но на первом этапе это не обязательно.
2 ответа
Если сигналы -1
и +1
всегда чередуются, как в примере, то баланс на шаге n+2
равен остатку на шаге n
, умноженному на возврат цены между n+1
и n+2
.
Я использую накопленный продукт, чтобы преобразовать это в векторизованные операции в пандах:
# initialize balance
df['balance'] = 0.0
df.balance.iloc[0] = 10000.0
# calculate returns
df['return'] = df.price / df.price.shift()
# calculate balance where signal is -1
df.loc[df.Signal == -1, 'balance'] = \
df.balance.iloc[0] * df.loc[df.Signal == -1, 'return'].cumprod()
Денежные потоки и количество единиц могут быть легко рассчитаны по балансу.
pandas.__version__
) вы используете?
0
следует за 1
или -1
. Но это правда, если мы не найдем способ математически упростить задачу, тогда, вероятно, не будет векторизованного решения.
Вы можете создать временный фрейм данных для выполнения ваших вычислений:
temp = df[df.balance == 1]
Затем выполните вычисления на этом фрейме данных:
df.ix[df.balance == 1,'buy_units'] = temp.balance/temp.price
И удалите временный фрейм данных:
%reset selective -f temp
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
buy units
зависит отbalance
,balance
зависит отcashflow
иcashflow
зависит отbuy units
верно?) И я определенно не эксперт, но это похоже на работу, требующую циклов.