Проблема:
Итак, у меня есть, как я думал, очень базовая формула Excel, которую я пытался воспроизвести во фрейме данных Python.Я пытаюсь воссоздать столбец PeriodDraw.Все, что делает, это вычисляет текущее значение, которое говорит вам, как далеко от максимума вы получаете, прежде чем сделать новый максимум.Я пытаюсь найти способ вычислить этот столбец во фрейме данных, не используя цикл, или самым быстрым способом, если мне придется проходить через него.
Ожидаемый результат: столбец PeriodDraw из таблицы ниже,
Что делают формулы:
Таким образом, общий PL - это промежуточный итог.Столбец max - это рабочий максимум столбца Total PL, а Diff просто берет разность столбцов Total PL и Max.
В Excel формула, которая будет отображаться во второй строке рисования периода, имеет вид = IF (G2 = 0,0, MIN (G2, H1)), где G2 = Diff, а столбец H - это PeriodDraw.
По сути, если diff равен 0, это означает, что pl в данный момент имеет максимальное значение.Если нет, то я хочу знать, является ли текущая разница меньше моей предыдущей величины?если так, то это новый минимум, если не оставить прежним.
Вот ссылка на таблицу, если вы хотите увидеть формулы: https://docs.google.com/spreadsheets/d/1lvwIi3ZwLU0Y_6G3fGHII_WvEPU8kPdJ9mUgHUVlBUc/edit?usp=sharing
Я мог повторить это только с помощью цикла for.
+------------+----------+---------+----------+----------+-------+--------+------------+
| TradeCount | Entry Px | Exit Px | Trade PL | Total PL | Max | Diff | PeriodDraw |
+------------+----------+---------+----------+----------+-------+--------+------------+
| 1 | 0.5057 | 0.6327 | 26656 | 26656 | 26656 | 0 | 0 |
| 2 | 0.66 | 0.6552 | -1022 | 25634 | 26656 | -1022 | -1022 |
| 3 | 0.6577 | 0.6066 | -10745 | 14889 | 26656 | -11767 | -11767 |
| 4 | 0.6066 | 0.5682 | 8050 | 22939 | 26656 | -3717 | -11767 |
| 5 | 0.5682 | 0.5632 | -1064 | 21875 | 26656 | -4781 | -11767 |
| 6 | 0.5632 | 0.5627 | 91 | 21966 | 26656 | -4690 | -11767 |
| 7 | 0.5627 | 0.5657 | 616 | 22582 | 26656 | -4074 | -11767 |
| 8 | 0.5876 | 0.5691 | -3899 | 18683 | 26656 | -7973 | -11767 |
| 9 | 0.5527 | 0.5679 | 3178 | 21861 | 26656 | -4795 | -11767 |
| 10 | 0.5867 | 0.5777 | -1904 | 19957 | 26656 | -6699 | -11767 |
| 11 | 0.5599 | 0.5597 | -56 | 19901 | 26656 | -6755 | -11767 |
| 12 | 0.5875 | 0.5917 | 868 | 20769 | 26656 | -5887 | -11767 |
| 13 | 0.5757 | 0.5615 | -2996 | 17773 | 26656 | -8883 | -11767 |
| 14 | 0.5752 | 0.5545 | -4361 | 13412 | 26656 | -13244 | -13244 |
| 15 | 0.5722 | 0.5827 | 2191 | 15603 | 26656 | -11053 | -13244 |
| 16 | 0.5752 | 0.6528 | 16282 | 31885 | 31885 | 0 | 0 |
| 17 | 0.6511 | 0.6288 | -4697 | 27188 | 31885 | -4697 | -4697 |
| 18 | 0.65 | 0.6487 | -287 | 26901 | 31885 | -4984 | -4984 |
| 19 | 0.5919 | 0.6264 | -7259 | 19642 | 31885 | -12243 | -12243 |
| 20 | 0.6264 | 0.6323 | 1225 | 20867 | 31885 | -11018 | -12243 |
| 21 | 0.6281 | 0.5617 | -13958 | 6909 | 31885 | -24976 | -24976 |
+------------+----------+---------+----------+----------+-------+--------+------------+
Что я уже пробовал:
stats_df['Max'] = stats_df['PL_Accum'].cummax()
stats_df['Diff'] = stats_df['PL_Accum'] - stats_df['Max']
df = stats_df.copy().reset_index()
m = []
for i in df.index:
if df.iloc[i, df.columns.get_loc('PL_Accum')] == df.iloc[i, df.columns.get_loc('Max')]:
m.append(df.iloc[i, df.columns.get_loc('Diff')])
elif i == 0:
m.append(0)
else:
m.append(min(m[i - 1], df.iloc[i, df.columns.get_loc('Diff')]))
stats_df['PeriodDraw_Closed'] = m