所以我有一个非常基本的excel公式,我试图在python数据框架中复制它。我要重新创建的是PeriodDraw列。所做的一切就是计算一个运行值,该值告诉您在生成新的max之前离max pl有多远。我正在尝试找到一种方法来计算数据帧中的该列,而不使用循环,或者在必须循环通过它时以最快的方式。你知道吗
预期输出:下表的PeriodDraw列。你知道吗
所以,total PL就是运行总数。max列是totalpl列的运行max,Diff只取totalpl和max列的Diff。你知道吗
在excel中,周期图第二行的公式是=IF(G2=0,0,MIN(G2,H1)),其中G2=Diff,H列是周期图。你知道吗
所以本质上,如果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
让我们试试这个,我将PD\u close作为比较: 我认为您正在按组查找
cummin
函数。你知道吗详情:
eq
设置diff为零的行,然后每次diff等于零时,我们使用cumsum递增一个计数器。你知道吗cummin
我们可以保持 在每组中找到的总损益最低值的运行计数如果你从groupby中的内容开始运行语句的每一个小部分,然后计算出你的结果,你就会看到语句成形了。你知道吗
输出:
相关问题 更多 >
编程相关推荐