首页 > 解决方案 > Pandas:根据股票价格获取目标和损失指标,达到一定的比率并动态改变基本价格

问题描述

我有给定的数据框:

date                            open    high    low    close    volume
28  2021-08-24 10:58:00+05:30   207.5   214.05  206     211.35  850
29  2021-08-24 10:59:00+05:30   211.35  215.15  211.35  214.85  175
30  2021-08-24 11:00:00+05:30   214.85  215.75  212.75  213.9   275
31  2021-08-24 11:01:00+05:30   213.9   214.15  209.75  212.65  975
35  2021-08-24 11:05:00+05:30   217.45  221.95  216.65  218.5   750
36  2021-08-24 11:06:00+05:30   218.5   230.5   218.5   229.3   1775
37  2021-08-24 11:07:00+05:30   229.3   235.05  225     233.4   1900
38  2021-08-24 11:08:00+05:30   233.4   236.45  232.5   233.65  1100
39  2021-08-24 11:09:00+05:30   233.65  236.45  233     234.45  1825
40  2021-08-24 11:10:00+05:30   234.45  236.65  227.1   227.4   1225
41  2021-08-24 11:11:00+05:30   227.4   232.4   227.4   229.7   375
42  2021-08-24 11:12:00+05:30   229.7   229.75  226.9   228.55  350
43  2021-08-24 11:13:00+05:30   227.3   228.9   223.95  224.7   725
44  2021-08-24 11:14:00+05:30   224.2   224.35  221.85  224.1   300
58  2021-08-24 11:28:00+05:30   234.5   246.35  233.4   243.65  4075
59  2021-08-24 11:29:00+05:30   243.65  248.25  241.25  247.85  1075
60  2021-08-24 11:30:00+05:30   247.85  250.6   246.3   248.45  1650
61  2021-08-24 11:31:00+05:30   248.35  248.35  244.3   244.3   7350
62  2021-08-24 11:32:00+05:30   244.3   246.35  243.8   243.95  1450
63  2021-08-24 11:33:00+05:30   243.95  246.5   241.4   241.4   600
64  2021-08-24 11:34:00+05:30   241.4   260     241.4   258     3425
65  2021-08-24 11:35:00+05:30   256.95  266.7   256.45  262.35  5950
66  2021-08-24 11:36:00+05:30   262.35  268.2   261.35  267 5200
67  2021-08-24 11:37:00+05:30   266.75  269.45  264.5   267.45  4175
68  2021-08-24 11:38:00+05:30   267.45  267.45  258.65  260.15  1725
69  2021-08-24 11:39:00+05:30   260.15  265.5   258.15  263.4   1875
70  2021-08-24 11:40:00+05:30   263.4   263.9   260.05  260.7   1950
71  2021-08-24 11:41:00+05:30   260     260.9   253.65  254.95  1350
72  2021-08-24 11:42:00+05:30   255.4   255.4   251.6   253.3   1100
88  2021-08-24 11:58:00+05:30   277.5   278.9   274.35  276.05  500
89  2021-08-24 11:59:00+05:30   276.1   285     276.1   285     1000
90  2021-08-24 12:00:00+05:30   285.7   286.8   276     279.2   2100
91  2021-08-24 12:01:00+05:30   279.2   282.2   277.95  282.2   650
92  2021-08-24 12:02:00+05:30   282.2   286.5   282 282.15  1500
93  2021-08-24 12:03:00+05:30   282.15  291.35  282.15  290.6   2425
94  2021-08-24 12:04:00+05:30   290.6   292.5   287.75  288.15  925
95  2021-08-24 12:05:00+05:30   288.15  288.95  282.55  286.1   2300
96  2021-08-24 12:06:00+05:30   286.1   291.1   286.1   291.1   350
97  2021-08-24 12:07:00+05:30   292.2   298     288.4   298     2400
98  2021-08-24 12:08:00+05:30   299 301.8       294.4   296     2900
99  2021-08-24 12:09:00+05:30   296 299.55      296     299.55  1100
100 2021-08-24 12:10:00+05:30   299.55  300     295.4   296.95  825
101 2021-08-24 12:11:00+05:30   296.95  297.65  292     292     475
128 2021-08-24 12:38:00+05:30   310.55  314.4   308     314.4   1150
129 2021-08-24 12:39:00+05:30   314.4   317.1   311.05  315.3   700
130 2021-08-24 12:40:00+05:30   316.8   331     316.55  330.4   5950
131 2021-08-24 12:41:00+05:30   329.7   333     326.8   330.45  4675
132 2021-08-24 12:42:00+05:30   330.45  330.45  323.15  327.9   1625
133 2021-08-24 12:43:00+05:30   326.7   327.7   320.95  324 1475
134 2021-08-24 12:44:00+05:30   323.4   326     317.9   324.95  1450
135 2021-08-24 12:45:00+05:30   324.95  331     321.65  330 1175
136 2021-08-24 12:46:00+05:30   330     331.2   324.9   326.85  1400
137 2021-08-24 12:47:00+05:30   326.9   327.05  322.25  326.6   1325
138 2021-08-24 12:48:00+05:30   326.6   326.6   321.1   322.2   625
151 2021-08-24 13:01:00+05:30   337.85  337.85  331.95  334.2   725
152 2021-08-24 13:02:00+05:30   331.8   332.5   322.2   324.65  1550
163 2021-08-24 13:13:00+05:30   328.65  329.75  327.35  329 800
164 2021-08-24 13:14:00+05:30   329     332.15  325 325 300
165 2021-08-24 13:15:00+05:30   325     325 316.5   316.5   850
166 2021-08-24 13:16:00+05:30   316.5   325 316.5   325 225
167 2021-08-24 13:17:00+05:30   325     326.95  323.2   325 375
168 2021-08-24 13:18:00+05:30   325     327.85  323.4   326.05  875
169 2021-08-24 13:19:00+05:30   326.05  330.9   326.05  326.95  475
170 2021-08-24 13:20:00+05:30   326.95  327 324.15  325.9   350
171 2021-08-24 13:21:00+05:30   324.15  328.1   324.15  328.1   300
172 2021-08-24 13:22:00+05:30   328.1   338.05  328.1   337.55  550
173 2021-08-24 13:23:00+05:30   336     345.8   336 345.05  3025
174 2021-08-24 13:24:00+05:30   344.35  345.05  339.55  342.75  2125
175 2021-08-24 13:25:00+05:30   342.75  342.75  338.15  339.95  800
176 2021-08-24 13:26:00+05:30   339.95  340.9   337 340 825
177 2021-08-24 13:27:00+05:30   340     342 336.15  342 1000
178 2021-08-24 13:28:00+05:30   342     345.6   341.1   342.65  1500
179 2021-08-24 13:29:00+05:30   342.65  345.85  341 344.1   950
180 2021-08-24 13:30:00+05:30   344.1   344.1   334.6   334.6   1575
181 2021-08-24 13:31:00+05:30   337     338.15  333.95  333.95  650
202 2021-08-24 13:52:00+05:30   335.4   340.65  335.4   340.4   1700
203 2021-08-24 13:53:00+05:30   340.4   341.2   339 340 1400
204 2021-08-24 13:54:00+05:30   340     346.15  339.3   345.25  925
205 2021-08-24 13:55:00+05:30   345.6   347.9   342.3   342.3   1500
206 2021-08-24 13:56:00+05:30   341.35  342.3   339.2   339.2   825
207 2021-08-24 13:57:00+05:30   338.25  345.1   336.4   343.3   2050
208 2021-08-24 13:58:00+05:30   343.3   346.7   340.1   343.85  650
209 2021-08-24 13:59:00+05:30   343.2   343.85  339 340 925
210 2021-08-24 14:00:00+05:30   340     342.35  338.95  338.95  625
211 2021-08-24 14:01:00+05:30   338.95  344.4   338.75  339.2   975
212 2021-08-24 14:02:00+05:30   339.2   346.3   339.2   345.1   800
213 2021-08-24 14:03:00+05:30   345.1   345.9   340.35  343.95  450
214 2021-08-24 14:04:00+05:30   343.95  344 341.8   344 775
224 2021-08-24 14:14:00+05:30   344.15  344.9   337.7   344.35  2100
231 2021-08-24 14:21:00+05:30   361.5   367.3   360.05  361.65  5525
232 2021-08-24 14:22:00+05:30   361.65  367.3   360.9   365 2800
233 2021-08-24 14:23:00+05:30   365     373.7   364.05  373.6   5625
234 2021-08-24 14:24:00+05:30   372.35  383.7   370.6   382.15  6200
235 2021-08-24 14:25:00+05:30   384.45  387.55  376.85  379.8   4250
236 2021-08-24 14:26:00+05:30   379.8   396.15  379.55  393 3250
237 2021-08-24 14:27:00+05:30   393.6   400 391.55  397 3875
238 2021-08-24 14:28:00+05:30   398.7   398.7   391.7   396.5   4450
239 2021-08-24 14:29:00+05:30   395.65  396.5   392.6   394.75  4800
240 2021-08-24 14:30:00+05:30   394.75  399.15  394.75  397.55  3950

在这个数据框中,我必须根据给定的条件添加两个新列,即 Target 和 Loss:

  1. 最初,我们将第一行的收盘价作为基准收盘价。现在每当"current close" = 1.03 * "base close"对应于该Target列下该值的行应为 1。然后,“基本收盘价”更新为此“当前收盘价”达到目标比率。
  2. 否则,只要"current close" = 0.97 * "base close"对应于该Loss列下该值的行应为 1。(此“基本收盘价”可能与该Target列的“基本收盘价”不同。)同样,“基本收盘价”价格会更新为此“当前收盘价”达到了损失率。
  3. 范围内的所有接近值:0.97 * "base close(Loss)" <= "current close" <= 1.03 * "base close(Target)"应忽略

例如:

  1. 在上面的数据框中,我们选择“base close”=211.35。现在 1.03 *“基本收盘价”=217.69。由于 218.50 > 217.69,因此列下与该值对应的行Target设置为 1。因此列下的第 36行Target应为 1。218.50 现在是后续处理的“基本关闭”。

  2. 现在我们选择“base close”=218.50。从 1.03*218.50=225.05 开始。由于 229.3 > 225.05 对应于该Target行下该值的行为 1。因此损失列下的第 36 行设置为 1

  3. 我们继续这些计算,直到我们到达帧结束

  4. Target和列下不满足上述两个条件的所有其他行都Loss设置为0

最终数据框应如下所示:

在此处输入图像描述

标签: pythonpandasdataframe

解决方案


正如 OP 所阐明的,在每一行中,计算与当前行值的比率的基值并不总是我们可以通过 获得该基值的最后一行值.shift()。相反,这个基值要么是第一行的值,要么是达到目标比率的前一行值。实际上,此基值可以是前行中的任何值,具体取决于其与先前值的相对值。

为此,我们必须使用自定义函数,以便我们可以动态更新比率计算的基值。我们可以定义2个函数:

def set_Target(close, factor):
    last_val = close.iat[0]
    target_list = []
    for i, val in close.iteritems():
        if (val / last_val) > factor:
            target_list.append(1)
            last_val = val
        else:
            target_list.append(0)
    return target_list


def set_Loss(close, factor):
    last_val = close.iat[0]
    loss_list = []
    for i, val in close.iteritems():
        if (val / last_val) < factor:
            loss_list.append(1)
            last_val = val
        else:
            loss_list.append(0)
    return loss_list

然后,我们调用自定义函数来设置列TargetLoss,如下:

df['Target'] = set_Target(df['close'], 1.03)

df['Loss'] = set_Loss(df['close'], 0.97)

结果:

print(df)

                          date    open    high     low   close  volume  Target  Loss
28   2021-08-24 10:58:00+05:30  207.50  214.05  206.00  211.35     850       0     0
29   2021-08-24 10:59:00+05:30  211.35  215.15  211.35  214.85     175       0     0
30   2021-08-24 11:00:00+05:30  214.85  215.75  212.75  213.90     275       0     0
31   2021-08-24 11:01:00+05:30  213.90  214.15  209.75  212.65     975       0     0
35   2021-08-24 11:05:00+05:30  217.45  221.95  216.65  218.50     750       1     0
36   2021-08-24 11:06:00+05:30  218.50  230.50  218.50  229.30    1775       1     0
37   2021-08-24 11:07:00+05:30  229.30  235.05  225.00  233.40    1900       0     0
38   2021-08-24 11:08:00+05:30  233.40  236.45  232.50  233.65    1100       0     0
39   2021-08-24 11:09:00+05:30  233.65  236.45  233.00  234.45    1825       0     0
40   2021-08-24 11:10:00+05:30  234.45  236.65  227.10  227.40    1225       0     0
41   2021-08-24 11:11:00+05:30  227.40  232.40  227.40  229.70     375       0     0
42   2021-08-24 11:12:00+05:30  229.70  229.75  226.90  228.55     350       0     0
43   2021-08-24 11:13:00+05:30  227.30  228.90  223.95  224.70     725       0     0
44   2021-08-24 11:14:00+05:30  224.20  224.35  221.85  224.10     300       0     0
58   2021-08-24 11:28:00+05:30  234.50  246.35  233.40  243.65    4075       1     0
59   2021-08-24 11:29:00+05:30  243.65  248.25  241.25  247.85    1075       0     0
60   2021-08-24 11:30:00+05:30  247.85  250.60  246.30  248.45    1650       0     0
61   2021-08-24 11:31:00+05:30  248.35  248.35  244.30  244.30    7350       0     0
62   2021-08-24 11:32:00+05:30  244.30  246.35  243.80  243.95    1450       0     0
63   2021-08-24 11:33:00+05:30  243.95  246.50  241.40  241.40     600       0     0
64   2021-08-24 11:34:00+05:30  241.40  260.00  241.40  258.00    3425       1     0
65   2021-08-24 11:35:00+05:30  256.95  266.70  256.45  262.35    5950       0     0
66   2021-08-24 11:36:00+05:30  262.35  268.20  261.35  267.00    5200       1     0
67   2021-08-24 11:37:00+05:30  266.75  269.45  264.50  267.45    4175       0     0
68   2021-08-24 11:38:00+05:30  267.45  267.45  258.65  260.15    1725       0     0
69   2021-08-24 11:39:00+05:30  260.15  265.50  258.15  263.40    1875       0     0
70   2021-08-24 11:40:00+05:30  263.40  263.90  260.05  260.70    1950       0     0
71   2021-08-24 11:41:00+05:30  260.00  260.90  253.65  254.95    1350       0     0
72   2021-08-24 11:42:00+05:30  255.40  255.40  251.60  253.30    1100       0     0
88   2021-08-24 11:58:00+05:30  277.50  278.90  274.35  276.05     500       1     0
89   2021-08-24 11:59:00+05:30  276.10  285.00  276.10  285.00    1000       1     0
90   2021-08-24 12:00:00+05:30  285.70  286.80  276.00  279.20    2100       0     0
91   2021-08-24 12:01:00+05:30  279.20  282.20  277.95  282.20     650       0     0
92   2021-08-24 12:02:00+05:30  282.20  286.50  282.00  282.15    1500       0     0
93   2021-08-24 12:03:00+05:30  282.15  291.35  282.15  290.60    2425       0     0
94   2021-08-24 12:04:00+05:30  290.60  292.50  287.75  288.15     925       0     0
95   2021-08-24 12:05:00+05:30  288.15  288.95  282.55  286.10    2300       0     0
96   2021-08-24 12:06:00+05:30  286.10  291.10  286.10  291.10     350       0     0
97   2021-08-24 12:07:00+05:30  292.20  298.00  288.40  298.00    2400       1     0
98   2021-08-24 12:08:00+05:30  299.00  301.80  294.40  296.00    2900       0     0
99   2021-08-24 12:09:00+05:30  296.00  299.55  296.00  299.55    1100       0     0
100  2021-08-24 12:10:00+05:30  299.55  300.00  295.40  296.95     825       0     0
101  2021-08-24 12:11:00+05:30  296.95  297.65  292.00  292.00     475       0     0
128  2021-08-24 12:38:00+05:30  310.55  314.40  308.00  314.40    1150       1     0
129  2021-08-24 12:39:00+05:30  314.40  317.10  311.05  315.30     700       0     0
130  2021-08-24 12:40:00+05:30  316.80  331.00  316.55  330.40    5950       1     0
131  2021-08-24 12:41:00+05:30  329.70  333.00  326.80  330.45    4675       0     0
132  2021-08-24 12:42:00+05:30  330.45  330.45  323.15  327.90    1625       0     0
133  2021-08-24 12:43:00+05:30  326.70  327.70  320.95  324.00    1475       0     0
134  2021-08-24 12:44:00+05:30  323.40  326.00  317.90  324.95    1450       0     0
135  2021-08-24 12:45:00+05:30  324.95  331.00  321.65  330.00    1175       0     0
136  2021-08-24 12:46:00+05:30  330.00  331.20  324.90  326.85    1400       0     0
137  2021-08-24 12:47:00+05:30  326.90  327.05  322.25  326.60    1325       0     0
138  2021-08-24 12:48:00+05:30  326.60  326.60  321.10  322.20     625       0     0
151  2021-08-24 13:01:00+05:30  337.85  337.85  331.95  334.20     725       0     0
152  2021-08-24 13:02:00+05:30  331.80  332.50  322.20  324.65    1550       0     0
163  2021-08-24 13:13:00+05:30  328.65  329.75  327.35  329.00     800       0     0
164  2021-08-24 13:14:00+05:30  329.00  332.15  325.00  325.00     300       0     0
165  2021-08-24 13:15:00+05:30  325.00  325.00  316.50  316.50     850       0     0
166  2021-08-24 13:16:00+05:30  316.50  325.00  316.50  325.00     225       0     0
167  2021-08-24 13:17:00+05:30  325.00  326.95  323.20  325.00     375       0     0
168  2021-08-24 13:18:00+05:30  325.00  327.85  323.40  326.05     875       0     0
169  2021-08-24 13:19:00+05:30  326.05  330.90  326.05  326.95     475       0     0
170  2021-08-24 13:20:00+05:30  326.95  327.00  324.15  325.90     350       0     0
171  2021-08-24 13:21:00+05:30  324.15  328.10  324.15  328.10     300       0     0
172  2021-08-24 13:22:00+05:30  328.10  338.05  328.10  337.55     550       0     0
173  2021-08-24 13:23:00+05:30  336.00  345.80  336.00  345.05    3025       1     0
174  2021-08-24 13:24:00+05:30  344.35  345.05  339.55  342.75    2125       0     0
175  2021-08-24 13:25:00+05:30  342.75  342.75  338.15  339.95     800       0     0
176  2021-08-24 13:26:00+05:30  339.95  340.90  337.00  340.00     825       0     0
177  2021-08-24 13:27:00+05:30  340.00  342.00  336.15  342.00    1000       0     0
178  2021-08-24 13:28:00+05:30  342.00  345.60  341.10  342.65    1500       0     0
179  2021-08-24 13:29:00+05:30  342.65  345.85  341.00  344.10     950       0     0
180  2021-08-24 13:30:00+05:30  344.10  344.10  334.60  334.60    1575       0     0
181  2021-08-24 13:31:00+05:30  337.00  338.15  333.95  333.95     650       0     0
202  2021-08-24 13:52:00+05:30  335.40  340.65  335.40  340.40    1700       0     0
203  2021-08-24 13:53:00+05:30  340.40  341.20  339.00  340.00    1400       0     0
204  2021-08-24 13:54:00+05:30  340.00  346.15  339.30  345.25     925       0     0
205  2021-08-24 13:55:00+05:30  345.60  347.90  342.30  342.30    1500       0     0
206  2021-08-24 13:56:00+05:30  341.35  342.30  339.20  339.20     825       0     0
207  2021-08-24 13:57:00+05:30  338.25  345.10  336.40  343.30    2050       0     0
208  2021-08-24 13:58:00+05:30  343.30  346.70  340.10  343.85     650       0     0
209  2021-08-24 13:59:00+05:30  343.20  343.85  339.00  340.00     925       0     0
210  2021-08-24 14:00:00+05:30  340.00  342.35  338.95  338.95     625       0     0
211  2021-08-24 14:01:00+05:30  338.95  344.40  338.75  339.20     975       0     0
212  2021-08-24 14:02:00+05:30  339.20  346.30  339.20  345.10     800       0     0
213  2021-08-24 14:03:00+05:30  345.10  345.90  340.35  343.95     450       0     0
214  2021-08-24 14:04:00+05:30  343.95  344.00  341.80  344.00     775       0     0
224  2021-08-24 14:14:00+05:30  344.15  344.90  337.70  344.35    2100       0     0
231  2021-08-24 14:21:00+05:30  361.50  367.30  360.05  361.65    5525       1     0
232  2021-08-24 14:22:00+05:30  361.65  367.30  360.90  365.00    2800       0     0
233  2021-08-24 14:23:00+05:30  365.00  373.70  364.05  373.60    5625       1     0
234  2021-08-24 14:24:00+05:30  372.35  383.70  370.60  382.15    6200       0     0
235  2021-08-24 14:25:00+05:30  384.45  387.55  376.85  379.80    4250       0     0
236  2021-08-24 14:26:00+05:30  379.80  396.15  379.55  393.00    3250       1     0
237  2021-08-24 14:27:00+05:30  393.60  400.00  391.55  397.00    3875       0     0
238  2021-08-24 14:28:00+05:30  398.70  398.70  391.70  396.50    4450       0     0
239  2021-08-24 14:29:00+05:30  395.65  396.50  392.60  394.75    4800       0     0
240  2021-08-24 14:30:00+05:30  394.75  399.15  394.75  397.55    3950       0     0

推荐阅读