diff --git a/prediction_techniques/pred_menu.py b/prediction_techniques/pred_menu.py index e32bdb70d5f..54f899d209d 100644 --- a/prediction_techniques/pred_menu.py +++ b/prediction_techniques/pred_menu.py @@ -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: diff --git a/prediction_techniques/lr.py b/prediction_techniques/regression.py similarity index 62% rename from prediction_techniques/lr.py rename to prediction_techniques/regression.py index a1298fa8d58..0a2ec19ed56 100644 --- a/prediction_techniques/lr.py +++ b/prediction_techniques/regression.py @@ -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 ($)')