(Это дополнительный вопрос к моему предыдущему вопросу , на который был дан правильный ответ).
Скажите, у меня есть следующий фрейм данных
import pandas as pd
df = pd.DataFrame()
df['E'] = ('SIT','SCLOSE', 'SHODL', 'SHODL', 'SHODL', 'SHODL', 'SHODL', 'SHODL','SHODL','SCLOSE_BUY','BCLOSE_SELL', 'BHODL', 'BHODL', 'BHODL', 'BHODL', 'BHODL', 'BHODL','BUY','SIT','SIT')
df['F'] = (0.00,1.00,10.00, 5.00,6.00,-6.00, 6.00, 2.00,10.00,10.00,-8.00,33.00,-15.00,6.00,-1.00,5.00,10.00,0.00,0.00,0.00)
df.loc[19, 'G'] = 100.0000
С колонкой G начиная с 100, применяются те же правила, что и для моего предыдущего вопроса, согласно которому при совершении покупки или продажи по столбцу E соответствующий остаток в столбце G блокируется и непрерывно используется в качестве базовой суммы для расчета текущего баланса, причем столбец F представляет собой% увеличения / уменьшения для каждой строки в текущем балансе, пока не появится BCLOSE или SCLOSE на col E.
Я объяснил правила в предыдущем вопросе, однако новым для этого вопроса является то, что если SCLOSE_BUY показан, то ПРОДАЖА закрыта, а ПОКУПКА открыта, и наоборот для BCLOSE_SELL. Строка BCLOSE, SCLOSE, SCLOSE_BUY или BCLOSE_SELL станет последней строкой для расчета текущего баланса и будет использоваться в качестве базы, когда на следующих покупках будет показана покупка или продажа
Для вашего успешного ответа на мой предыдущий вопрос был сделанный Энди Л. следующим образом, однако этот ответ не может обработать новый сценарий, когда BCLOSE_SELL и SCLOSE_BUY происходят один за другим
df1 = df[::-1]
s = df1.B.isin(['BCLOSE','SCLOSE']).shift(fill_value=False).cumsum()
grps = df1.groupby(s)
init_val= 100
l = []
for _, grp in grps:
s = grp.C * 0.01 * init_val
s.iloc[0] = init_val
s = s.cumsum()
init_val = s.iloc[-1]
l.append(s)
Приведенный выше ответ не решает проблему, с которой я сталкиваюсь в реальной жизни, в результате чего вместо При получении BCLOSE вместо этого я получаю BCLOSE_SELL, который в основном превращает ПОКУПКУ в ПРОДАЖУ (ie. Я закрываю ПОКУПКУ и открываю ПРОДАЖУ), которая становится базовой суммой для текущих строк.
Если строки продолжаются как SHODL, я могу настроить код так, чтобы текущий баланс был правильно рассчитан, однако, если я впоследствии получу SCLOSE_BUY (как видно в строке 9 моего фрейма данных), мне нужно заставить эту строку закрыть SELL и снова открыть BUY и эту строку также будет новая базовая сумма для моего бега баланс.
Я понимаю, что все это звучит странно, так как приведенный ниже столбец, добавленный к моему приведенному выше кадру данных, должен выглядеть как результат.
df['G'] = (191.62,191.62,190.19,175.89,168.74,160.16,168.74,160.16,157.3,143,130,138,105,120,114,115,110,100,100,100)