The Walk-Forward Loop performs the back-testing, but how do we go about interpreting its results? The very nature of the walk-forward loop makes the test data set approach (test the performance on a left-out portion of the data) unattractive.
The answer is quite simple actually: apply standard machine learning techniques to the actual vs the forecasted results and quantify the success of the classification. The extra step here is loading the data.
import numpy as np import pandas as pd from sqlalchemy import create_engine def get_models(db_url): ee = create_engine(db_url) res = pd.read_sql_table("models", ee) return res def get_forecasts(db_url, model_id): ee = create_engine(db_url) query = (" SELECT ts,fore,details " " FROM forecasts " " WHERE model = " + str(model_id) + " " " ORDER BY ts ASC") res = pd.read_sql_query(query, ee, index_col = ['ts'], parse_dates=['ts']) return res def main(): # The database URL db_url = "sqlite:///ml.sqlite" # Load the forecasts fore = get_forecasts(db_url, 1) # Load the actual data file_path = "all_data.bin" all_data = None with open(file_path, 'rb') as ff: all_data = pickle.load(ff) ho = all_data['HO2'] # Concatenate the actual and the forecasted data dd = pd.concat([ho['full']['entry'],fore['fore']],axis=1).dropna() dd.columns = ['actual','fore'] if __name__ == "__main__": main()
One way to quantify the quality of the classification is to apply scikit learn’s functions to the loaded data:
cm = sklearn.metrics.confusion_matrix(dd['actual'].as_matrix(), dd['fore'].as_matrix(), labels=[-1,0,1])
For more advanced analysis we can utilize the information from the