Forex Forecasting with Random Forests /ALL – Back/forward test and importances

Economy
### Back test
# Leverage multiple
leverage = 25
# Balance at start
start_balance = 1000000

# Profit and loss calculation
df_train_result['is_train'] = True
df_test_result['is_train'] = False
df_concat = pd.concat([df_train_result, df_test_result])

df_back_test = trade_simulation(df_concat,leverage,start_balance)
df_back_test.to_csv('/Users/alisa/github/ml/fx/data/output/df_back_test_1.csv', encoding='cp932',index=True)

# Visualization of the balance during backtesting
fig, ax = plt.subplots(figsize=(16, 4))
ax.plot(df_concat[df_back_test['is_train']]['Date'], df_back_test[df_back_test['is_train']]['balance'], label='train_balance')
ax.plot(df_concat[~df_back_test['is_train']]['Date'], df_back_test[~df_back_test['is_train']]['balance'], label='test_balance')
ax.legend(fontsize=12)
ax.set_title('Back test', fontsize=14)
ax.yaxis.get_major_formatter().set_useOffset(False)
ax.yaxis.get_major_formatter().set_scientific(False) 
ax.yaxis.set_major_locator(ticker.MaxNLocator(integer=True))
ax.set_ylim(0, df_back_test['balance'].max() + df_back_test['balance'].max()*0.1)
# ax.yaxis.set_ticks(np.arange(0, df_back_test['balance'].max() + 1000000, 500000))

ax.xaxis.set_major_locator(mdates.MonthLocator(interval=12))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y'))
ax.tick_params(axis='x', labelrotation=45)

print('First day: {}'.format(df_back_test.iloc[0]['Date']))
print('Last day: {}'.format(df_back_test.iloc[-1]['Date']))
print('Balance at last day: {}'.format(df_back_test.iloc[-1]['balance'].astype(int)))
print('profit: {}'.format(df_back_test.iloc[-1]['balance'].astype(int)-start_balance))

First day: 2007-04-20 00:00:00 Last day: 2021-02-02 00:00:00 Balance at last day: 332359901 profit: 331359901

## Forward test
# Leverage multiple
leverage = 25
# Balance at start
start_balance = 1000000
# Profit and loss calculation
df_forward_test = trade_simulation(df_test_result,leverage,start_balance)
df_forward_test.to_csv('/Users/alisa/github/ml/fx/data/output/df_forward_test_1.csv', encoding='cp932',index=True)

# Visualization Balance at Forward test
fig, ax = plt.subplots(figsize=(16, 4))
ax.plot(df_forward_test['Date'], df_forward_test['balance'], label='balance', color='orange')
ax.legend(fontsize=12)
ax.set_title('Forward test', fontsize=14)
ax.yaxis.get_major_formatter().set_useOffset(False)
ax.yaxis.get_major_formatter().set_scientific(False) 
ax.yaxis.set_major_locator(ticker.MaxNLocator(integer=True))
ax.set_ylim(0, df_forward_test['balance'].max() + df_forward_test['balance'].max()*0.1)
# ax.yaxis.set_ticks(np.arange(0, 5000001, 500000))

ax.xaxis.set_major_locator(mdates.MonthLocator(interval=2))
ax.xaxis.set_major_formatter(mdates.DateFormatter('%y/%m'))
ax.tick_params(axis='x', labelrotation=45)

print('Start day: {}'.format(df_forward_test.iloc[0]['Date']))
print('Last day: {}'.format(df_forward_test.iloc[-1]['Date']))
print('Balance at last day: {}'.format(df_forward_test.iloc[-1]['balance'].astype(int)))
print('Profit: {}'.format(df_forward_test.iloc[-1]['balance'].astype(int)-start_balance))

First day: 2020-01-02 00:00:00 Last day: 2021-02-02 00:00:00 Balance at last day: 1000000 profit: 0

### feature_importance
def plot_feature_importance(importance,names):
    
    # Create arrays from feature importance and feature names
    feature_importance = np.array(importance)
    feature_names = np.array(names)

    # Create a DataFrame using a Dictionary
    data={'feature_names':feature_names,'feature_importance':feature_importance}
    fi_df = pd.DataFrame(data)

    # Sort the DataFrame in order decreasing feature importance
    fi_df.sort_values(by=['feature_importance'], ascending=False,inplace=True)
    return fi_df

# Get the top 20 most important variables
fi_df = plot_feature_importance(model.feature_importances_,X_train.columns)
fi_df = fi_df.head(20)

# Define size of bar plot
plt.figure(figsize=(10,8))
# Plot Searborn bar chart
sns.barplot(x=fi_df['feature_importance'], y=fi_df['feature_names'])
# Add chart labels
plt.title('RANDOM FOREST' + 'FEATURE IMPORTANCE')
plt.xlabel('FEATURE IMPORTANCE')
plt.ylabel('FEATURE NAMES')

display(fi_df)

feature_names
feature_importance
42dow_Open0.044485
69dax_High0.043047
45dow_Close0.039941
71dax_Close0.037381
100deb10y_Close0.032505
70dax_Low0.031417
43dow_High0.029056
97deb10y_Open0.028409
105DE_US_10ySpread0.022758
44dow_Low0.022234
83vix_Close0.021338
96itb10y_Close0.020858
68dax_Open0.019974
57gold_Low0.019778
98deb10y_High0.018152
102ptd10y_High0.017777
49nikkei_Low0.016799
66wti_OpenInt0.014266
56gold_High0.013983
91grb10y_Low0.013825
Xiofx
Xiofx

An experienced Machine Learning and Deep Learning professional and logistics improvement entrepreneur in Tokyo, Japan, with an interest in economies around the world. She likes travel very much.

XiofxFollow
EconomyFXPythonTechnology

Comments

Letteralpha