mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-11-08 10:22:09 +00:00
Add regression file with linear,quadratic,cubic,and personalized funcs
This commit is contained in:
@@ -11,7 +11,7 @@ register_matplotlib_converters()
|
||||
|
||||
from prediction_techniques import sma
|
||||
from prediction_techniques import knn
|
||||
from prediction_techniques import lr
|
||||
from prediction_techniques import regression
|
||||
|
||||
# -----------------------------------------------------------------------------------------------------------------------
|
||||
def print_prediction(s_ticker, s_start, s_interval):
|
||||
@@ -31,7 +31,10 @@ def print_prediction(s_ticker, s_start, s_interval):
|
||||
print("")
|
||||
print(" sma simple moving average")
|
||||
print(" knn k-Nearest Neighbors")
|
||||
print(" lr linear regression")
|
||||
print(" linear linear regression (polynomial 1)")
|
||||
print(" quadratic quadratic regression (polynomial 2)")
|
||||
print(" cubic cubic regression (polynomial 3)")
|
||||
print(" regression regression (other polynomial)")
|
||||
print("")
|
||||
|
||||
|
||||
@@ -41,7 +44,8 @@ def pred_menu(df_stock, s_ticker, s_start, s_interval):
|
||||
# Add list of arguments that the prediction techniques parser accepts
|
||||
pred_parser = argparse.ArgumentParser(prog='technical_analysis', add_help=False)
|
||||
pred_parser.add_argument('cmd', choices=['help', 'q', 'quit',
|
||||
'sma', 'knn', 'lr'])
|
||||
'sma', 'knn',
|
||||
'linear', 'quadratic', 'cubic', 'regression'])
|
||||
|
||||
print_prediction(s_ticker, s_start, s_interval)
|
||||
|
||||
@@ -77,9 +81,18 @@ def pred_menu(df_stock, s_ticker, s_start, s_interval):
|
||||
elif ns_known_args.cmd == 'knn':
|
||||
knn.k_nearest_neighbors(l_args, s_ticker, s_interval, df_stock)
|
||||
|
||||
# --------------------------------------------- LINEAR REGRESSION ---------------------------------------------
|
||||
elif ns_known_args.cmd == 'lr':
|
||||
lr.linear_regression(l_args, s_ticker, s_interval, df_stock)
|
||||
# ------------------------------------------------- REGRESSION -------------------------------------------------
|
||||
elif ns_known_args.cmd == 'linear':
|
||||
regression.regression(l_args, s_ticker, s_interval, df_stock, regression.LINEAR)
|
||||
|
||||
elif ns_known_args.cmd == 'quadratic':
|
||||
regression.regression(l_args, s_ticker, s_interval, df_stock, regression.QUADRATIC)
|
||||
|
||||
elif ns_known_args.cmd == 'cubic':
|
||||
regression.regression(l_args, s_ticker, s_interval, df_stock, regression.CUBIC)
|
||||
|
||||
elif ns_known_args.cmd == 'regression':
|
||||
regression.regression(l_args, s_ticker, s_interval, df_stock, regression.USER_INPUT)
|
||||
|
||||
# ------------------------------------------------------------------------------------------------------------
|
||||
else:
|
||||
|
||||
@@ -7,19 +7,29 @@ from pandas.plotting import register_matplotlib_converters
|
||||
register_matplotlib_converters()
|
||||
from TimeSeriesCrossValidation import splitTrain
|
||||
from sklearn import linear_model
|
||||
from sklearn import pipeline
|
||||
from sklearn import preprocessing
|
||||
|
||||
# ----------------------------------------------------- LR -----------------------------------------------------
|
||||
def linear_regression(l_args, s_ticker, s_interval, df_stock):
|
||||
parser = argparse.ArgumentParser(prog='linear_regression',
|
||||
description="""Linear regression attempts to model the relationship between
|
||||
two variables by fitting a linear equation to observed data. One variable is
|
||||
considered to be an explanatory variable, and the other is considered to be a
|
||||
dependent variable. """)
|
||||
USER_INPUT = 0
|
||||
LINEAR = 1
|
||||
QUADRATIC = 2
|
||||
CUBIC = 3
|
||||
|
||||
# -------------------------------------------------- REGRESSION --------------------------------------------------
|
||||
def regression(l_args, s_ticker, s_interval, df_stock, polynomial):
|
||||
parser = argparse.ArgumentParser(prog='regression',
|
||||
description="""Regression attempts to model the relationship between
|
||||
two variables by fitting a linear/quadratic/cubic/other equation to
|
||||
observed data. One variable is considered to be an explanatory variable,
|
||||
and the other is considered to be a dependent variable. """)
|
||||
|
||||
parser.add_argument('-i', "--input", action="store", dest="n_inputs", type=check_positive, default=40, help='number of days to use for prediction')
|
||||
parser.add_argument('-d', "--days", action="store", dest="n_days", type=check_positive, default=5, help='prediction days')
|
||||
parser.add_argument('-j', "--jumps", action="store", dest="n_jumps", type=check_non_negative, default=0, help='number of jumps in training data')
|
||||
|
||||
if polynomial == USER_INPUT:
|
||||
parser.add_argument('-p', "--polynomial", action="store", dest="n_polynomial", type=check_positive, required=True, help='polynomial associated with regression')
|
||||
|
||||
try:
|
||||
(ns_parser, l_unknown_args) = parser.parse_known_args(l_args)
|
||||
|
||||
@@ -31,17 +41,23 @@ def linear_regression(l_args, s_ticker, s_interval, df_stock):
|
||||
stock_x, stock_y = splitTrain.split_train(df_stock['4. close'].values, ns_parser.n_inputs, ns_parser.n_days, ns_parser.n_jumps)
|
||||
|
||||
# Machine Learning model
|
||||
lr = linear_model.LinearRegression(n_jobs=-1)
|
||||
lr.fit(stock_x, stock_y)
|
||||
|
||||
if polynomial == LINEAR:
|
||||
model = linear_model.LinearRegression(n_jobs=-1)
|
||||
else:
|
||||
if polynomial == USER_INPUT:
|
||||
polynomial = ns_parser.n_polynomial
|
||||
model = pipeline.make_pipeline(preprocessing.PolynomialFeatures(polynomial), linear_model.Ridge())
|
||||
|
||||
model.fit(stock_x, stock_y)
|
||||
l_predictions = model.predict(df_stock['4. close'].values[-ns_parser.n_inputs:].reshape(1, -1))[0]
|
||||
|
||||
# Prediction data
|
||||
l_predictions = lr.predict(df_stock['4. close'].values[-ns_parser.n_inputs:].reshape(1, -1))[0]
|
||||
l_pred_days = get_next_stock_market_days(last_stock_day=df_stock['4. close'].index[-1], n_next_days=ns_parser.n_days)
|
||||
df_pred = pd.Series(l_predictions, index=l_pred_days, name='Price')
|
||||
|
||||
# Plotting
|
||||
plt.plot(df_stock.index, df_stock['4. close'], lw=2)
|
||||
plt.title(f"Linear Regression on {s_ticker} - {ns_parser.n_days} days prediction")
|
||||
plt.title(f"Regression (polynomial {polynomial}) on {s_ticker} - {ns_parser.n_days} days prediction")
|
||||
plt.xlim(df_stock.index[0], get_next_stock_market_days(df_pred.index[-1], 1)[-1] )
|
||||
plt.xlabel('Time')
|
||||
plt.ylabel('Share Price ($)')
|
||||
Reference in New Issue
Block a user