Home

Portfolio Backtester

About the Project

Inspired by testfol.io, this project allows you to backtest a portfolio. The key difference is that this project supports CAD currency, in addition to USD.

The application runs as a web application in your web browser.

Data sources:

  • Yahoo Finance for stock market data
  • FRED for US rates
  • Valet API for Canadian rates

For End-Users

For users who need more detailed instructions, please refer to GETTING_STARTED.md.

Only Windows 10/11 x64 is supported at this time.

  • Create a FRED API key and save it to the clipboard: https://fredaccount.stlouisfed.org/apikeys
  • Download the latest release zip
  • Unzip in an empty folder of your choice
  • Navigate to the manage subfolder under the folder where the files were unzipped
  • Double-click on the Backtester shortcut to start the program
  • When prompted to do so, paste your FRED API key
    • If you enter the wrong key by accident, hit CTRL-C to exit, delete the file named fred_api.key and re-launch the backtester as stated above
  • Browse to http://127.0.0.1:8000/

Additional documentation can be found in DOCS.md.

List of special tickers that can be used for extended price history:

Ticker with Extended History Actual Ticker
CAOSSIM CAOS
DBMFSIM DBMF
DFLVXSIM DFLVX
DFSVXSIM DFSVX
GLDMSIM GLDM
IEFSIM IEF
KMLMSIM KMLM
QQQSIM QQQ
SHYSIM SHY
SPYSIM SPY
SSOSIM SSO
TLTSIM TLT
TMFSIM TMF
TQQQSIM TQQQ
UDOWSIM UDOW
UPROSIM UPRO
VBKSIM VBK
VTISIM VTI
VTSIM VT
VUGSIM VUG
VXUSSIM VXUS
XICSIM.TO XIC.TO
ZROZSIM ZROZ

In addition, the following special tickers can be used:

Ticker Description
CASHX US Risk-Free Rate (3 month T-Bill)
CASHX.TO Canada Risk-Free Rate (3 month T-Bill)

For Developers

Getting Started

  • Clone this repository and change to the root folder of the repository.
  • Install a C++ compiler and VSCode. On Windows (using the btcpp.vsconfig file in the root of this repository):
    winget install --id Microsoft.VisualStudio.2022.Community --override "--passive --config btcpp.vsconfig"
    winget install --id=LLVM.LLVM -e
    winget install vscode
    
  • Install Python. On Windows:
    winget install -e --id Python.Python.3.13
    
  • Create an account for the FRED API and request an API key: https://fredaccount.stlouisfed.org/apikeys
  • Copy the API key into a file named fred_api.key in the root folder of this repository. Then, in Powershell:
    python -m virtualenv .venv
    .venv\Scripts\Activate.ps1
    pip install -r requirements.txt
    
  • Open VSCode
    • Install the C/C++ Extensions Pack
    • In the command palette (CTRL+SHIFT+P), run CMake: Select a Kit, choose [Scan for Kits] then choose the most recent version of Clang (not Clang-cl, not Visual Studio)
    • In the command palette (CTRL+SHIFT+P), run CMake: Select Variant and choose Release
    • In the command palette (CTRL+SHIFT+P), run CMake: Build target and choose all

Web UI

  • Follow the steps in Getting Started
  • Run the following to start the server:
    set_environment_vars.ps1
    python .\manage.py runserver
    
  • Browse to the following URL:
    http://127.0.0.1:8000/
    

Extra Steps for Development Work

  • In VSCode, the following extensions are required:
    • Microsoft Black Formatter (for code formatting)
    • Austin VS Code (for profiling)
  • Install NPM
    winget install -e --id OpenJS.NodeJS
    
  • Add npm to PATH. Run the following in a Powershell session running as administrator:
    [Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Program Files\nodejs", "Machine")
    
  • Install Tailwind CLI:
    npm install -D tailwindcss
    
  • Install Flowbite:
    npm install flowbite
    
  • Start Tailwind auto-build:
    npx tailwindcss -i ./css/tailwind_input.css -o ./static/tailwind.css -c ./css/tailwind.config.js --watch
    

Running Google Tests

To run the google tests, you need to modify the PATH to include the location of the python run-time DLL (eg. python313.dll). You also need to set PYTHONPATH to point to the packages in the virtual environment. Example in Powershell:

$env:PYTHONPATH="C:\repo\Projects\backtester\.venv\Lib\site-packages"
$env:PATH="C:\Users\lucp\AppData\Local\Programs\Python\Python313;"+$env:PATH