python - 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:
- 最初,我们将第一行的收盘价作为基准收盘价。现在每当
"current close" = 1.03 * "base close"
对应于该Target
列下该值的行应为 1。然后,“基本收盘价”更新为此“当前收盘价”达到目标比率。 - 否则,只要
"current close" = 0.97 * "base close"
对应于该Loss
列下该值的行应为 1。(此“基本收盘价”可能与该Target
列的“基本收盘价”不同。)同样,“基本收盘价”价格会更新为此“当前收盘价”达到了损失率。 - 范围内的所有接近值:
0.97 * "base close(Loss)" <= "current close" <= 1.03 * "base close(Target)"
应忽略
例如:
在上面的数据框中,我们选择“base close”=211.35。现在 1.03 *“基本收盘价”=217.69。由于 218.50 > 217.69,因此列下与该值对应的行
Target
设置为 1。因此列下的第 36行Target
应为 1。218.50 现在是后续处理的“基本关闭”。现在我们选择“base close”=218.50。从 1.03*218.50=225.05 开始。由于 229.3 > 225.05 对应于该
Target
行下该值的行为 1。因此损失列下的第 36 行设置为 1我们继续这些计算,直到我们到达帧结束
Target
和列下不满足上述两个条件的所有其他行都Loss
设置为0
最终数据框应如下所示:
解决方案
正如 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
然后,我们调用自定义函数来设置列Target
和Loss
,如下:
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
推荐阅读
- git - 有没有办法在 Git 中离线合并和收集冲突统计信息?
- node.js - Hyperledger Composer - 找不到交易错误
- amazon-web-services - 您将如何在分布式系统中编写强读写一致性?
- r - 在R中同时堆叠列并重塑
- python - 有没有办法在 jmespath 查询中获取结果的完整路径?
- javascript - 使用每个推送到数组选中的复选框值
- python - Plotly dash 回调返回不是 JSON 可序列化的
- python - Jupyter Notebook 中特定单元的基准代码
- html - 如何在外部元素中触发悬停动作
- node.js - 如何检查以太坊交易是否已被挖掘