Skip to content

Commit 5e5137e

Browse files
committed
compare full dataframe instead of only last row
1 parent 5d4edb5 commit 5e5137e

File tree

1 file changed

+31
-30
lines changed

1 file changed

+31
-30
lines changed

freqtrade/optimize/analysis/lookahead.py

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def __init__(self) -> None:
2525
self.total_signals = 0
2626
self.false_entry_signals = 0
2727
self.false_exit_signals = 0
28-
self.false_indicators: list[str] = []
28+
self.false_indicators: set[str] = set()
2929
self.has_bias = False
3030

3131

@@ -70,34 +70,29 @@ def analyze_indicators(self, full_vars: VarHolder, cut_vars: VarHolder, current_
7070
cut_df: DataFrame = cut_vars.indicators[current_pair]
7171
full_df: DataFrame = full_vars.indicators[current_pair]
7272

73-
# cut longer dataframe to length of the shorter
74-
full_df_cut = full_df[(full_df.date == cut_vars.compared_dt)].reset_index(drop=True)
75-
cut_df_cut = cut_df[(cut_df.date == cut_vars.compared_dt)].reset_index(drop=True)
76-
77-
# check if dataframes are not empty
78-
if full_df_cut.shape[0] != 0 and cut_df_cut.shape[0] != 0:
79-
# compare dataframes
80-
compare_df = full_df_cut.compare(cut_df_cut)
81-
82-
if compare_df.shape[0] > 0:
83-
for col_name, values in compare_df.items():
84-
col_idx = compare_df.columns.get_loc(col_name)
85-
compare_df_row = compare_df.iloc[0]
86-
# compare_df now comprises tuples with [1] having either 'self' or 'other'
87-
if "other" in col_name[1]:
88-
continue
89-
self_value = compare_df_row.iloc[col_idx]
90-
other_value = compare_df_row.iloc[col_idx + 1]
91-
92-
# output differences
93-
if self_value != other_value:
94-
if not self.current_analysis.false_indicators.__contains__(col_name[0]):
95-
self.current_analysis.false_indicators.append(col_name[0])
96-
logger.info(
97-
f"=> found look ahead bias in indicator "
98-
f"{col_name[0]}. "
99-
f"{str(self_value)} != {str(other_value)}"
100-
)
73+
# trim full_df to the same index and length as cut_df
74+
cut_full_df = full_df.loc[cut_df.index]
75+
compare_df = cut_full_df.compare(cut_df)
76+
77+
if compare_df.shape[0] > 0:
78+
for col_name in compare_df:
79+
col_idx = compare_df.columns.get_loc(col_name)
80+
compare_df_row = compare_df.iloc[0]
81+
# compare_df now comprises tuples with [1] having either 'self' or 'other'
82+
if "other" in col_name[1]:
83+
continue
84+
self_value = compare_df_row.iloc[col_idx]
85+
other_value = compare_df_row.iloc[col_idx + 1]
86+
87+
# output differences
88+
if self_value != other_value:
89+
if not self.current_analysis.false_indicators.__contains__(col_name[0]):
90+
self.current_analysis.false_indicators.add(col_name[0])
91+
logger.info(
92+
f"=> found look ahead bias in column "
93+
f"{col_name[0]}. "
94+
f"{str(self_value)} != {str(other_value)}"
95+
)
10196

10297
def prepare_data(self, varholder: VarHolder, pairs_to_load: list[DataFrame]):
10398
if "freqai" in self.local_config and "identifier" in self.local_config["freqai"]:
@@ -132,7 +127,13 @@ def prepare_data(self, varholder: VarHolder, pairs_to_load: list[DataFrame]):
132127
varholder.data, varholder.timerange = backtesting.load_bt_data()
133128
varholder.timeframe = backtesting.timeframe
134129

135-
varholder.indicators = backtesting.strategy.advise_all_indicators(varholder.data)
130+
temp_indicators = backtesting.strategy.advise_all_indicators(varholder.data)
131+
filled_indicators = dict()
132+
for pair, dataframe in temp_indicators.items():
133+
filled_indicators[pair] = backtesting.strategy.ft_advise_signals(
134+
dataframe, {"pair": pair}
135+
)
136+
varholder.indicators = filled_indicators
136137
varholder.result = self.get_result(backtesting, varholder.indicators)
137138

138139
def fill_entry_and_exit_varHolders(self, result_row):

0 commit comments

Comments
 (0)