|
import yfinance as yf |
|
import pandas as pd |
|
import numpy as np |
|
from sklearn.preprocessing import StandardScaler, MinMaxScaler |
|
from sklearn.compose import ColumnTransformer |
|
import joblib |
|
import keras |
|
import matplotlib.pyplot as plt |
|
|
|
import tensorflow as tf |
|
physical_devices = tf.config.list_physical_devices('GPU') |
|
try: |
|
|
|
tf.config.set_visible_devices([], 'GPU') |
|
visible_devices = tf.config.get_visible_devices() |
|
for device in visible_devices: |
|
assert device.device_type != 'GPU' |
|
except: |
|
|
|
pass |
|
|
|
TEST_DAYS = 50 |
|
PERIOD = '5y' |
|
|
|
INCLUDE_COMMODITIES = True |
|
|
|
def preprocessBeforeScaling(df): |
|
df['High'] = df['High'].pct_change() * 100 |
|
df['Low'] = df['Low'].pct_change() * 100 |
|
df['Open'] = df['Open'].pct_change() * 100 |
|
df['Close'] = df['Close'].pct_change() * 100 |
|
|
|
if INCLUDE_COMMODITIES: |
|
df['gold_High'] = df['gold_High'].pct_change() * 100 |
|
df['gold_Low'] = df['gold_Low'].pct_change() * 100 |
|
df['gold_Open'] = df['gold_Open'].pct_change() * 100 |
|
df['gold_Close'] = df['gold_Close'].pct_change() * 100 |
|
|
|
df['crude_High'] = df['crude_High'].pct_change() * 100 |
|
df['crude_Low'] = df['crude_Low'].pct_change() * 100 |
|
df['crude_Open'] = df['crude_Open'].pct_change() * 100 |
|
df['crude_Close'] = df['crude_Close'].pct_change() * 100 |
|
return df |
|
|
|
metrics = { |
|
"TP": 0, "FP": 0, "TN": 0, "FN": 0 |
|
} |
|
|
|
endpoint = keras.models.load_model('nifty_model_v3.h5') |
|
try: |
|
scaler |
|
except NameError: |
|
pkl = joblib.load('nifty_model_v3.pkl') |
|
scaler = pkl['scaler'] |
|
today = yf.download( |
|
tickers="^NSEI", |
|
period=f'{TEST_DAYS}d', |
|
interval='1d', |
|
progress=False, |
|
timeout=10 |
|
) |
|
if INCLUDE_COMMODITIES: |
|
gold = yf.download( |
|
tickers="GC=F", |
|
period=f'{TEST_DAYS}d', |
|
interval='1d', |
|
progress=False, |
|
timeout=10 |
|
).add_prefix(prefix='gold_') |
|
crude = yf.download( |
|
tickers="CL=F", |
|
period=f'{TEST_DAYS}d', |
|
interval='1d', |
|
progress=False, |
|
timeout=10 |
|
).add_prefix(prefix='crude_') |
|
|
|
today = pd.concat([today, gold, crude], axis=1) |
|
today = today.drop(columns=['Adj Close', 'Volume', 'gold_Adj Close', 'gold_Volume', 'crude_Adj Close', 'crude_Volume']) |
|
else: |
|
today = today.drop(columns=['Adj Close', 'Volume']) |
|
|
|
|
|
today = preprocessBeforeScaling(today) |
|
today = today.drop(columns=['gold_Open', 'gold_High', 'gold_Low', 'crude_Open', 'crude_High', 'crude_Low']) |
|
|
|
|
|
cnt_correct, cnt_wrong = 0, 0 |
|
for i in range(-TEST_DAYS,0): |
|
df = today.iloc[i] |
|
twr = today.iloc[i+1]['Close'] |
|
df = scaler.transform([df]) |
|
pred = endpoint.predict([df], verbose=0) |
|
|
|
if twr > today.iloc[i]['Open']: |
|
fact = "BULLISH" |
|
else: |
|
fact = "BEARISH" |
|
|
|
if pred > 0.5: |
|
out = "BEARISH" |
|
else: |
|
out = "BULLISH" |
|
|
|
if out == fact: |
|
cnt_correct += 1 |
|
if out == "BULLISH": |
|
metrics["TP"] += 1 |
|
else: |
|
metrics["TN"] += 1 |
|
else: |
|
cnt_wrong += 1 |
|
if out == "BULLISH": |
|
metrics["FN"] += 1 |
|
else: |
|
metrics["FP"] += 1 |
|
|
|
|
|
print("{} Nifty Prediction -> Market may Close {} on {}! Actual -> {}, Prediction -> {}, Pred = {}".format( |
|
today.iloc[i].name.strftime("%d-%m-%Y"), |
|
out, |
|
(today.iloc[i].name + pd.Timedelta(days=1)).strftime("%d-%m-%Y"), |
|
fact, |
|
"Correct" if fact == out else "Wrong", |
|
str(np.round(pred[0][0], 2)) |
|
) |
|
) |
|
|
|
print("Correct: {}, Wrong: {}, Accuracy: {}".format(cnt_correct, cnt_wrong, cnt_correct/(cnt_correct+cnt_wrong))) |
|
print(metrics) |