Synced repo using 'sync_with_huggingface' Github Action
Browse files- page/complete_backtest.py +10 -1
- page/single_backtest.py +19 -9
- utils.py +1 -18
page/complete_backtest.py
CHANGED
@@ -61,13 +61,22 @@ def complete_backtest():
|
|
61 |
st.success(f"Analysis finished in {round(time.time()-start, 2)} seconds")
|
62 |
|
63 |
if "results" in st.session_state:
|
64 |
-
st.write("⬇️ Select a row in index column to get detailed information of the respective stock run.")
|
|
|
|
|
|
|
|
|
65 |
cols = ['stock', 'Start', 'End', 'Return [%]', 'Equity Final [$]', 'Buy & Hold Return [%]', '# Trades', 'Win Rate [%]', 'Best Trade [%]', 'Worst Trade [%]', 'Avg. Trade [%]']
|
66 |
df = st.dataframe(st.session_state.results, hide_index=True, column_order=cols, on_select="rerun", selection_mode="single-row")
|
67 |
df.selection.rows = 1
|
68 |
if df.selection.rows:
|
69 |
row = df.selection.rows
|
|
|
70 |
plot = st.session_state.results['plot'].values[row]
|
|
|
|
|
|
|
|
|
71 |
components.html(plot[0], height=1067)
|
72 |
|
73 |
complete_backtest()
|
|
|
61 |
st.success(f"Analysis finished in {round(time.time()-start, 2)} seconds")
|
62 |
|
63 |
if "results" in st.session_state:
|
64 |
+
# st.write("⬇️ Select a row in index column to get detailed information of the respective stock run.")
|
65 |
+
st.markdown(f"""
|
66 |
+
### :orange[Nifty50 stocks backtest result by using {strategy}]
|
67 |
+
⬇️ Select a row in index column to get detailed information of the respective stock run.
|
68 |
+
""")
|
69 |
cols = ['stock', 'Start', 'End', 'Return [%]', 'Equity Final [$]', 'Buy & Hold Return [%]', '# Trades', 'Win Rate [%]', 'Best Trade [%]', 'Worst Trade [%]', 'Avg. Trade [%]']
|
70 |
df = st.dataframe(st.session_state.results, hide_index=True, column_order=cols, on_select="rerun", selection_mode="single-row")
|
71 |
df.selection.rows = 1
|
72 |
if df.selection.rows:
|
73 |
row = df.selection.rows
|
74 |
+
ticker = st.session_state.results['stock'].values[row]
|
75 |
plot = st.session_state.results['plot'].values[row]
|
76 |
+
color = "green" if st.session_state.results['Return [%]'].values[row][0] > 0 else "red"
|
77 |
+
st.markdown(f"""
|
78 |
+
### :{color}[{ticker[0]} backtest plot] 📊
|
79 |
+
""")
|
80 |
components.html(plot[0], height=1067)
|
81 |
|
82 |
complete_backtest()
|
page/single_backtest.py
CHANGED
@@ -7,7 +7,7 @@ from bokeh.plotting import figure
|
|
7 |
from streamlit.components import v1 as components
|
8 |
|
9 |
from indicators import SMC
|
10 |
-
from utils import fetch,
|
11 |
|
12 |
def use_file_for_bokeh(chart: figure, chart_height=1067):
|
13 |
# Function used to replace st.boken_chart, because streamlit doesn't support bokeh v3
|
@@ -73,6 +73,8 @@ def algorithmic_trading_dashboard():
|
|
73 |
ema2 = st.number_input("Slow EMA Length", min_value=1, value=21)
|
74 |
with c3:
|
75 |
cross_close = st.checkbox("Close trade on EMA crossover", value=False)
|
|
|
|
|
76 |
|
77 |
# Button to run the analysis
|
78 |
if st.button("Run"):
|
@@ -95,18 +97,26 @@ def algorithmic_trading_dashboard():
|
|
95 |
)
|
96 |
|
97 |
# Generate backtest plot
|
98 |
-
if strategy == "Order Block":
|
99 |
-
|
100 |
-
elif strategy == "Order Block with EMA":
|
101 |
-
|
102 |
-
elif strategy == "Structure trading":
|
103 |
-
|
|
|
|
|
104 |
|
105 |
# Display plots
|
106 |
st.write("### Signal Plot")
|
107 |
st.plotly_chart(signal_plot, width=1200)
|
108 |
|
109 |
-
st.write(
|
110 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
111 |
|
112 |
algorithmic_trading_dashboard()
|
|
|
7 |
from streamlit.components import v1 as components
|
8 |
|
9 |
from indicators import SMC
|
10 |
+
from utils import fetch, run_strategy
|
11 |
|
12 |
def use_file_for_bokeh(chart: figure, chart_height=1067):
|
13 |
# Function used to replace st.boken_chart, because streamlit doesn't support bokeh v3
|
|
|
73 |
ema2 = st.number_input("Slow EMA Length", min_value=1, value=21)
|
74 |
with c3:
|
75 |
cross_close = st.checkbox("Close trade on EMA crossover", value=False)
|
76 |
+
else:
|
77 |
+
ema1, ema2, cross_close = None, None, None
|
78 |
|
79 |
# Button to run the analysis
|
80 |
if st.button("Run"):
|
|
|
97 |
)
|
98 |
|
99 |
# Generate backtest plot
|
100 |
+
# if strategy == "Order Block":
|
101 |
+
# backtest_plot = smc_plot_backtest(data, 'test.html', swing_hl)
|
102 |
+
# elif strategy == "Order Block with EMA":
|
103 |
+
# backtest_plot = smc_ema_plot_backtest(data, 'test.html', ema1, ema2, cross_close)
|
104 |
+
# elif strategy == "Structure trading":
|
105 |
+
# backtest_plot = smc_structure_plot_backtest(data, 'test.html', swing_hl)
|
106 |
+
|
107 |
+
backtest_results = run_strategy(ticker, strategy, period, interval, swing_hl=swing_hl, ema1=ema1, ema2=ema2, cross_close=cross_close)
|
108 |
|
109 |
# Display plots
|
110 |
st.write("### Signal Plot")
|
111 |
st.plotly_chart(signal_plot, width=1200)
|
112 |
|
113 |
+
st.write('### Backtest Results')
|
114 |
+
cols = ['stock', 'Start', 'End', 'Return [%]', 'Equity Final [$]', 'Buy & Hold Return [%]', '# Trades',
|
115 |
+
'Win Rate [%]', 'Best Trade [%]', 'Worst Trade [%]', 'Avg. Trade [%]']
|
116 |
+
st.dataframe(backtest_results, hide_index=True, column_order=cols)
|
117 |
+
|
118 |
+
st.write("### Backtest Plot")
|
119 |
+
plot = backtest_results['plot']
|
120 |
+
components.html(plot[0], height=1067)
|
121 |
|
122 |
algorithmic_trading_dashboard()
|
utils.py
CHANGED
@@ -14,21 +14,6 @@ def fetch(symbol, period, interval):
|
|
14 |
df.columns =df.columns.get_level_values(0)
|
15 |
return df
|
16 |
|
17 |
-
def smc_plot_backtest(data, filename, swing_hl, **kwargs):
|
18 |
-
bt = Backtest(data, SMC_test, **kwargs)
|
19 |
-
bt.run(swing_window=swing_hl)
|
20 |
-
return bt.plot(filename=filename, open_browser=False)
|
21 |
-
|
22 |
-
def smc_ema_plot_backtest(data, filename, ema1, ema2, closecross, **kwargs):
|
23 |
-
bt = Backtest(data, SMC_ema, **kwargs)
|
24 |
-
bt.run(ema1=ema1, ema2=ema2, close_on_crossover=closecross)
|
25 |
-
return bt.plot(filename=filename, open_browser=False)
|
26 |
-
|
27 |
-
def smc_structure_plot_backtest(data, filename, swing_hl, **kwargs):
|
28 |
-
bt = Backtest(data, SMCStructure, **kwargs)
|
29 |
-
bt.run(swing_window=swing_hl)
|
30 |
-
return bt.plot(filename=filename, open_browser=False)
|
31 |
-
|
32 |
def smc_backtest(data, filename, swing_hl, **kwargs):
|
33 |
bt = Backtest(data, SMC_test, **kwargs)
|
34 |
results = bt.run(swing_window=swing_hl)
|
@@ -47,7 +32,7 @@ def smc_structure_backtest(data, filename, swing_hl, **kwargs):
|
|
47 |
bt.plot(filename=filename, open_browser=False)
|
48 |
return results
|
49 |
|
50 |
-
def run_strategy(ticker_symbol, strategy, period, interval, kwargs):
|
51 |
# Fetching ohlc of random ticker_symbol.
|
52 |
retries = 3
|
53 |
for i in range(retries):
|
@@ -87,8 +72,6 @@ def run_strategy(ticker_symbol, strategy, period, interval, kwargs):
|
|
87 |
backtest_results['plot'] = plot
|
88 |
|
89 |
# Reordering columns.
|
90 |
-
# cols = df.columns.tolist()
|
91 |
-
# cols = cols[-1:] + cols[:-1]
|
92 |
cols = ['stock', 'Start', 'End', 'Return [%]', 'Equity Final [$]', 'Buy & Hold Return [%]', '# Trades',
|
93 |
'Win Rate [%]', 'Best Trade [%]', 'Worst Trade [%]', 'Avg. Trade [%]', 'plot']
|
94 |
backtest_results = backtest_results[cols]
|
|
|
14 |
df.columns =df.columns.get_level_values(0)
|
15 |
return df
|
16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
17 |
def smc_backtest(data, filename, swing_hl, **kwargs):
|
18 |
bt = Backtest(data, SMC_test, **kwargs)
|
19 |
results = bt.run(swing_window=swing_hl)
|
|
|
32 |
bt.plot(filename=filename, open_browser=False)
|
33 |
return results
|
34 |
|
35 |
+
def run_strategy(ticker_symbol, strategy, period, interval, **kwargs):
|
36 |
# Fetching ohlc of random ticker_symbol.
|
37 |
retries = 3
|
38 |
for i in range(retries):
|
|
|
72 |
backtest_results['plot'] = plot
|
73 |
|
74 |
# Reordering columns.
|
|
|
|
|
75 |
cols = ['stock', 'Start', 'End', 'Return [%]', 'Equity Final [$]', 'Buy & Hold Return [%]', '# Trades',
|
76 |
'Win Rate [%]', 'Best Trade [%]', 'Worst Trade [%]', 'Avg. Trade [%]', 'plot']
|
77 |
backtest_results = backtest_results[cols]
|