wnstnb commited on
Commit
6e08397
Β·
1 Parent(s): 614a841

new features for models + levels

Browse files
Files changed (5) hide show
  1. model_1h.py +90 -6
  2. model_30m.py +107 -2
  3. model_90m.py +90 -6
  4. model_day.py +70 -1
  5. 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 model_30m import get_data, walk_forward_validation_seq"
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, 4.25it/s]\n",
24
- "Getting release dates: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 8/8 [00:01<00:00, 5.09it/s]\n",
25
- "Making indicators: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 8/8 [00:00<00:00, 3996.48it/s]\n",
26
- "Found cached dataset text (C:/Users/WINSTON-ITX/.cache/huggingface/datasets/boomsss___text/boomsss--spx_intra-e0e5e7af8fd43022/0.0.0/cb1e9bd71a82ad27976be3b12b407850fe2837d80c22c5e03a28949843a8ace2)\n",
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": 3,
 
 
 
 
 
 
 
38
  "metadata": {},
39
  "outputs": [],
40
  "source": [
@@ -46,21 +52,21 @@
46
  },
47
  {
48
  "cell_type": "code",
49
- "execution_count": 8,
50
  "metadata": {},
51
  "outputs": [
52
  {
53
  "name": "stderr",
54
  "output_type": "stream",
55
  "text": [
56
- "LR Model: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 1223/1223 [00:03<00:00, 367.50it/s]\n",
57
- "d:\\Projects\\gamedayspx\\model_30m.py:83: SettingWithCopyWarning: \n",
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%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 1123/1123 [00:08<00:00, 135.03it/s]\n"
64
  ]
65
  }
66
  ],
@@ -70,7 +76,7 @@
70
  },
71
  {
72
  "cell_type": "code",
73
- "execution_count": 9,
74
  "metadata": {},
75
  "outputs": [],
76
  "source": [
@@ -161,7 +167,7 @@
161
  },
162
  {
163
  "cell_type": "code",
164
- "execution_count": 10,
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>PctGreen</th>\n",
189
- " <th>NumObs</th>\n",
190
- " <th>NumGreen</th>\n",
 
191
  " </tr>\n",
192
  " <tr>\n",
193
- " <th>Predicted</th>\n",
 
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>(0.19, 0.323]</th>\n",
202
- " <td>0.149068</td>\n",
203
- " <td>161</td>\n",
204
- " <td>24</td>\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
205
  " </tr>\n",
206
  " <tr>\n",
207
- " <th>(0.323, 0.423]</th>\n",
208
- " <td>0.225000</td>\n",
209
- " <td>160</td>\n",
210
- " <td>36</td>\n",
 
211
  " </tr>\n",
212
  " <tr>\n",
213
- " <th>(0.423, 0.527]</th>\n",
214
- " <td>0.450000</td>\n",
215
- " <td>160</td>\n",
216
- " <td>72</td>\n",
 
217
  " </tr>\n",
218
  " <tr>\n",
219
- " <th>(0.527, 0.634]</th>\n",
220
- " <td>0.602484</td>\n",
221
- " <td>161</td>\n",
222
- " <td>97</td>\n",
 
223
  " </tr>\n",
224
  " <tr>\n",
225
- " <th>(0.634, 0.707]</th>\n",
226
- " <td>0.681250</td>\n",
227
- " <td>160</td>\n",
228
- " <td>109</td>\n",
 
229
  " </tr>\n",
230
  " <tr>\n",
231
- " <th>(0.707, 0.773]</th>\n",
232
- " <td>0.768750</td>\n",
233
- " <td>160</td>\n",
234
- " <td>123</td>\n",
 
235
  " </tr>\n",
236
  " <tr>\n",
237
- " <th>(0.773, 0.852]</th>\n",
238
- " <td>0.838509</td>\n",
239
- " <td>161</td>\n",
240
- " <td>135</td>\n",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241
  " </tr>\n",
242
  " </tbody>\n",
243
  "</table>\n",
244
  "</div>"
245
  ],
246
  "text/plain": [
247
- " PctGreen NumObs NumGreen\n",
248
- "Predicted \n",
249
- "(0.19, 0.323] 0.149068 161 24\n",
250
- "(0.323, 0.423] 0.225000 160 36\n",
251
- "(0.423, 0.527] 0.450000 160 72\n",
252
- "(0.527, 0.634] 0.602484 161 97\n",
253
- "(0.634, 0.707] 0.681250 160 109\n",
254
- "(0.707, 0.773] 0.768750 160 123\n",
255
- "(0.773, 0.852] 0.838509 161 135"
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  ]
257
  },
258
- "execution_count": 10,
259
  "metadata": {},
260
  "output_type": "execute_result"
261
  }
262
  ],
263
  "source": [
264
- "df_probas"
265
  ]
266
  },
267
  {
268
  "cell_type": "code",
269
- "execution_count": 7,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
270
  "metadata": {},
271
  "outputs": [
272
  {
@@ -297,23 +441,23 @@
297
  " <tbody>\n",
298
  " <tr>\n",
299
  " <th>N</th>\n",
300
- " <td>1183.00</td>\n",
301
- " <td>884.00</td>\n",
302
  " </tr>\n",
303
  " <tr>\n",
304
  " <th>ROC AUC</th>\n",
305
- " <td>0.79</td>\n",
306
- " <td>0.81</td>\n",
307
  " </tr>\n",
308
  " <tr>\n",
309
  " <th>Precision</th>\n",
310
- " <td>0.72</td>\n",
311
- " <td>0.75</td>\n",
312
  " </tr>\n",
313
  " <tr>\n",
314
  " <th>Recall</th>\n",
315
- " <td>0.81</td>\n",
316
- " <td>0.88</td>\n",
317
  " </tr>\n",
318
  " </tbody>\n",
319
  "</table>\n",
@@ -321,13 +465,13 @@
321
  ],
322
  "text/plain": [
323
  " All High Confidence\n",
324
- "N 1183.00 884.00\n",
325
- "ROC AUC 0.79 0.81\n",
326
- "Precision 0.72 0.75\n",
327
- "Recall 0.81 0.88"
328
  ]
329
  },
330
- "execution_count": 7,
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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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>&amp;#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 βœ… &#9989;\n",
356
+ "2023-09-11 False 0.300308 βœ… &#9989;\n",
357
+ "2023-09-12 True 0.542126 🟨 &#11036;\n",
358
+ "2023-09-13 True 0.749427 βœ… &#9989;\n",
359
+ "2023-09-14 False 0.385973 βœ… &#9989;\n",
360
+ "2023-09-15 True 0.326088 ❌ &#10060;\n",
361
+ "2023-09-18 False 0.341849 βœ… &#9989;\n",
362
+ "2023-09-19 False 0.687576 ❌ &#10060;\n",
363
+ "2023-09-20 False 0.209737 βœ… &#9989;\n",
364
+ "2023-09-21 False 0.477048 🟨 &#11036;\n",
365
+ "2023-09-22 True 0.381210 ❌ &#10060;\n",
366
+ "2023-09-25 False 0.306969 βœ… &#9989;\n",
367
+ "2023-09-26 True 0.437918 🟨 &#11036;\n",
368
+ "2023-09-27 True 0.502720 🟨 &#11036;\n",
369
+ "2023-09-28 False 0.772822 ❌ &#10060;\n",
370
+ "2023-09-29 True 0.456547 🟨 &#11036;\n",
371
+ "2023-10-02 False 0.278969 βœ… &#9989;\n",
372
+ "2023-10-03 True 0.597911 🟨 &#11036;\n",
373
+ "2023-10-04 False 0.504107 🟨 &#11036;\n",
374
+ "2023-10-05 True 0.399995 ❌ &#10060;"
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,