Spaces:
Sleeping
Sleeping
new features for models + levels
Browse files- model_1h.py +90 -6
- model_30m.py +107 -2
- model_90m.py +90 -6
- model_day.py +70 -1
- troubleshoot_day_model.ipynb +231 -80
model_1h.py
CHANGED
@@ -67,7 +67,20 @@ model_cols = [
|
|
67 |
'RangePct_n2',
|
68 |
'OHLC4_VIX',
|
69 |
'OHLC4_VIX_n1',
|
70 |
-
'OHLC4_VIX_n2'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
]
|
72 |
|
73 |
def walk_forward_validation_seq(df, target_column_clf, target_column_regr, num_training_rows, num_periods):
|
@@ -324,6 +337,52 @@ def get_data():
|
|
324 |
data['CurrentGap'] = data['CurrentGap'].shift(-1)
|
325 |
data['DayOfWeek'] = pd.to_datetime(data.index)
|
326 |
data['DayOfWeek'] = data['DayOfWeek'].dt.day
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
327 |
|
328 |
# Intraday features
|
329 |
data['CurrentHigh30'] = data['High30'].shift(-1)
|
@@ -349,6 +408,23 @@ def get_data():
|
|
349 |
data['Quarter'] = data['DayOfWeek'].dt.quarter
|
350 |
data['DayOfWeek'] = data['DayOfWeek'].dt.weekday
|
351 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
352 |
for rid in tqdm(release_ids, desc='Merging econ data'):
|
353 |
# Get the name of the release
|
354 |
n = releases[rid]['name']
|
@@ -396,11 +472,6 @@ def get_data():
|
|
396 |
'CurrentClose30toClose',
|
397 |
'CurrentRange30',
|
398 |
'GapFill30',
|
399 |
-
# 'OHLC4_Trend',
|
400 |
-
# 'OHLC4_Trend_n1',
|
401 |
-
# 'OHLC4_Trend_n2',
|
402 |
-
# 'VIX5Day',
|
403 |
-
# 'VIX5Day_n1',
|
404 |
'CurrentGap',
|
405 |
'RangePct',
|
406 |
'RangePct_n1',
|
@@ -408,6 +479,19 @@ def get_data():
|
|
408 |
'OHLC4_VIX',
|
409 |
'OHLC4_VIX_n1',
|
410 |
'OHLC4_VIX_n2',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
411 |
'Target',
|
412 |
'Target_clf'
|
413 |
]]
|
|
|
67 |
'RangePct_n2',
|
68 |
'OHLC4_VIX',
|
69 |
'OHLC4_VIX_n1',
|
70 |
+
'OHLC4_VIX_n2',
|
71 |
+
'OpenL1',
|
72 |
+
'OpenL2',
|
73 |
+
'OpenH1',
|
74 |
+
'OpenH2',
|
75 |
+
'L1TouchPct',
|
76 |
+
'L2TouchPct',
|
77 |
+
'H1TouchPct',
|
78 |
+
'H2TouchPct',
|
79 |
+
'L1BreakPct',
|
80 |
+
'L2BreakPct',
|
81 |
+
'H1BreakPct',
|
82 |
+
'H2BreakPct',
|
83 |
+
'GreenProbas'
|
84 |
]
|
85 |
|
86 |
def walk_forward_validation_seq(df, target_column_clf, target_column_regr, num_training_rows, num_periods):
|
|
|
337 |
data['CurrentGap'] = data['CurrentGap'].shift(-1)
|
338 |
data['DayOfWeek'] = pd.to_datetime(data.index)
|
339 |
data['DayOfWeek'] = data['DayOfWeek'].dt.day
|
340 |
+
|
341 |
+
# Calculate up
|
342 |
+
data['up'] = 100 * (data['High'].shift(1) - data['Open'].shift(1)) / data['Close'].shift(1)
|
343 |
+
|
344 |
+
# Calculate upSD
|
345 |
+
data['upSD'] = data['up'].rolling(30).std(ddof=0)
|
346 |
+
|
347 |
+
# Calculate aveUp
|
348 |
+
data['aveUp'] = data['up'].rolling(30).mean()
|
349 |
+
data['H1'] = data['Open'] + (data['aveUp'] / 100) * data['Open']
|
350 |
+
data['H2'] = data['Open'] + ((data['aveUp'] + data['upSD']) / 100) * data['Open']
|
351 |
+
data['down'] = 100 * (data['Open'].shift(1) - data['Low'].shift(1)) / data['Close'].shift(1)
|
352 |
+
data['downSD'] = data['down'].rolling(30).std(ddof=0)
|
353 |
+
data['aveDown'] = data['down'].rolling(30).mean()
|
354 |
+
data['L1'] = data['Open'] - (data['aveDown'] / 100) * data['Open']
|
355 |
+
data['L2'] = data['Open'] - ((data['aveDown'] + data['upSD']) / 100) * data['Open']
|
356 |
+
|
357 |
+
data = data.assign(
|
358 |
+
L1Touch = lambda x: x['Low'] < x['L1'],
|
359 |
+
L2Touch = lambda x: x['Low'] < x['L2'],
|
360 |
+
H1Touch = lambda x: x['High'] > x['H1'],
|
361 |
+
H2Touch = lambda x: x['High'] > x['H2'],
|
362 |
+
L1Break = lambda x: x['Close'] < x['L1'],
|
363 |
+
L2Break = lambda x: x['Close'] < x['L2'],
|
364 |
+
H1Break = lambda x: x['Close'] > x['H1'],
|
365 |
+
H2Break = lambda x: x['Close'] > x['H2'],
|
366 |
+
OpenL1 = lambda x: x['Open'] / x['L1'],
|
367 |
+
OpenL2 = lambda x: x['Open'] / x['L2'],
|
368 |
+
OpenH1 = lambda x: x['Open'] / x['H1'],
|
369 |
+
OpenH2 = lambda x: x['Open'] / x['H2']
|
370 |
+
)
|
371 |
+
|
372 |
+
level_cols = [
|
373 |
+
'L1Touch',
|
374 |
+
'L2Touch',
|
375 |
+
'H1Touch',
|
376 |
+
'H2Touch',
|
377 |
+
'L1Break',
|
378 |
+
'L2Break',
|
379 |
+
'H1Break',
|
380 |
+
'H2Break'
|
381 |
+
]
|
382 |
+
|
383 |
+
for col in level_cols:
|
384 |
+
data[col+'Pct'] = data[col].rolling(100).mean()
|
385 |
+
data[col+'Pct'] = data[col+'Pct'].shift(-1)
|
386 |
|
387 |
# Intraday features
|
388 |
data['CurrentHigh30'] = data['High30'].shift(-1)
|
|
|
408 |
data['Quarter'] = data['DayOfWeek'].dt.quarter
|
409 |
data['DayOfWeek'] = data['DayOfWeek'].dt.weekday
|
410 |
|
411 |
+
def get_quintiles(df):
|
412 |
+
return df.groupby(pd.qcut(df['CurrentClose30toClose'], 5))['GreenDay'].mean()
|
413 |
+
|
414 |
+
probas = []
|
415 |
+
for i, pct in enumerate(data['CurrentClose30toClose']):
|
416 |
+
try:
|
417 |
+
df_q = get_quintiles(data.iloc[:i])
|
418 |
+
for q in df_q.index:
|
419 |
+
if q.left <= pct <= q.right:
|
420 |
+
p = df_q[q]
|
421 |
+
except:
|
422 |
+
p = None
|
423 |
+
|
424 |
+
probas.append(p)
|
425 |
+
|
426 |
+
data['GreenProbas'] = probas
|
427 |
+
|
428 |
for rid in tqdm(release_ids, desc='Merging econ data'):
|
429 |
# Get the name of the release
|
430 |
n = releases[rid]['name']
|
|
|
472 |
'CurrentClose30toClose',
|
473 |
'CurrentRange30',
|
474 |
'GapFill30',
|
|
|
|
|
|
|
|
|
|
|
475 |
'CurrentGap',
|
476 |
'RangePct',
|
477 |
'RangePct_n1',
|
|
|
479 |
'OHLC4_VIX',
|
480 |
'OHLC4_VIX_n1',
|
481 |
'OHLC4_VIX_n2',
|
482 |
+
'OpenL1',
|
483 |
+
'OpenL2',
|
484 |
+
'OpenH1',
|
485 |
+
'OpenH2',
|
486 |
+
'L1TouchPct',
|
487 |
+
'L2TouchPct',
|
488 |
+
'H1TouchPct',
|
489 |
+
'H2TouchPct',
|
490 |
+
'L1BreakPct',
|
491 |
+
'L2BreakPct',
|
492 |
+
'H1BreakPct',
|
493 |
+
'H2BreakPct',
|
494 |
+
'GreenProbas',
|
495 |
'Target',
|
496 |
'Target_clf'
|
497 |
]]
|
model_30m.py
CHANGED
@@ -68,7 +68,20 @@ model_cols = [
|
|
68 |
'RangePct_n2',
|
69 |
'OHLC4_VIX',
|
70 |
'OHLC4_VIX_n1',
|
71 |
-
'OHLC4_VIX_n2'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
72 |
]
|
73 |
|
74 |
def walk_forward_validation_seq(df, target_column_clf, target_column_regr, num_training_rows, num_periods):
|
@@ -312,17 +325,19 @@ def get_data():
|
|
312 |
data['DayOfWeek'] = data['DayOfWeek'].dt.day
|
313 |
|
314 |
# Intraday features
|
|
|
315 |
data['CurrentHigh30'] = data['High30'].shift(-1)
|
316 |
data['CurrentLow30'] = data['Low30'].shift(-1)
|
317 |
data['CurrentClose30'] = data['Close30'].shift(-1)
|
318 |
|
|
|
319 |
# Open to High
|
320 |
data['CurrentHigh30toClose'] = (data['CurrentHigh30'] / data['Close']) - 1
|
321 |
data['CurrentLow30toClose'] = (data['CurrentLow30'] / data['Close']) - 1
|
322 |
data['CurrentClose30toClose'] = (data['CurrentClose30'] / data['Close']) - 1
|
323 |
data['CurrentRange30'] = (data['CurrentHigh30'] - data['CurrentLow30']) / data['Close']
|
324 |
data['GapFill30'] = [low <= prev_close if gap > 0 else high >= prev_close for high, low, prev_close, gap in zip(data['CurrentHigh30'], data['CurrentLow30'], data['Close'], data['CurrentGap'])]
|
325 |
-
|
326 |
# Target -- the next day's low
|
327 |
data['Target'] = (data['OHLC4'] / data['PrevClose']) - 1
|
328 |
data['Target'] = data['Target'].shift(-1)
|
@@ -335,6 +350,83 @@ def get_data():
|
|
335 |
data['Quarter'] = data['DayOfWeek'].dt.quarter
|
336 |
data['DayOfWeek'] = data['DayOfWeek'].dt.weekday
|
337 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
338 |
for rid in tqdm(release_ids, desc='Merging econ data'):
|
339 |
# Get the name of the release
|
340 |
n = releases[rid]['name']
|
@@ -389,6 +481,19 @@ def get_data():
|
|
389 |
'OHLC4_VIX',
|
390 |
'OHLC4_VIX_n1',
|
391 |
'OHLC4_VIX_n2',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
392 |
'Target',
|
393 |
'Target_clf'
|
394 |
]]
|
|
|
68 |
'RangePct_n2',
|
69 |
'OHLC4_VIX',
|
70 |
'OHLC4_VIX_n1',
|
71 |
+
'OHLC4_VIX_n2',
|
72 |
+
'OpenL1',
|
73 |
+
'OpenL2',
|
74 |
+
'OpenH1',
|
75 |
+
'OpenH2',
|
76 |
+
'L1TouchPct',
|
77 |
+
'L2TouchPct',
|
78 |
+
'H1TouchPct',
|
79 |
+
'H2TouchPct',
|
80 |
+
'L1BreakPct',
|
81 |
+
'L2BreakPct',
|
82 |
+
'H1BreakPct',
|
83 |
+
'H2BreakPct',
|
84 |
+
'GreenProbas'
|
85 |
]
|
86 |
|
87 |
def walk_forward_validation_seq(df, target_column_clf, target_column_regr, num_training_rows, num_periods):
|
|
|
325 |
data['DayOfWeek'] = data['DayOfWeek'].dt.day
|
326 |
|
327 |
# Intraday features
|
328 |
+
data['CurrentOpen30'] = data['Open30'].shift(-1)
|
329 |
data['CurrentHigh30'] = data['High30'].shift(-1)
|
330 |
data['CurrentLow30'] = data['Low30'].shift(-1)
|
331 |
data['CurrentClose30'] = data['Close30'].shift(-1)
|
332 |
|
333 |
+
|
334 |
# Open to High
|
335 |
data['CurrentHigh30toClose'] = (data['CurrentHigh30'] / data['Close']) - 1
|
336 |
data['CurrentLow30toClose'] = (data['CurrentLow30'] / data['Close']) - 1
|
337 |
data['CurrentClose30toClose'] = (data['CurrentClose30'] / data['Close']) - 1
|
338 |
data['CurrentRange30'] = (data['CurrentHigh30'] - data['CurrentLow30']) / data['Close']
|
339 |
data['GapFill30'] = [low <= prev_close if gap > 0 else high >= prev_close for high, low, prev_close, gap in zip(data['CurrentHigh30'], data['CurrentLow30'], data['Close'], data['CurrentGap'])]
|
340 |
+
|
341 |
# Target -- the next day's low
|
342 |
data['Target'] = (data['OHLC4'] / data['PrevClose']) - 1
|
343 |
data['Target'] = data['Target'].shift(-1)
|
|
|
350 |
data['Quarter'] = data['DayOfWeek'].dt.quarter
|
351 |
data['DayOfWeek'] = data['DayOfWeek'].dt.weekday
|
352 |
|
353 |
+
# Calculate up
|
354 |
+
data['up'] = 100 * (data['High'].shift(1) - data['Open'].shift(1)) / data['Close'].shift(1)
|
355 |
+
|
356 |
+
# Calculate upSD
|
357 |
+
data['upSD'] = data['up'].rolling(30).std(ddof=0)
|
358 |
+
|
359 |
+
# Calculate aveUp
|
360 |
+
data['aveUp'] = data['up'].rolling(30).mean()
|
361 |
+
data['H1'] = data['Open'] + (data['aveUp'] / 100) * data['Open']
|
362 |
+
data['H2'] = data['Open'] + ((data['aveUp'] + data['upSD']) / 100) * data['Open']
|
363 |
+
data['down'] = 100 * (data['Open'].shift(1) - data['Low'].shift(1)) / data['Close'].shift(1)
|
364 |
+
data['downSD'] = data['down'].rolling(30).std(ddof=0)
|
365 |
+
data['aveDown'] = data['down'].rolling(30).mean()
|
366 |
+
data['L1'] = data['Open'] - (data['aveDown'] / 100) * data['Open']
|
367 |
+
data['L2'] = data['Open'] - ((data['aveDown'] + data['upSD']) / 100) * data['Open']
|
368 |
+
|
369 |
+
data = data.assign(
|
370 |
+
L1Touch = lambda x: x['Low'] < x['L1'],
|
371 |
+
L2Touch = lambda x: x['Low'] < x['L2'],
|
372 |
+
H1Touch = lambda x: x['High'] > x['H1'],
|
373 |
+
H2Touch = lambda x: x['High'] > x['H2'],
|
374 |
+
L1Break = lambda x: x['Close'] < x['L1'],
|
375 |
+
L2Break = lambda x: x['Close'] < x['L2'],
|
376 |
+
H1Break = lambda x: x['Close'] > x['H1'],
|
377 |
+
H2Break = lambda x: x['Close'] > x['H2'],
|
378 |
+
OpenL1 = lambda x: np.where(x['Open'] < x['L1'], 1, 0),
|
379 |
+
OpenL2 = lambda x: np.where(x['Open'] < x['L2'], 1, 0),
|
380 |
+
OpenH1 = lambda x: np.where(x['Open'] > x['H1'], 1, 0),
|
381 |
+
OpenH2 = lambda x: np.where(x['Open'] > x['H2'], 1, 0),
|
382 |
+
CloseL1 = lambda x: np.where(x['Close'] < x['L1'], 1, 0),
|
383 |
+
CloseL2 = lambda x: np.where(x['Close'] < x['L2'], 1, 0),
|
384 |
+
CloseH1 = lambda x: np.where(x['Close'] > x['H1'], 1, 0),
|
385 |
+
CloseH2 = lambda x: np.where(x['Close'] > x['H2'], 1, 0)
|
386 |
+
)
|
387 |
+
|
388 |
+
data['OpenL1'] = data['OpenL1'].shift(-1)
|
389 |
+
data['OpenL2'] = data['OpenL2'].shift(-1)
|
390 |
+
data['OpenH1'] = data['OpenH1'].shift(-1)
|
391 |
+
data['OpenH2'] = data['OpenH2'].shift(-1)
|
392 |
+
data['CloseL1'] = data['CloseL1'].shift(-1)
|
393 |
+
data['CloseL2'] = data['CloseL2'].shift(-1)
|
394 |
+
data['CloseH1'] = data['CloseH1'].shift(-1)
|
395 |
+
data['CloseH2'] = data['CloseH2'].shift(-1)
|
396 |
+
|
397 |
+
level_cols = [
|
398 |
+
'L1Touch',
|
399 |
+
'L2Touch',
|
400 |
+
'H1Touch',
|
401 |
+
'H2Touch',
|
402 |
+
'L1Break',
|
403 |
+
'L2Break',
|
404 |
+
'H1Break',
|
405 |
+
'H2Break'
|
406 |
+
]
|
407 |
+
|
408 |
+
for col in level_cols:
|
409 |
+
data[col+'Pct'] = data[col].rolling(100).mean()
|
410 |
+
data[col+'Pct'] = data[col+'Pct'].shift(-1)
|
411 |
+
|
412 |
+
|
413 |
+
def get_quintiles(df):
|
414 |
+
return df.groupby(pd.qcut(df['CurrentClose30toClose'], 5))['GreenDay'].mean()
|
415 |
+
|
416 |
+
probas = []
|
417 |
+
for i, pct in enumerate(data['CurrentClose30toClose']):
|
418 |
+
try:
|
419 |
+
df_q = get_quintiles(data.iloc[:i])
|
420 |
+
for q in df_q.index:
|
421 |
+
if q.left <= pct <= q.right:
|
422 |
+
p = df_q[q]
|
423 |
+
except:
|
424 |
+
p = None
|
425 |
+
|
426 |
+
probas.append(p)
|
427 |
+
|
428 |
+
data['GreenProbas'] = probas
|
429 |
+
|
430 |
for rid in tqdm(release_ids, desc='Merging econ data'):
|
431 |
# Get the name of the release
|
432 |
n = releases[rid]['name']
|
|
|
481 |
'OHLC4_VIX',
|
482 |
'OHLC4_VIX_n1',
|
483 |
'OHLC4_VIX_n2',
|
484 |
+
'OpenL1',
|
485 |
+
'OpenL2',
|
486 |
+
'OpenH1',
|
487 |
+
'OpenH2',
|
488 |
+
'L1TouchPct',
|
489 |
+
'L2TouchPct',
|
490 |
+
'H1TouchPct',
|
491 |
+
'H2TouchPct',
|
492 |
+
'L1BreakPct',
|
493 |
+
'L2BreakPct',
|
494 |
+
'H1BreakPct',
|
495 |
+
'H2BreakPct',
|
496 |
+
'GreenProbas',
|
497 |
'Target',
|
498 |
'Target_clf'
|
499 |
]]
|
model_90m.py
CHANGED
@@ -67,7 +67,20 @@ model_cols = [
|
|
67 |
'RangePct_n2',
|
68 |
'OHLC4_VIX',
|
69 |
'OHLC4_VIX_n1',
|
70 |
-
'OHLC4_VIX_n2'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
71 |
]
|
72 |
|
73 |
def walk_forward_validation_seq(df, target_column_clf, target_column_regr, num_training_rows, num_periods):
|
@@ -349,6 +362,69 @@ def get_data():
|
|
349 |
data['Quarter'] = data['DayOfWeek'].dt.quarter
|
350 |
data['DayOfWeek'] = data['DayOfWeek'].dt.weekday
|
351 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
352 |
for rid in tqdm(release_ids, desc='Merging econ data'):
|
353 |
# Get the name of the release
|
354 |
n = releases[rid]['name']
|
@@ -396,11 +472,6 @@ def get_data():
|
|
396 |
'CurrentClose30toClose',
|
397 |
'CurrentRange30',
|
398 |
'GapFill30',
|
399 |
-
# 'OHLC4_Trend',
|
400 |
-
# 'OHLC4_Trend_n1',
|
401 |
-
# 'OHLC4_Trend_n2',
|
402 |
-
# 'VIX5Day',
|
403 |
-
# 'VIX5Day_n1',
|
404 |
'CurrentGap',
|
405 |
'RangePct',
|
406 |
'RangePct_n1',
|
@@ -408,6 +479,19 @@ def get_data():
|
|
408 |
'OHLC4_VIX',
|
409 |
'OHLC4_VIX_n1',
|
410 |
'OHLC4_VIX_n2',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
411 |
'Target',
|
412 |
'Target_clf'
|
413 |
]]
|
|
|
67 |
'RangePct_n2',
|
68 |
'OHLC4_VIX',
|
69 |
'OHLC4_VIX_n1',
|
70 |
+
'OHLC4_VIX_n2',
|
71 |
+
'OpenL1',
|
72 |
+
'OpenL2',
|
73 |
+
'OpenH1',
|
74 |
+
'OpenH2',
|
75 |
+
'L1TouchPct',
|
76 |
+
'L2TouchPct',
|
77 |
+
'H1TouchPct',
|
78 |
+
'H2TouchPct',
|
79 |
+
'L1BreakPct',
|
80 |
+
'L2BreakPct',
|
81 |
+
'H1BreakPct',
|
82 |
+
'H2BreakPct',
|
83 |
+
'GreenProbas'
|
84 |
]
|
85 |
|
86 |
def walk_forward_validation_seq(df, target_column_clf, target_column_regr, num_training_rows, num_periods):
|
|
|
362 |
data['Quarter'] = data['DayOfWeek'].dt.quarter
|
363 |
data['DayOfWeek'] = data['DayOfWeek'].dt.weekday
|
364 |
|
365 |
+
# Calculate up
|
366 |
+
data['up'] = 100 * (data['High'].shift(1) - data['Open'].shift(1)) / data['Close'].shift(1)
|
367 |
+
|
368 |
+
# Calculate upSD
|
369 |
+
data['upSD'] = data['up'].rolling(30).std(ddof=0)
|
370 |
+
|
371 |
+
# Calculate aveUp
|
372 |
+
data['aveUp'] = data['up'].rolling(30).mean()
|
373 |
+
data['H1'] = data['Open'] + (data['aveUp'] / 100) * data['Open']
|
374 |
+
data['H2'] = data['Open'] + ((data['aveUp'] + data['upSD']) / 100) * data['Open']
|
375 |
+
data['down'] = 100 * (data['Open'].shift(1) - data['Low'].shift(1)) / data['Close'].shift(1)
|
376 |
+
data['downSD'] = data['down'].rolling(30).std(ddof=0)
|
377 |
+
data['aveDown'] = data['down'].rolling(30).mean()
|
378 |
+
data['L1'] = data['Open'] - (data['aveDown'] / 100) * data['Open']
|
379 |
+
data['L2'] = data['Open'] - ((data['aveDown'] + data['upSD']) / 100) * data['Open']
|
380 |
+
|
381 |
+
data = data.assign(
|
382 |
+
L1Touch = lambda x: x['Low'] < x['L1'],
|
383 |
+
L2Touch = lambda x: x['Low'] < x['L2'],
|
384 |
+
H1Touch = lambda x: x['High'] > x['H1'],
|
385 |
+
H2Touch = lambda x: x['High'] > x['H2'],
|
386 |
+
L1Break = lambda x: x['Close'] < x['L1'],
|
387 |
+
L2Break = lambda x: x['Close'] < x['L2'],
|
388 |
+
H1Break = lambda x: x['Close'] > x['H1'],
|
389 |
+
H2Break = lambda x: x['Close'] > x['H2'],
|
390 |
+
OpenL1 = lambda x: x['Open'] / x['L1'],
|
391 |
+
OpenL2 = lambda x: x['Open'] / x['L2'],
|
392 |
+
OpenH1 = lambda x: x['Open'] / x['H1'],
|
393 |
+
OpenH2 = lambda x: x['Open'] / x['H2']
|
394 |
+
)
|
395 |
+
|
396 |
+
level_cols = [
|
397 |
+
'L1Touch',
|
398 |
+
'L2Touch',
|
399 |
+
'H1Touch',
|
400 |
+
'H2Touch',
|
401 |
+
'L1Break',
|
402 |
+
'L2Break',
|
403 |
+
'H1Break',
|
404 |
+
'H2Break'
|
405 |
+
]
|
406 |
+
|
407 |
+
for col in level_cols:
|
408 |
+
data[col+'Pct'] = data[col].rolling(100).mean()
|
409 |
+
data[col+'Pct'] = data[col+'Pct'].shift(-1)
|
410 |
+
|
411 |
+
def get_quintiles(df):
|
412 |
+
return df.groupby(pd.qcut(df['CurrentClose30toClose'], 5))['GreenDay'].mean()
|
413 |
+
|
414 |
+
probas = []
|
415 |
+
for i, pct in enumerate(data['CurrentClose30toClose']):
|
416 |
+
try:
|
417 |
+
df_q = get_quintiles(data.iloc[:i])
|
418 |
+
for q in df_q.index:
|
419 |
+
if q.left <= pct <= q.right:
|
420 |
+
p = df_q[q]
|
421 |
+
except:
|
422 |
+
p = None
|
423 |
+
|
424 |
+
probas.append(p)
|
425 |
+
|
426 |
+
data['GreenProbas'] = probas
|
427 |
+
|
428 |
for rid in tqdm(release_ids, desc='Merging econ data'):
|
429 |
# Get the name of the release
|
430 |
n = releases[rid]['name']
|
|
|
472 |
'CurrentClose30toClose',
|
473 |
'CurrentRange30',
|
474 |
'GapFill30',
|
|
|
|
|
|
|
|
|
|
|
475 |
'CurrentGap',
|
476 |
'RangePct',
|
477 |
'RangePct_n1',
|
|
|
479 |
'OHLC4_VIX',
|
480 |
'OHLC4_VIX_n1',
|
481 |
'OHLC4_VIX_n2',
|
482 |
+
'OpenL1',
|
483 |
+
'OpenL2',
|
484 |
+
'OpenH1',
|
485 |
+
'OpenH2',
|
486 |
+
'L1TouchPct',
|
487 |
+
'L2TouchPct',
|
488 |
+
'H1TouchPct',
|
489 |
+
'H2TouchPct',
|
490 |
+
'L1BreakPct',
|
491 |
+
'L2BreakPct',
|
492 |
+
'H1BreakPct',
|
493 |
+
'H2BreakPct',
|
494 |
+
'GreenProbas',
|
495 |
'Target',
|
496 |
'Target_clf'
|
497 |
]]
|
model_day.py
CHANGED
@@ -61,7 +61,19 @@ model_cols = [
|
|
61 |
'RangePct_n2',
|
62 |
'OHLC4_VIX',
|
63 |
'OHLC4_VIX_n1',
|
64 |
-
'OHLC4_VIX_n2'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
]
|
66 |
|
67 |
def walk_forward_validation_seq(df, target_column_clf, target_column_regr, num_training_rows, num_periods):
|
@@ -262,6 +274,51 @@ def get_data():
|
|
262 |
data['DayOfWeek'] = pd.to_datetime(data.index)
|
263 |
data['DayOfWeek'] = data['DayOfWeek'].dt.day
|
264 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
265 |
# Target -- the next day's low
|
266 |
data['Target'] = (data['OHLC4'] / data['PrevClose']) - 1
|
267 |
data['Target'] = data['Target'].shift(-1)
|
@@ -323,6 +380,18 @@ def get_data():
|
|
323 |
'OHLC4_VIX',
|
324 |
'OHLC4_VIX_n1',
|
325 |
'OHLC4_VIX_n2',
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
326 |
'Target',
|
327 |
'Target_clf'
|
328 |
]]
|
|
|
61 |
'RangePct_n2',
|
62 |
'OHLC4_VIX',
|
63 |
'OHLC4_VIX_n1',
|
64 |
+
'OHLC4_VIX_n2',
|
65 |
+
'OpenL1',
|
66 |
+
'OpenL2',
|
67 |
+
'OpenH1',
|
68 |
+
'OpenH2',
|
69 |
+
'L1TouchPct',
|
70 |
+
'L2TouchPct',
|
71 |
+
'H1TouchPct',
|
72 |
+
'H2TouchPct',
|
73 |
+
'L1BreakPct',
|
74 |
+
'L2BreakPct',
|
75 |
+
'H1BreakPct',
|
76 |
+
'H2BreakPct'
|
77 |
]
|
78 |
|
79 |
def walk_forward_validation_seq(df, target_column_clf, target_column_regr, num_training_rows, num_periods):
|
|
|
274 |
data['DayOfWeek'] = pd.to_datetime(data.index)
|
275 |
data['DayOfWeek'] = data['DayOfWeek'].dt.day
|
276 |
|
277 |
+
# Calculate up
|
278 |
+
data['up'] = 100 * (data['High'].shift(1) - data['Open'].shift(1)) / data['Close'].shift(1)
|
279 |
+
|
280 |
+
# Calculate upSD
|
281 |
+
data['upSD'] = data['up'].rolling(30).std(ddof=0)
|
282 |
+
|
283 |
+
# Calculate aveUp
|
284 |
+
data['aveUp'] = data['up'].rolling(30).mean()
|
285 |
+
data['H1'] = data['Open'] + (data['aveUp'] / 100) * data['Open']
|
286 |
+
data['H2'] = data['Open'] + ((data['aveUp'] + data['upSD']) / 100) * data['Open']
|
287 |
+
data['down'] = 100 * (data['Open'].shift(1) - data['Low'].shift(1)) / data['Close'].shift(1)
|
288 |
+
data['downSD'] = data['down'].rolling(30).std(ddof=0)
|
289 |
+
data['aveDown'] = data['down'].rolling(30).mean()
|
290 |
+
data['L1'] = data['Open'] - (data['aveDown'] / 100) * data['Open']
|
291 |
+
data['L2'] = data['Open'] - ((data['aveDown'] + data['upSD']) / 100) * data['Open']
|
292 |
+
|
293 |
+
data = data.assign(
|
294 |
+
L1Touch = lambda x: x['Low'] < x['L1'],
|
295 |
+
L2Touch = lambda x: x['Low'] < x['L2'],
|
296 |
+
H1Touch = lambda x: x['High'] > x['H1'],
|
297 |
+
H2Touch = lambda x: x['High'] > x['H2'],
|
298 |
+
L1Break = lambda x: x['Close'] < x['L1'],
|
299 |
+
L2Break = lambda x: x['Close'] < x['L2'],
|
300 |
+
H1Break = lambda x: x['Close'] > x['H1'],
|
301 |
+
H2Break = lambda x: x['Close'] > x['H2'],
|
302 |
+
OpenL1 = lambda x: x['Open'] / x['L1'],
|
303 |
+
OpenL2 = lambda x: x['Open'] / x['L2'],
|
304 |
+
OpenH1 = lambda x: x['Open'] / x['H1'],
|
305 |
+
OpenH2 = lambda x: x['Open'] / x['H2']
|
306 |
+
)
|
307 |
+
|
308 |
+
level_cols = [
|
309 |
+
'L1Touch',
|
310 |
+
'L2Touch',
|
311 |
+
'H1Touch',
|
312 |
+
'H2Touch',
|
313 |
+
'L1Break',
|
314 |
+
'L2Break',
|
315 |
+
'H1Break',
|
316 |
+
'H2Break'
|
317 |
+
]
|
318 |
+
|
319 |
+
for col in level_cols:
|
320 |
+
data[col+'Pct'] = data[col].expanding().sum() / data[col].expanding().apply(len)
|
321 |
+
|
322 |
# Target -- the next day's low
|
323 |
data['Target'] = (data['OHLC4'] / data['PrevClose']) - 1
|
324 |
data['Target'] = data['Target'].shift(-1)
|
|
|
380 |
'OHLC4_VIX',
|
381 |
'OHLC4_VIX_n1',
|
382 |
'OHLC4_VIX_n2',
|
383 |
+
'OpenL1',
|
384 |
+
'OpenL2',
|
385 |
+
'OpenH1',
|
386 |
+
'OpenH2',
|
387 |
+
'L1TouchPct',
|
388 |
+
'L2TouchPct',
|
389 |
+
'H1TouchPct',
|
390 |
+
'H2TouchPct',
|
391 |
+
'L1BreakPct',
|
392 |
+
'L2BreakPct',
|
393 |
+
'H1BreakPct',
|
394 |
+
'H2BreakPct',
|
395 |
'Target',
|
396 |
'Target_clf'
|
397 |
]]
|
troubleshoot_day_model.ipynb
CHANGED
@@ -8,7 +8,7 @@
|
|
8 |
"source": [
|
9 |
"import pandas as pd\n",
|
10 |
"import numpy as np\n",
|
11 |
-
"from
|
12 |
]
|
13 |
},
|
14 |
{
|
@@ -20,11 +20,10 @@
|
|
20 |
"name": "stderr",
|
21 |
"output_type": "stream",
|
22 |
"text": [
|
23 |
-
"getting econ tickers: 100%|ββββββββββ| 3/3 [00:00<00:00,
|
24 |
-
"Getting release dates: 100%|ββββββββββ| 8/8 [00:01<00:00, 5.
|
25 |
-
"Making indicators: 100%|ββββββββββ| 8/8 [00:00<00:00,
|
26 |
-
"
|
27 |
-
"Merging econ data: 100%|ββββββββββ| 8/8 [00:00<00:00, 999.09it/s]\n"
|
28 |
]
|
29 |
}
|
30 |
],
|
@@ -34,7 +33,14 @@
|
|
34 |
},
|
35 |
{
|
36 |
"cell_type": "code",
|
37 |
-
"execution_count":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
"metadata": {},
|
39 |
"outputs": [],
|
40 |
"source": [
|
@@ -46,21 +52,21 @@
|
|
46 |
},
|
47 |
{
|
48 |
"cell_type": "code",
|
49 |
-
"execution_count":
|
50 |
"metadata": {},
|
51 |
"outputs": [
|
52 |
{
|
53 |
"name": "stderr",
|
54 |
"output_type": "stream",
|
55 |
"text": [
|
56 |
-
"LR Model: 100%|ββββββββββ|
|
57 |
-
"d:\\Projects\\gamedayspx\\
|
58 |
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
|
59 |
"Try using .loc[row_indexer,col_indexer] = value instead\n",
|
60 |
"\n",
|
61 |
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
|
62 |
" for_merge['RegrModelOut'] = for_merge['RegrModelOut'] > 0\n",
|
63 |
-
"CLF Model: 100%|ββββββββββ|
|
64 |
]
|
65 |
}
|
66 |
],
|
@@ -70,7 +76,7 @@
|
|
70 |
},
|
71 |
{
|
72 |
"cell_type": "code",
|
73 |
-
"execution_count":
|
74 |
"metadata": {},
|
75 |
"outputs": [],
|
76 |
"source": [
|
@@ -161,7 +167,7 @@
|
|
161 |
},
|
162 |
{
|
163 |
"cell_type": "code",
|
164 |
-
"execution_count":
|
165 |
"metadata": {},
|
166 |
"outputs": [
|
167 |
{
|
@@ -185,12 +191,14 @@
|
|
185 |
" <thead>\n",
|
186 |
" <tr style=\"text-align: right;\">\n",
|
187 |
" <th></th>\n",
|
188 |
-
" <th>
|
189 |
-
" <th>
|
190 |
-
" <th>
|
|
|
191 |
" </tr>\n",
|
192 |
" <tr>\n",
|
193 |
-
" <th>
|
|
|
194 |
" <th></th>\n",
|
195 |
" <th></th>\n",
|
196 |
" <th></th>\n",
|
@@ -198,75 +206,211 @@
|
|
198 |
" </thead>\n",
|
199 |
" <tbody>\n",
|
200 |
" <tr>\n",
|
201 |
-
" <th>
|
202 |
-
" <td>
|
203 |
-
" <td>
|
204 |
-
" <td
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
205 |
" </tr>\n",
|
206 |
" <tr>\n",
|
207 |
-
" <th>
|
208 |
-
" <td>
|
209 |
-
" <td>
|
210 |
-
" <td
|
|
|
211 |
" </tr>\n",
|
212 |
" <tr>\n",
|
213 |
-
" <th>
|
214 |
-
" <td>
|
215 |
-
" <td>
|
216 |
-
" <td
|
|
|
217 |
" </tr>\n",
|
218 |
" <tr>\n",
|
219 |
-
" <th>
|
220 |
-
" <td>
|
221 |
-
" <td>
|
222 |
-
" <td
|
|
|
223 |
" </tr>\n",
|
224 |
" <tr>\n",
|
225 |
-
" <th>
|
226 |
-
" <td>
|
227 |
-
" <td>
|
228 |
-
" <td
|
|
|
229 |
" </tr>\n",
|
230 |
" <tr>\n",
|
231 |
-
" <th>
|
232 |
-
" <td>
|
233 |
-
" <td>
|
234 |
-
" <td
|
|
|
235 |
" </tr>\n",
|
236 |
" <tr>\n",
|
237 |
-
" <th>
|
238 |
-
" <td>
|
239 |
-
" <td>
|
240 |
-
" <td
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
241 |
" </tr>\n",
|
242 |
" </tbody>\n",
|
243 |
"</table>\n",
|
244 |
"</div>"
|
245 |
],
|
246 |
"text/plain": [
|
247 |
-
"
|
248 |
-
"
|
249 |
-
"
|
250 |
-
"
|
251 |
-
"
|
252 |
-
"
|
253 |
-
"
|
254 |
-
"
|
255 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
256 |
]
|
257 |
},
|
258 |
-
"execution_count":
|
259 |
"metadata": {},
|
260 |
"output_type": "execute_result"
|
261 |
}
|
262 |
],
|
263 |
"source": [
|
264 |
-
"
|
265 |
]
|
266 |
},
|
267 |
{
|
268 |
"cell_type": "code",
|
269 |
-
"execution_count":
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
270 |
"metadata": {},
|
271 |
"outputs": [
|
272 |
{
|
@@ -297,23 +441,23 @@
|
|
297 |
" <tbody>\n",
|
298 |
" <tr>\n",
|
299 |
" <th>N</th>\n",
|
300 |
-
" <td>
|
301 |
-
" <td>
|
302 |
" </tr>\n",
|
303 |
" <tr>\n",
|
304 |
" <th>ROC AUC</th>\n",
|
305 |
-
" <td>0.
|
306 |
-
" <td>0.
|
307 |
" </tr>\n",
|
308 |
" <tr>\n",
|
309 |
" <th>Precision</th>\n",
|
310 |
-
" <td>0.
|
311 |
-
" <td>0.
|
312 |
" </tr>\n",
|
313 |
" <tr>\n",
|
314 |
" <th>Recall</th>\n",
|
315 |
-
" <td>0.
|
316 |
-
" <td>0.
|
317 |
" </tr>\n",
|
318 |
" </tbody>\n",
|
319 |
"</table>\n",
|
@@ -321,13 +465,13 @@
|
|
321 |
],
|
322 |
"text/plain": [
|
323 |
" All High Confidence\n",
|
324 |
-
"N
|
325 |
-
"ROC AUC 0.
|
326 |
-
"Precision 0.
|
327 |
-
"Recall 0.
|
328 |
]
|
329 |
},
|
330 |
-
"execution_count":
|
331 |
"metadata": {},
|
332 |
"output_type": "execute_result"
|
333 |
}
|
@@ -336,15 +480,6 @@
|
|
336 |
"df_performance"
|
337 |
]
|
338 |
},
|
339 |
-
{
|
340 |
-
"cell_type": "code",
|
341 |
-
"execution_count": null,
|
342 |
-
"metadata": {},
|
343 |
-
"outputs": [],
|
344 |
-
"source": [
|
345 |
-
"perf_daily.tail(20)"
|
346 |
-
]
|
347 |
-
},
|
348 |
{
|
349 |
"cell_type": "code",
|
350 |
"execution_count": null,
|
@@ -358,7 +493,7 @@
|
|
358 |
"\n",
|
359 |
"df = plot_data.copy()\n",
|
360 |
"\n",
|
361 |
-
"y_min = df['Low'].tail(50).min()\n",
|
362 |
"y_max = df['High'].tail(50).max()\n",
|
363 |
"\n",
|
364 |
"increasing_color = '#3399ff' # Blue\n",
|
@@ -415,6 +550,22 @@
|
|
415 |
"fig.show()\n"
|
416 |
]
|
417 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
418 |
{
|
419 |
"cell_type": "code",
|
420 |
"execution_count": null,
|
|
|
8 |
"source": [
|
9 |
"import pandas as pd\n",
|
10 |
"import numpy as np\n",
|
11 |
+
"from model_day import get_data, walk_forward_validation_seq"
|
12 |
]
|
13 |
},
|
14 |
{
|
|
|
20 |
"name": "stderr",
|
21 |
"output_type": "stream",
|
22 |
"text": [
|
23 |
+
"getting econ tickers: 100%|ββββββββββ| 3/3 [00:00<00:00, 6.56it/s]\n",
|
24 |
+
"Getting release dates: 100%|ββββββββββ| 8/8 [00:01<00:00, 5.08it/s]\n",
|
25 |
+
"Making indicators: 100%|ββββββββββ| 8/8 [00:00<00:00, 2664.11it/s]\n",
|
26 |
+
"Merging econ data: 100%|ββββββββββ| 8/8 [00:00<00:00, 1010.95it/s]\n"
|
|
|
27 |
]
|
28 |
}
|
29 |
],
|
|
|
33 |
},
|
34 |
{
|
35 |
"cell_type": "code",
|
36 |
+
"execution_count": null,
|
37 |
+
"metadata": {},
|
38 |
+
"outputs": [],
|
39 |
+
"source": []
|
40 |
+
},
|
41 |
+
{
|
42 |
+
"cell_type": "code",
|
43 |
+
"execution_count": 4,
|
44 |
"metadata": {},
|
45 |
"outputs": [],
|
46 |
"source": [
|
|
|
52 |
},
|
53 |
{
|
54 |
"cell_type": "code",
|
55 |
+
"execution_count": 5,
|
56 |
"metadata": {},
|
57 |
"outputs": [
|
58 |
{
|
59 |
"name": "stderr",
|
60 |
"output_type": "stream",
|
61 |
"text": [
|
62 |
+
"LR Model: 100%|ββββββββββ| 1195/1195 [00:03<00:00, 347.11it/s]\n",
|
63 |
+
"d:\\Projects\\gamedayspx\\model_day.py:88: SettingWithCopyWarning: \n",
|
64 |
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
|
65 |
"Try using .loc[row_indexer,col_indexer] = value instead\n",
|
66 |
"\n",
|
67 |
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
|
68 |
" for_merge['RegrModelOut'] = for_merge['RegrModelOut'] > 0\n",
|
69 |
+
"CLF Model: 100%|ββββββββββ| 1095/1095 [00:08<00:00, 129.89it/s]\n"
|
70 |
]
|
71 |
}
|
72 |
],
|
|
|
76 |
},
|
77 |
{
|
78 |
"cell_type": "code",
|
79 |
+
"execution_count": 6,
|
80 |
"metadata": {},
|
81 |
"outputs": [],
|
82 |
"source": [
|
|
|
167 |
},
|
168 |
{
|
169 |
"cell_type": "code",
|
170 |
+
"execution_count": 7,
|
171 |
"metadata": {},
|
172 |
"outputs": [
|
173 |
{
|
|
|
191 |
" <thead>\n",
|
192 |
" <tr style=\"text-align: right;\">\n",
|
193 |
" <th></th>\n",
|
194 |
+
" <th>True</th>\n",
|
195 |
+
" <th>Predicted</th>\n",
|
196 |
+
" <th>Accuracy</th>\n",
|
197 |
+
" <th>HTML</th>\n",
|
198 |
" </tr>\n",
|
199 |
" <tr>\n",
|
200 |
+
" <th>index</th>\n",
|
201 |
+
" <th></th>\n",
|
202 |
" <th></th>\n",
|
203 |
" <th></th>\n",
|
204 |
" <th></th>\n",
|
|
|
206 |
" </thead>\n",
|
207 |
" <tbody>\n",
|
208 |
" <tr>\n",
|
209 |
+
" <th>2023-09-08</th>\n",
|
210 |
+
" <td>True</td>\n",
|
211 |
+
" <td>0.757584</td>\n",
|
212 |
+
" <td>β
</td>\n",
|
213 |
+
" <td>&#9989;</td>\n",
|
214 |
+
" </tr>\n",
|
215 |
+
" <tr>\n",
|
216 |
+
" <th>2023-09-11</th>\n",
|
217 |
+
" <td>False</td>\n",
|
218 |
+
" <td>0.300308</td>\n",
|
219 |
+
" <td>β
</td>\n",
|
220 |
+
" <td>&#9989;</td>\n",
|
221 |
+
" </tr>\n",
|
222 |
+
" <tr>\n",
|
223 |
+
" <th>2023-09-12</th>\n",
|
224 |
+
" <td>True</td>\n",
|
225 |
+
" <td>0.542126</td>\n",
|
226 |
+
" <td>π¨</td>\n",
|
227 |
+
" <td>&#11036;</td>\n",
|
228 |
+
" </tr>\n",
|
229 |
+
" <tr>\n",
|
230 |
+
" <th>2023-09-13</th>\n",
|
231 |
+
" <td>True</td>\n",
|
232 |
+
" <td>0.749427</td>\n",
|
233 |
+
" <td>β
</td>\n",
|
234 |
+
" <td>&#9989;</td>\n",
|
235 |
+
" </tr>\n",
|
236 |
+
" <tr>\n",
|
237 |
+
" <th>2023-09-14</th>\n",
|
238 |
+
" <td>False</td>\n",
|
239 |
+
" <td>0.385973</td>\n",
|
240 |
+
" <td>β
</td>\n",
|
241 |
+
" <td>&#9989;</td>\n",
|
242 |
+
" </tr>\n",
|
243 |
+
" <tr>\n",
|
244 |
+
" <th>2023-09-15</th>\n",
|
245 |
+
" <td>True</td>\n",
|
246 |
+
" <td>0.326088</td>\n",
|
247 |
+
" <td>β</td>\n",
|
248 |
+
" <td>&#10060;</td>\n",
|
249 |
" </tr>\n",
|
250 |
" <tr>\n",
|
251 |
+
" <th>2023-09-18</th>\n",
|
252 |
+
" <td>False</td>\n",
|
253 |
+
" <td>0.341849</td>\n",
|
254 |
+
" <td>β
</td>\n",
|
255 |
+
" <td>&#9989;</td>\n",
|
256 |
" </tr>\n",
|
257 |
" <tr>\n",
|
258 |
+
" <th>2023-09-19</th>\n",
|
259 |
+
" <td>False</td>\n",
|
260 |
+
" <td>0.687576</td>\n",
|
261 |
+
" <td>β</td>\n",
|
262 |
+
" <td>&#10060;</td>\n",
|
263 |
" </tr>\n",
|
264 |
" <tr>\n",
|
265 |
+
" <th>2023-09-20</th>\n",
|
266 |
+
" <td>False</td>\n",
|
267 |
+
" <td>0.209737</td>\n",
|
268 |
+
" <td>β
</td>\n",
|
269 |
+
" <td>&#9989;</td>\n",
|
270 |
" </tr>\n",
|
271 |
" <tr>\n",
|
272 |
+
" <th>2023-09-21</th>\n",
|
273 |
+
" <td>False</td>\n",
|
274 |
+
" <td>0.477048</td>\n",
|
275 |
+
" <td>π¨</td>\n",
|
276 |
+
" <td>&#11036;</td>\n",
|
277 |
" </tr>\n",
|
278 |
" <tr>\n",
|
279 |
+
" <th>2023-09-22</th>\n",
|
280 |
+
" <td>True</td>\n",
|
281 |
+
" <td>0.381210</td>\n",
|
282 |
+
" <td>β</td>\n",
|
283 |
+
" <td>&#10060;</td>\n",
|
284 |
" </tr>\n",
|
285 |
" <tr>\n",
|
286 |
+
" <th>2023-09-25</th>\n",
|
287 |
+
" <td>False</td>\n",
|
288 |
+
" <td>0.306969</td>\n",
|
289 |
+
" <td>β
</td>\n",
|
290 |
+
" <td>&#9989;</td>\n",
|
291 |
+
" </tr>\n",
|
292 |
+
" <tr>\n",
|
293 |
+
" <th>2023-09-26</th>\n",
|
294 |
+
" <td>True</td>\n",
|
295 |
+
" <td>0.437918</td>\n",
|
296 |
+
" <td>π¨</td>\n",
|
297 |
+
" <td>&#11036;</td>\n",
|
298 |
+
" </tr>\n",
|
299 |
+
" <tr>\n",
|
300 |
+
" <th>2023-09-27</th>\n",
|
301 |
+
" <td>True</td>\n",
|
302 |
+
" <td>0.502720</td>\n",
|
303 |
+
" <td>π¨</td>\n",
|
304 |
+
" <td>&#11036;</td>\n",
|
305 |
+
" </tr>\n",
|
306 |
+
" <tr>\n",
|
307 |
+
" <th>2023-09-28</th>\n",
|
308 |
+
" <td>False</td>\n",
|
309 |
+
" <td>0.772822</td>\n",
|
310 |
+
" <td>β</td>\n",
|
311 |
+
" <td>&#10060;</td>\n",
|
312 |
+
" </tr>\n",
|
313 |
+
" <tr>\n",
|
314 |
+
" <th>2023-09-29</th>\n",
|
315 |
+
" <td>True</td>\n",
|
316 |
+
" <td>0.456547</td>\n",
|
317 |
+
" <td>π¨</td>\n",
|
318 |
+
" <td>&#11036;</td>\n",
|
319 |
+
" </tr>\n",
|
320 |
+
" <tr>\n",
|
321 |
+
" <th>2023-10-02</th>\n",
|
322 |
+
" <td>False</td>\n",
|
323 |
+
" <td>0.278969</td>\n",
|
324 |
+
" <td>β
</td>\n",
|
325 |
+
" <td>&#9989;</td>\n",
|
326 |
+
" </tr>\n",
|
327 |
+
" <tr>\n",
|
328 |
+
" <th>2023-10-03</th>\n",
|
329 |
+
" <td>True</td>\n",
|
330 |
+
" <td>0.597911</td>\n",
|
331 |
+
" <td>π¨</td>\n",
|
332 |
+
" <td>&#11036;</td>\n",
|
333 |
+
" </tr>\n",
|
334 |
+
" <tr>\n",
|
335 |
+
" <th>2023-10-04</th>\n",
|
336 |
+
" <td>False</td>\n",
|
337 |
+
" <td>0.504107</td>\n",
|
338 |
+
" <td>π¨</td>\n",
|
339 |
+
" <td>&#11036;</td>\n",
|
340 |
+
" </tr>\n",
|
341 |
+
" <tr>\n",
|
342 |
+
" <th>2023-10-05</th>\n",
|
343 |
+
" <td>True</td>\n",
|
344 |
+
" <td>0.399995</td>\n",
|
345 |
+
" <td>β</td>\n",
|
346 |
+
" <td>&#10060;</td>\n",
|
347 |
" </tr>\n",
|
348 |
" </tbody>\n",
|
349 |
"</table>\n",
|
350 |
"</div>"
|
351 |
],
|
352 |
"text/plain": [
|
353 |
+
" True Predicted Accuracy HTML\n",
|
354 |
+
"index \n",
|
355 |
+
"2023-09-08 True 0.757584 β
✅\n",
|
356 |
+
"2023-09-11 False 0.300308 β
✅\n",
|
357 |
+
"2023-09-12 True 0.542126 π¨ ⬜\n",
|
358 |
+
"2023-09-13 True 0.749427 β
✅\n",
|
359 |
+
"2023-09-14 False 0.385973 β
✅\n",
|
360 |
+
"2023-09-15 True 0.326088 β ❌\n",
|
361 |
+
"2023-09-18 False 0.341849 β
✅\n",
|
362 |
+
"2023-09-19 False 0.687576 β ❌\n",
|
363 |
+
"2023-09-20 False 0.209737 β
✅\n",
|
364 |
+
"2023-09-21 False 0.477048 π¨ ⬜\n",
|
365 |
+
"2023-09-22 True 0.381210 β ❌\n",
|
366 |
+
"2023-09-25 False 0.306969 β
✅\n",
|
367 |
+
"2023-09-26 True 0.437918 π¨ ⬜\n",
|
368 |
+
"2023-09-27 True 0.502720 π¨ ⬜\n",
|
369 |
+
"2023-09-28 False 0.772822 β ❌\n",
|
370 |
+
"2023-09-29 True 0.456547 π¨ ⬜\n",
|
371 |
+
"2023-10-02 False 0.278969 β
✅\n",
|
372 |
+
"2023-10-03 True 0.597911 π¨ ⬜\n",
|
373 |
+
"2023-10-04 False 0.504107 π¨ ⬜\n",
|
374 |
+
"2023-10-05 True 0.399995 β ❌"
|
375 |
]
|
376 |
},
|
377 |
+
"execution_count": 7,
|
378 |
"metadata": {},
|
379 |
"output_type": "execute_result"
|
380 |
}
|
381 |
],
|
382 |
"source": [
|
383 |
+
"perf_daily.tail(20)"
|
384 |
]
|
385 |
},
|
386 |
{
|
387 |
"cell_type": "code",
|
388 |
+
"execution_count": 8,
|
389 |
+
"metadata": {},
|
390 |
+
"outputs": [
|
391 |
+
{
|
392 |
+
"data": {
|
393 |
+
"text/plain": [
|
394 |
+
"157"
|
395 |
+
]
|
396 |
+
},
|
397 |
+
"execution_count": 8,
|
398 |
+
"metadata": {},
|
399 |
+
"output_type": "execute_result"
|
400 |
+
}
|
401 |
+
],
|
402 |
+
"source": [
|
403 |
+
"df_probas.loc[df_probas.index[0], 'NumObs']"
|
404 |
+
]
|
405 |
+
},
|
406 |
+
{
|
407 |
+
"cell_type": "markdown",
|
408 |
+
"metadata": {},
|
409 |
+
"source": []
|
410 |
+
},
|
411 |
+
{
|
412 |
+
"cell_type": "code",
|
413 |
+
"execution_count": 9,
|
414 |
"metadata": {},
|
415 |
"outputs": [
|
416 |
{
|
|
|
441 |
" <tbody>\n",
|
442 |
" <tr>\n",
|
443 |
" <th>N</th>\n",
|
444 |
+
" <td>1095.00</td>\n",
|
445 |
+
" <td>743.00</td>\n",
|
446 |
" </tr>\n",
|
447 |
" <tr>\n",
|
448 |
" <th>ROC AUC</th>\n",
|
449 |
+
" <td>0.74</td>\n",
|
450 |
+
" <td>0.77</td>\n",
|
451 |
" </tr>\n",
|
452 |
" <tr>\n",
|
453 |
" <th>Precision</th>\n",
|
454 |
+
" <td>0.68</td>\n",
|
455 |
+
" <td>0.74</td>\n",
|
456 |
" </tr>\n",
|
457 |
" <tr>\n",
|
458 |
" <th>Recall</th>\n",
|
459 |
+
" <td>0.75</td>\n",
|
460 |
+
" <td>0.83</td>\n",
|
461 |
" </tr>\n",
|
462 |
" </tbody>\n",
|
463 |
"</table>\n",
|
|
|
465 |
],
|
466 |
"text/plain": [
|
467 |
" All High Confidence\n",
|
468 |
+
"N 1095.00 743.00\n",
|
469 |
+
"ROC AUC 0.74 0.77\n",
|
470 |
+
"Precision 0.68 0.74\n",
|
471 |
+
"Recall 0.75 0.83"
|
472 |
]
|
473 |
},
|
474 |
+
"execution_count": 9,
|
475 |
"metadata": {},
|
476 |
"output_type": "execute_result"
|
477 |
}
|
|
|
480 |
"df_performance"
|
481 |
]
|
482 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
483 |
{
|
484 |
"cell_type": "code",
|
485 |
"execution_count": null,
|
|
|
493 |
"\n",
|
494 |
"df = plot_data.copy()\n",
|
495 |
"\n",
|
496 |
+
"y_min = df['Low'].tail(50).min() - 50\n",
|
497 |
"y_max = df['High'].tail(50).max()\n",
|
498 |
"\n",
|
499 |
"increasing_color = '#3399ff' # Blue\n",
|
|
|
550 |
"fig.show()\n"
|
551 |
]
|
552 |
},
|
553 |
+
{
|
554 |
+
"cell_type": "code",
|
555 |
+
"execution_count": null,
|
556 |
+
"metadata": {},
|
557 |
+
"outputs": [],
|
558 |
+
"source": [
|
559 |
+
"XXX"
|
560 |
+
]
|
561 |
+
},
|
562 |
+
{
|
563 |
+
"cell_type": "code",
|
564 |
+
"execution_count": null,
|
565 |
+
"metadata": {},
|
566 |
+
"outputs": [],
|
567 |
+
"source": []
|
568 |
+
},
|
569 |
{
|
570 |
"cell_type": "code",
|
571 |
"execution_count": null,
|