Как кодировать простую сигнальную логику в панде dataframe?
Я хочу создать простую таблицу сигналов торговой системы с таким фреймом данных, как:
Close buy sell
2011-01-31 50 0 0
2011-02-28 40 1 0
2011-03-31 50 0 0
2011-04-30 80 0 -1
2011-05-31 60 1 0
2011-06-30 50 1 0
2011-07-31 20 0 0
2011-08-31 30 0 -1
Сигналы генерируются следующим образом:
df['buy'] = np.where( <condition> , 1, 0 )
sell
столбец создается таким же образом.
Проблема заключается в сигнале двойной покупки на 2011-06-30, сразу после предыдущего на 2011-05-31.
2011-05-31 60 1 0
2011-06-30 50 1 0
Как я могу предотвратить новый сигнал на покупку ( == 1), прежде чем он будет закрыт с -1 в df['sell']
столбец?
2 ответа
Как я могу предотвратить...?
Ну, когда-то нужно что-то более сложное, чем тривиальное numpy
векторизация / трансляция / условная операция, аналогичная np.where( <condition> , 1, 0 )
нужно реализовать какую-то особую функцию, чтобы обрабатывать те дополнительные функции, где конечные состояния-автоматы вполне могли бы служить для таких целей.
Но как это реализовать?
Проще говоря, ваши условия вышли за пределы выразительности простых операций векторизованной / широковещательной матрицы, подсистема Trade-Management начала иметь внутреннее, SEQ-поведение и некоторые дополнительные правила для своего внутреннего перехода (-ов) и -переход-ограничение.
Вряд ли можно ожидать общих, универсальных инструментов, numpy
-матрицы и pandas
- Экземпляры DataFrame должны быть чрезмерно спроектированы для поддержки таких специфичных для проблемной области функциональных возможностей, чтобы создавать прототипы алгоритмов торговли алгоритмами.
Лучше выбрать некоторые специфичные для торговли инструменты, чтобы удовлетворить такую потребность, или ожидать, что им придется реализовать функцию итератора поведения SEQ, которая облегчила бы необходимую логику (ни одного из умных вялых выражений векторизации / вещания или однострочных панд здесь недостаточно больше)
Объем?
для тех, кто действительно интересуется быстрым прототипом примера Торговой стратегии, используя метод реализации на основе FSA, проверьте простоту такого проектирования системы + встроенную (основанную на сценариях) возможность автоматического тестирования соответствия + номера строк для оценки кода -спан (определенно неnumpy
SLOC):
Я немного опоздал на вечеринку, но надеюсь, это поможет. Я полагаю, вы хотите чередовать 1 и -1. Хотя это и не лучший способ, я предлагаю вам добавить сигналы покупки и продажи и назвать новый столбец торговым сигналом. Столбец торгового сигнала будет иметь 0, 1 и -1 произвольным образом. Следующий код объясняет дальнейшие шаги.
import pandas as pd
import numpy as np
trade_signal= pd.DataFrame([1,1,0,0,-1,-1,1,1,-1])
ts_shifted=trade_signal.shift(1)
trade_rule=np.where(trade_signal!=ts_shifted,trade_signal,0)