Backtester Development (Part 2)
Posted by Mark on November 1, 2022 at 07:24 | Last modified: June 22, 2022 08:36I resume today with my detailed approach to check_second, which I provided at the end of Part 1.
In case you had trouble following all that, I concur because it’s a mess! check_second increases the find_long branch from 17 to 45 lines. In the process, I encountered a bug that took over two hours to identify.*
I also had great difficulty in keeping track of indentation:
Getting the indentation wrong can screw up a program something fierce. I really need to think carefully about what’s going to happen where depending on how the conditional criteria evaluate.
Even getting the indentation correct, I am not entirely happy with the solution. I feel it’s sloppy Python, but I may not know any better at this point. The elapsed time is about three seconds longer, but I feel more confident that nothing will slip through the cracks. Perhaps a couple user-defined functions would make the nested ifs more readable.
Starting an ELSE with the same indentation whenever I begin an if statement might also help the effort. This will allow me to more easily see the proper indentation up front even if I don’t have it filled in yet. When there is nothing to do in the ELSE branch, I can always use PASS. All this is to make the code more readable, which I’m guessing would be advised by PEP 8 (Python style guide), and to decrease the risk of sloppy mistakes.
To that end, my next steps were to eliminate the redundant 10-multiple truth tests and to make sure every if has a corresponding ELSE statement. In most cases for this program, the ELSE block simply gets CONTINUE to move to the next iteration (row of data file). I am encouraged to say no bugs were encountered at this stage, which added 10 lines and included quite a bit of code manipulation aided by the Atom editor folding feature (see footnote here).
Maybe I can do right in Python after all! I also feel much better about the code with things seemingly better organized.
This confidence boost was very short-lived, however, as my next step to eliminate the lower bound (see fifth paragraph here for a refresher) resulted in the previous day’s check_second bug profile all over again:
I will discuss this more next time.
*—Incidentally, the bug was in (2) because at the bottom of find_long, I assigned find_short to control_flag.
The whole idea of check_second is to hold off on taking steps to completing the spread (find_short) until
verifying the first qualifying DTE to be the only (else I want the shorter DTE).