backtest-automation/run_backtest.py

62 lines
2.2 KiB
Python

from backtesting import backtest_iron_condor
from backtesting.delta_target_strategy import DeltaTargetStrategy
from backtesting.option_type import OptionType
from database.backtest import insert
from datetime import datetime, timedelta
entry_time_format = '%H:%M:%S'
def entry_times():
start = datetime.strptime('09:35:00', entry_time_format)
end = datetime.strptime('15:55:00', entry_time_format)
current_time = start
entry_times = []
while current_time <= end:
entry_times.append(current_time.strftime(entry_time_format))
current_time += timedelta(minutes = 5)
return entry_times
def create_strategies(entry_time: str):
call_spread_strat = DeltaTargetStrategy(
delta_upper_bound = 0.11,
delta_lower_bound = 0.10,
option_type = OptionType.CALL,
number_of_contracts = 1,
spread_width = 50,
stop_loss_multiple = 1.00,
trade_entry_time = entry_time
)
put_spread_strat = DeltaTargetStrategy(
delta_upper_bound = 0.11,
delta_lower_bound = 0.10,
option_type = OptionType.PUT,
number_of_contracts = 1,
spread_width = 50,
stop_loss_multiple = 1.00,
trade_entry_time = entry_time
)
return call_spread_strat, put_spread_strat
def run_backtest(start_date: datetime, end_date: datetime):
for entry_time in entry_times():
call_spread_strategy, put_spread_strategy = create_strategies(entry_time)
backtest_results = backtest_iron_condor(
f'10 Delta Iron Condor @ {call_spread_strategy.trade_entry_time}',
call_spread_strategy,
put_spread_strategy,
start_date,
end_date
)
# TODO: Think of a better way to handle this.
backtest_results.drop('Cumulative Profit', axis = 1, inplace = True)
print(backtest_results)
insert(backtest_results)
if __name__ == '__main__':
# TODO: Update backtest to eliminate the need for setting this to midnight.
end_date = datetime.now().replace(hour = 0, minute = 0, second = 0, microsecond = 0)
start_date = end_date - timedelta(days = 1)
run_backtest(start_date, end_date)