【问题标题】:Capping values after a trigger level in a different variable _after GroupBy在不同变量 _after GroupBy 中的触发级别后设置上限
【发布时间】:2015-09-08 12:09:18
【问题描述】:

对于 EdChum 提供的类似这样的问题,有一个优雅的答案。这个问题和这个问题之间的区别在于,现在需要将上限应用于已执行“GroupBy”的数据。

原始数据:

Symbol  DTE     Spot    Strike  Vol
AAPL    30.00   100.00  80.00   14.58
AAPL    30.00   100.00  85.00   16.20
AAPL    30.00   100.00  90.00   18.00
AAPL    30.00   100.00  95.00   20.00
AAPL    30.00   100.00  100.00  22.00
AAPL    30.00   100.00  105.00  25.30
AAPL    30.00   100.00  110.00  29.10
AAPL    30.00   100.00  115.00  33.46
AAPL    30.00   100.00  120.00  38.48
AAPL    50.00   102.00  80.00   13.08
AAPL    50.00   102.00  85.00   14.70
AAPL    50.00   102.00  90.00   16.50
AAPL    50.00   102.00  95.00   18.50
AAPL    50.00   102.00  100.00  20.50
AAPL    50.00   102.00  105.00  23.80
AAPL    50.00   102.00  110.00  27.60
AAPL    50.00   102.00  115.00  31.96
AAPL    50.00   102.00  120.00  36.98
 IBM    30.00   170.00  150.00  7.29
 IBM    30.00   170.00  155.00  8.10
 IBM    30.00   170.00  160.00  9.00
 IBM    30.00   170.00  165.00  10.00
 IBM    30.00   170.00  170.00  11.00
 IBM    30.00   170.00  175.00  12.65
 IBM    30.00   170.00  180.00  14.55
 IBM    30.00   170.00  185.00  16.73
 IBM    30.00   170.00  190.00  19.24
 IBM    60.00   171.00  150.00  5.79
 IBM    60.00   171.00  155.00  6.60
 IBM    60.00   171.00  160.00  7.50
 IBM    60.00   171.00  165.00  8.50
 IBM    60.00   171.00  170.00  9.50
 IBM    60.00   171.00  175.00  11.15
 IBM    60.00   171.00  180.00  13.05
 IBM    60.00   171.00  185.00  15.23
 IBM    60.00   171.00  190.00  17.74

然后我创建了一些新变量:

df['ATM_dist'] =abs(df['Spot']-df['Strike'])

imin = df.groupby(['DTE','Symbol'])['ATM_dist'].transform('idxmin')

df['NormStrike']=np.log(df['Strike']/df['Spot'])/(((df['DTE']/365)**.5)*df['ATMvol']/100)

df['ATMvol'] = df.loc[imin,'Vol'].values

结果如下:

   Symbol  DTE  Spot  Strike    Vol  ATM_dist  ATMvol  NormStrike
0    AAPL   30   100      80  14.58        20    22.0   -3.537916
1    AAPL   30   100      85  16.20        15    22.0   -2.576719
2    AAPL   30   100      90  18.00        10    22.0   -1.670479
3    AAPL   30   100      95  20.00         5    22.0   -0.813249
4    AAPL   30   100     100  22.00         0    22.0    0.000000
5    AAPL   30   100     105  25.30         5    22.0    0.773562
6    AAPL   30   100     110  29.10        10    22.0    1.511132
7    AAPL   30   100     115  33.46        15    22.0    2.215910
8    AAPL   30   100     120  38.48        20    22.0    2.890688
9    AAPL   50   102      80  13.08        22    20.5   -3.201973
10   AAPL   50   102      85  14.70        17    20.5   -2.402955
11   AAPL   50   102      90  16.50        12    20.5   -1.649620
12   AAPL   50   102      95  18.50         7    20.5   -0.937027
13   AAPL   50   102     100  20.50         2    20.5   -0.260994
14   AAPL   50   102     105  23.80         3    20.5    0.382049
15   AAPL   50   102     110  27.60         8    20.5    0.995172
16   AAPL   50   102     115  31.96        13    20.5    1.581035
17   AAPL   50   102     120  36.98        18    20.5    2.141961
18    IBM   30   170     150   7.29        20    11.0   -3.968895
19    IBM   30   170     155   8.10        15    11.0   -2.929137
20    IBM   30   170     160   9.00        10    11.0   -1.922393
21    IBM   30   170     165  10.00         5    11.0   -0.946631
22    IBM   30   170     170  11.00         0    11.0    0.000000
23    IBM   30   170     175  12.65         5    11.0    0.919188
24    IBM   30   170     180  14.55        10    11.0    1.812480
25    IBM   30   170     185  16.73        15    11.0    2.681295
26    IBM   30   170     190  19.24        20    11.0    3.526940
27    IBM   60   171     150   5.79        21     9.5   -3.401827
28    IBM   60   171     155   6.60        16     9.5   -2.550520
29    IBM   60   171     160   7.50        11     9.5   -1.726243
30    IBM   60   171     165   8.50         6     9.5   -0.927332
31    IBM   60   171     170   9.50         1     9.5   -0.152273
32    IBM   60   171     175  11.15         4     9.5    0.600317
33    IBM   60   171     180  13.05         9     9.5    1.331704
34    IBM   60   171     185  15.23        14     9.5    2.043051
35    IBM   60   171     190  17.74        19     9.5    2.735427

我希望将“Vol”的值上限设置为另一列“NormStrike”触发触发器的水平(在本例中为 abs(NormStrike) >= 2 )。这个新列“Desired_Level”是在保持“Vol”列不变的情况下创建的。第一个上限应导致索引位置 0 处的 Vol 值为 16.2,因为当 NormStrike 达到 -2.576719 时,该上限在索引位置 1 处触发。

补充说明: 我正在寻找一个通用的解决方案,它在两个方向上都远离最低的 abs(NormStrike) 级别来击中 -2 和 +2 触发器。如果未命中(可能未命中),则所需级别只是 original_level

另外注意,abs(NormStrike) 的大小总是会从 min(abs(NormStrike)) 水平继续增长,因为它是 abs(从点到罢工的距离)的函数

EdChum 提供的代码(在我将 GroupBy 加入之前)如下:

clip = 4
lower = df.loc[df['NS'] <= -clip, 'Vol'].idxmax() 
upper = df.loc[df['NS'] >= clip, 'Vol'].idxmin()


df['Original_level'] = df['Original_level'].clip(df.loc[lower,'Original_level'], df.loc[upper, 'Original_level'])

有两个问题,第一,groupby 之后它不起作用,第二,如果特定的一组数据没有超过“clip”值的 NS 值,那么它会产生错误。在这种情况下,理想的结果是不对特定符号/DTE 组的 Vol 级别进行任何操作。

Ed 建议实现一个 reset_index(),但我不确定如何使用它来解决问题。

我希望这不是一个令人费解的问题

感谢您的帮助

【问题讨论】:

  • 能多解释一下你的逻辑吗? “第一个上限应该导致索引位置 0 处的 Vol 值为 16.2,因为当 NormStrike 达到 -2.576719 时,在索引位置 1 处触发了上限”。为什么第一行是 16.20 而不是 14.58?我认为值“-3.537916”已经触发了上限。我看起来你正试图用未来某个日期的观察来回填当前记录?
  • 感谢您的建议,我在原始问题中添加了“添加说明”声明
  • 只要修改代码,做一轮前向填充,然后在desired_level上后向填充。

标签: pandas triggers group-by


【解决方案1】:

您可以试试这个,看看它是否有效。我假设如果剪辑已被触发,则将放置 NaN。您可以将其替换为您的自定义选择。

import pandas as pd
import numpy as np

# use np.where(criterion, x, y) to do a vectorized statement like if criterion is True, then set it to x, else set it to y

def func(group):
    group['Triggered'] = np.where((group['NormStrike'] >= 2) | (group['NormStrike'] <= -4), 'Yes', 'No')
    group['Desired_Level'] = np.where((group['NormStrike'] >= 2) | (group['NormStrike'] <= -4), np.nan, group['Vol'])
    group = group.fillna(method='ffill').fillna(method='bfill')
    return group

df = df.groupby(['Symbol', 'DTE']).apply(func)

Out[410]: 
   Symbol  DTE  Spot  Strike    Vol  ATM_dist  ATMvol  NormStrike Triggered  Desired_Level
0    AAPL   30   100      80  14.58        20      22     -3.5379        No          14.58
1    AAPL   30   100      85  16.20        15      22     -2.5767        No          16.20
2    AAPL   30   100      90  18.00        10      22     -1.6705        No          18.00
3    AAPL   30   100      95  20.00         5      22     -0.8132        No          20.00
4    AAPL   30   100     100  22.00         0      22      0.0000        No          22.00
5    AAPL   30   100     105  25.30         5      22      0.7736        No          25.30
6    AAPL   30   100     110  29.10        10      22      1.5111        No          29.10
7    AAPL   30   100     115  33.46        15      22      2.2159       Yes          29.10
8    AAPL   30   100     120  38.48        20      22      2.8907       Yes          29.10
9    AAPL   50   102      80  14.58        22      22     -3.5379        No          14.58
10   AAPL   50   102      85  16.20        17      22     -2.5767        No          16.20
11   AAPL   50   102      90  18.00        12      22     -1.6705        No          18.00
12   AAPL   50   102      95  20.00         7      22     -0.8132        No          20.00
13   AAPL   50   102     100  22.00         2      22      0.0000        No          22.00
14   AAPL   50   102     105  25.30         3      22      0.7736        No          25.30
15   AAPL   50   102     110  29.10         8      22      1.5111        No          29.10
16   AAPL   50   102     115  33.46        13      22      2.2159       Yes          29.10
17   AAPL   50   102     120  38.48        18      22      2.8907       Yes          29.10
18   AAPL   30   170     150  14.58        20      22     -3.5379        No          14.58
19   AAPL   30   170     155  16.20        15      22     -2.5767        No          16.20
20   AAPL   30   170     160  18.00        10      22     -1.6705        No          18.00
21   AAPL   30   170     165  20.00         5      22     -0.8132        No          20.00
22   AAPL   30   170     170  22.00         0      22      0.0000        No          22.00
23   AAPL   30   170     175  25.30         5      22      0.7736        No          25.30
24   AAPL   30   170     180  29.10        10      22      1.5111        No          29.10
25   AAPL   30   170     185  33.46        15      22      2.2159       Yes          29.10
26   AAPL   30   170     190  38.48        20      22      2.8907       Yes          29.10
27   AAPL   60   171     150  14.58        21      22     -3.5379        No          14.58
28   AAPL   60   171     155  16.20        16      22     -2.5767        No          16.20
29   AAPL   60   171     160  18.00        11      22     -1.6705        No          18.00
30   AAPL   60   171     165  20.00         6      22     -0.8132        No          20.00
31   AAPL   60   171     170  22.00         1      22      0.0000        No          22.00
32   AAPL   60   171     175  25.30         4      22      0.7736        No          25.30
33   AAPL   60   171     180  29.10         9      22      1.5111        No          29.10
34   AAPL   60   171     185  33.46        14      22      2.2159       Yes          29.10
35   AAPL   60   171     190  38.48        19      22      2.8907       Yes          29.10

【讨论】:

  • 非常感谢。 . .剩下的问题是我不知道如何用最接近的 Vol 级别替换 NaN。实质上,上述输出中的前 2 个 NaN 值应为 18.0 和 18.0。接下来的 2 个 NaN 值(索引级别 7 和 8)应为 29.1 和 29.1
  • 看起来你想建立一个关于所需音量水平的交叉曲线。填充 na 最常见的方法是使用三次插值,因此曲线是平滑的。类似于您必须插入收益率曲线的情况。
  • 不确定在这种情况下如何进行前向填充或后向填充。就曲线而言,我实际上有一个可靠的 4 阶曲线,问题是我的模拟压力测试引入的数据超出了用于生成 4 阶的原始数据范围,这在极端
  • 确实如此。从数据来看,大多数 NaN 需要外推而不是插值。
  • 我认为不值得提出新问题的新发展。使用建勋的套路,我强制让触发器两边都是 abs(2)。我如何让触发器在下行时为 -4,在上行时为 +2?
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多