### 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 | |
|---|---|---|
| 42 | dow_Open | 0.044485 |
| 69 | dax_High | 0.043047 |
| 45 | dow_Close | 0.039941 |
| 71 | dax_Close | 0.037381 |
| 100 | deb10y_Close | 0.032505 |
| 70 | dax_Low | 0.031417 |
| 43 | dow_High | 0.029056 |
| 97 | deb10y_Open | 0.028409 |
| 105 | DE_US_10ySpread | 0.022758 |
| 44 | dow_Low | 0.022234 |
| 83 | vix_Close | 0.021338 |
| 96 | itb10y_Close | 0.020858 |
| 68 | dax_Open | 0.019974 |
| 57 | gold_Low | 0.019778 |
| 98 | deb10y_High | 0.018152 |
| 102 | ptd10y_High | 0.017777 |
| 49 | nikkei_Low | 0.016799 |
| 66 | wti_OpenInt | 0.014266 |
| 56 | gold_High | 0.013983 |
| 91 | grb10y_Low | 0.013825 |


