├── frontend ├── README.md ├── src │ ├── vite-env.d.ts │ ├── App.tsx │ ├── components │ │ └── ui │ │ │ ├── use-toast.ts │ │ │ ├── label.tsx │ │ │ ├── textarea.tsx │ │ │ ├── input.tsx │ │ │ ├── separator.tsx │ │ │ ├── toaster.tsx │ │ │ ├── tooltip.tsx │ │ │ ├── tabs.tsx │ │ │ ├── card.tsx │ │ │ ├── button.tsx │ │ │ ├── table.tsx │ │ │ ├── dialog.tsx │ │ │ ├── form.tsx │ │ │ ├── toast.tsx │ │ │ ├── select.tsx │ │ │ └── chart.tsx │ ├── main.tsx │ ├── lib │ │ └── utils.ts │ ├── services │ │ └── api.ts │ ├── App.css │ └── index.css ├── public │ ├── logo.png │ ├── logo_old.png │ └── dark-grainy-gradient-background-blue-purple-neon-colors-black-noise-grain-texture-effect_284753-2325.jpg.avif ├── postcss.config.js ├── .env.production ├── .env.example ├── .gitignore ├── vite.config.ts ├── tsconfig.json ├── package.json ├── index.html └── tailwind.config.ts ├── backend ├── src │ ├── .gitkeep │ ├── __init__.py │ ├── utils │ │ ├── __init__.py │ │ ├── logging.py │ │ ├── globals.py │ │ └── helpers.py │ ├── backtesting │ │ ├── __init__.py │ │ ├── types.py │ │ ├── engine.py │ │ ├── metrics.py │ │ └── viz.py │ ├── data │ │ ├── __init__.py │ │ ├── preprocessor.py │ │ └── data_fetcher.py │ └── strategies │ │ ├── __init__.py │ │ ├── base_strategy_class.py │ │ ├── dual_momentum.py │ │ ├── bollinger_breakout.py │ │ ├── rsi_pullback.py │ │ └── gap_fade.py ├── cache │ ├── .gitkeep │ ├── C_max_None_None_1d_data.parquet │ ├── T_max_None_None_1d_data.parquet │ ├── V_max_None_None_1d_data.parquet │ ├── ABT_max_None_None_1d_data.parquet │ ├── AXP_max_None_None_1d_data.parquet │ ├── BAC_max_None_None_1d_data.parquet │ ├── BA_max_None_None_1d_data.parquet │ ├── BLK_max_None_None_1d_data.parquet │ ├── BMY_max_None_None_1d_data.parquet │ ├── CAT_max_None_None_1d_data.parquet │ ├── CRM_max_None_None_1d_data.parquet │ ├── CVS_max_None_None_1d_data.parquet │ ├── CVX_max_None_None_1d_data.parquet │ ├── DIS_max_None_None_1d_data.parquet │ ├── GE_max_None_None_1d_data.parquet │ ├── GS_max_None_None_1d_data.parquet │ ├── HD_max_None_None_1d_data.parquet │ ├── HON_max_None_None_1d_data.parquet │ ├── IWM_max_None_None_1d_data.parquet │ ├── JNJ_max_None_None_1d_data.parquet │ ├── JPM_max_None_None_1d_data.parquet │ ├── KO_max_None_None_1d_data.parquet │ ├── LLY_max_None_None_1d_data.parquet │ ├── LMT_max_None_None_1d_data.parquet │ ├── MA_max_None_None_1d_data.parquet │ ├── MCD_max_None_None_1d_data.parquet │ ├── MMM_max_None_None_1d_data.parquet │ ├── MRK_max_None_None_1d_data.parquet │ ├── MS_max_None_None_1d_data.parquet │ ├── NKE_max_None_None_1d_data.parquet │ ├── PEP_max_None_None_1d_data.parquet │ ├── PFE_max_None_None_1d_data.parquet │ ├── PG_max_None_None_1d_data.parquet │ ├── QQQ_max_None_None_1d_data.parquet │ ├── RTX_max_None_None_1d_data.parquet │ ├── SPY_max_None_None_1d_data.parquet │ ├── TMO_max_None_None_1d_data.parquet │ ├── UNH_max_None_None_1d_data.parquet │ ├── UPS_max_None_None_1d_data.parquet │ ├── VOO_max_None_None_1d_data.parquet │ ├── VTI_max_None_None_1d_data.parquet │ ├── VZ_max_None_None_1d_data.parquet │ ├── WBD_max_None_None_1d_data.parquet │ ├── WFC_max_None_None_1d_data.parquet │ ├── WMT_max_None_None_1d_data.parquet │ ├── XLE_max_None_None_1d_data.parquet │ ├── XLF_max_None_None_1d_data.parquet │ ├── XLK_max_None_None_1d_data.parquet │ ├── XLV_max_None_None_1d_data.parquet │ ├── XOM_max_None_None_1d_data.parquet │ ├── AAPL_max_None_None_1d_data.parquet │ ├── ABBV_max_None_None_1d_data.parquet │ ├── AMZN_max_None_None_1d_data.parquet │ ├── ARKK_max_None_None_1d_data.parquet │ ├── CARV_max_None_None_1d_data.parquet │ ├── CHTR_max_None_None_1d_data.parquet │ ├── CMCSA_max_None_None_1d_data.parquet │ ├── COST_max_None_None_1d_data.parquet │ ├── GOOGL_max_None_None_1d_data.parquet │ ├── KBGGY_5y_None_None_1d_data.parquet │ ├── KBGGY_max_None_None_1d_data.parquet │ ├── META_max_None_None_1d_data.parquet │ ├── MSFT_max_None_None_1d_data.parquet │ ├── NFLX_max_None_None_1d_data.parquet │ ├── NVDA_max_None_None_1d_data.parquet │ ├── ORCL_max_None_None_1d_data.parquet │ ├── PARA_max_None_None_1d_data.parquet │ ├── ROKU_max_None_None_1d_data.parquet │ ├── SBUX_max_None_None_1d_data.parquet │ ├── SPOT_max_None_None_1d_data.parquet │ ├── TMUS_max_None_None_1d_data.parquet │ ├── TSLA_max_None_None_1d_data.parquet │ └── available_tickers_1d.txt ├── main.py ├── test_debug.py └── test_main.py ├── config └── config.yaml ├── requirements.txt ├── render.yaml ├── .gitignore └── DEPLOYMENT.md /frontend/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/src/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/src/__init__.py: -------------------------------------------------------------------------------- 1 | # Package initialization for QuantDash 2 | -------------------------------------------------------------------------------- /backend/src/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # Utility functions and helpers 2 | -------------------------------------------------------------------------------- /frontend/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /backend/src/utils/logging.py: -------------------------------------------------------------------------------- 1 | # Logging configuration and utilities 2 | -------------------------------------------------------------------------------- /backend/src/backtesting/__init__.py: -------------------------------------------------------------------------------- 1 | # Backtesting engine and utilities 2 | -------------------------------------------------------------------------------- /backend/src/data/__init__.py: -------------------------------------------------------------------------------- 1 | # Data fetching and preprocessing utilities 2 | -------------------------------------------------------------------------------- /backend/src/data/preprocessor.py: -------------------------------------------------------------------------------- 1 | # Data preprocessing and cleaning utilities 2 | -------------------------------------------------------------------------------- /frontend/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/frontend/public/logo.png -------------------------------------------------------------------------------- /frontend/public/logo_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/frontend/public/logo_old.png -------------------------------------------------------------------------------- /frontend/src/App.tsx: -------------------------------------------------------------------------------- 1 | import Index from "./pages/Index"; 2 | 3 | const App = () => ; 4 | 5 | export default App; 6 | -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /frontend/src/components/ui/use-toast.ts: -------------------------------------------------------------------------------- 1 | import { useToast, toast } from "@/hooks/use-toast"; 2 | 3 | export { useToast, toast }; 4 | -------------------------------------------------------------------------------- /backend/cache/.gitkeep: -------------------------------------------------------------------------------- 1 | # Placeholder for historical price data (CSV files) 2 | # This directory will contain downloaded market data 3 | -------------------------------------------------------------------------------- /backend/cache/C_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/C_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/T_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/T_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/V_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/V_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/ABT_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/ABT_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/AXP_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/AXP_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/BAC_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/BAC_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/BA_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/BA_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/BLK_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/BLK_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/BMY_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/BMY_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/CAT_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/CAT_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/CRM_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/CRM_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/CVS_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/CVS_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/CVX_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/CVX_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/DIS_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/DIS_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/GE_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/GE_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/GS_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/GS_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/HD_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/HD_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/HON_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/HON_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/IWM_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/IWM_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/JNJ_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/JNJ_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/JPM_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/JPM_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/KO_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/KO_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/LLY_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/LLY_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/LMT_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/LMT_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/MA_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/MA_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/MCD_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/MCD_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/MMM_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/MMM_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/MRK_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/MRK_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/MS_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/MS_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/NKE_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/NKE_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/PEP_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/PEP_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/PFE_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/PFE_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/PG_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/PG_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/QQQ_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/QQQ_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/RTX_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/RTX_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/SPY_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/SPY_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/TMO_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/TMO_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/UNH_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/UNH_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/UPS_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/UPS_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/VOO_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/VOO_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/VTI_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/VTI_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/VZ_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/VZ_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/WBD_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/WBD_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/WFC_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/WFC_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/WMT_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/WMT_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/XLE_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/XLE_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/XLF_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/XLF_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/XLK_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/XLK_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/XLV_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/XLV_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/XOM_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/XOM_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/AAPL_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/AAPL_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/ABBV_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/ABBV_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/AMZN_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/AMZN_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/ARKK_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/ARKK_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/CARV_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/CARV_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/CHTR_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/CHTR_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/CMCSA_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/CMCSA_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/COST_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/COST_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/GOOGL_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/GOOGL_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/KBGGY_5y_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/KBGGY_5y_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/KBGGY_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/KBGGY_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/META_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/META_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/MSFT_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/MSFT_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/NFLX_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/NFLX_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/NVDA_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/NVDA_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/ORCL_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/ORCL_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/PARA_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/PARA_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/ROKU_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/ROKU_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/SBUX_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/SBUX_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/SPOT_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/SPOT_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/TMUS_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/TMUS_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /backend/cache/TSLA_max_None_None_1d_data.parquet: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/backend/cache/TSLA_max_None_None_1d_data.parquet -------------------------------------------------------------------------------- /frontend/.env.production: -------------------------------------------------------------------------------- 1 | # Production environment variables for Render.com deployment 2 | VITE_API_BASE_URL=https://quantdash-backend.onrender.com/api 3 | -------------------------------------------------------------------------------- /config/config.yaml: -------------------------------------------------------------------------------- 1 | # Application configuration 2 | # e.g. 3 | app: 4 | title: "QuantDash - Algorithmic Trading Dashboard" 5 | debug: true 6 | port: 8050 7 | host: "127.0.0.1" 8 | 9 | -------------------------------------------------------------------------------- /frontend/src/main.tsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client' 2 | import App from './App.tsx' 3 | import './index.css' 4 | 5 | createRoot(document.getElementById("root")!).render(); 6 | -------------------------------------------------------------------------------- /frontend/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /frontend/public/dark-grainy-gradient-background-blue-purple-neon-colors-black-noise-grain-texture-effect_284753-2325.jpg.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jakobildstad/QuantDash/HEAD/frontend/public/dark-grainy-gradient-background-blue-purple-neon-colors-black-noise-grain-texture-effect_284753-2325.jpg.avif -------------------------------------------------------------------------------- /backend/src/utils/globals.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | # Get the absolute path to the backend directory 4 | # __file__ = /Users/jakobildstad/Dev/QuantDash/backend/src/utils/globals.py 5 | # We need to go up 2 levels: utils -> src -> backend 6 | BACKEND_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 7 | DATA_PATH = os.path.join(BACKEND_DIR, "cache") -------------------------------------------------------------------------------- /frontend/.env.example: -------------------------------------------------------------------------------- 1 | # Environment variables template 2 | # Copy this to .env.local and modify as needed 3 | 4 | # Backend API URL - change this based on your setup: 5 | # For local development: http://localhost:8000/api 6 | # For network access: http://YOUR_LOCAL_IP:8000/api 7 | # For production: https://your-backend.render.com/api 8 | VITE_API_BASE_URL=http://localhost:8000/api 9 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /frontend/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react-swc"; 3 | import path from "path"; 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig({ 7 | server: { 8 | host: "::", 9 | port: 5173, 10 | }, 11 | plugins: [react()], 12 | resolve: { 13 | alias: { 14 | "@": path.resolve(__dirname, "./src"), 15 | }, 16 | }, 17 | }); 18 | -------------------------------------------------------------------------------- /backend/src/backtesting/types.py: -------------------------------------------------------------------------------- 1 | # Common types and data structures for backtesting 2 | 3 | from dataclasses import dataclass 4 | from datetime import datetime 5 | from typing import Optional 6 | 7 | 8 | @dataclass 9 | class Trade: 10 | """Simple trade record""" 11 | entry_date: datetime 12 | exit_date: Optional[datetime] = None 13 | shares: int = 0 14 | entry_price: float = 0.0 15 | exit_price: float = 0.0 16 | profit_loss: float = 0.0 17 | -------------------------------------------------------------------------------- /backend/main.py: -------------------------------------------------------------------------------- 1 | # Main entry point for QuantDash application 2 | from src.backtesting.engine import BacktestEngine 3 | from src.strategies.ma_crossover import MovingAverageCrossover 4 | from src.data.data_fetcher import fetch_stock_data 5 | from src.backtesting.viz import visualize_results 6 | from src.utils.globals import DATA_PATH 7 | from src.data.data_fetcher import write_available_tickers 8 | 9 | 10 | 11 | 12 | if __name__ == "__main__": 13 | write_available_tickers() -------------------------------------------------------------------------------- /backend/src/strategies/__init__.py: -------------------------------------------------------------------------------- 1 | # Base strategy class and common strategy utilities 2 | 3 | from .base_strategy_class import BaseStrategy 4 | from .ma_crossover import MovingAverageCrossover 5 | from .bollinger_breakout import BollingerBreakout 6 | from .dual_momentum import DualMomentum 7 | from .gap_fade import GapFade 8 | from .rsi_pullback import RSIPullback 9 | from .turtle_breakout import TurtleBreakout 10 | 11 | __all__ = [ 12 | 'BaseStrategy', 13 | 'MovingAverageCrossover', 14 | 'BollingerBreakout', 15 | 'DualMomentum', 16 | 'GapFade', 17 | 'RSIPullback', 18 | 'TurtleBreakout' 19 | ] 20 | -------------------------------------------------------------------------------- /backend/cache/available_tickers_1d.txt: -------------------------------------------------------------------------------- 1 | GOOGL 2 | BAC 3 | MA 4 | CHTR 5 | MSFT 6 | TMUS 7 | XLF 8 | IWM 9 | XOM 10 | WFC 11 | SPOT 12 | AAPL 13 | CAT 14 | DIS 15 | SBUX 16 | JPM 17 | PG 18 | CARV 19 | ORCL 20 | MCD 21 | KO 22 | T 23 | VZ 24 | HD 25 | ABT 26 | BMY 27 | QQQ 28 | LLY 29 | CVS 30 | PEP 31 | CRM 32 | AMZN 33 | ARKK 34 | MS 35 | UPS 36 | BLK 37 | GS 38 | MRK 39 | AXP 40 | JNJ 41 | NKE 42 | CVX 43 | RTX 44 | ABBV 45 | COST 46 | SPY 47 | ROKU 48 | KBGGY 49 | WBD 50 | TSLA 51 | NVDA 52 | LMT 53 | HON 54 | C 55 | XLK 56 | WMT 57 | XLV 58 | BA 59 | VTI 60 | PFE 61 | NFLX 62 | MMM 63 | CMCSA 64 | PARA 65 | TMO 66 | GE 67 | VOO 68 | XLE 69 | META 70 | V 71 | UNH 72 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # Requirements for QuantDash Backend 2 | 3 | # Core Data Processing 4 | pandas>=2.0.0 5 | numpy>=1.24.0 6 | 7 | # Financial Data 8 | yfinance>=0.2.28 9 | 10 | # Visualization & Plotting 11 | plotly>=5.17.0 12 | matplotlib>=3.7.0 13 | 14 | # API & Backend 15 | fastapi>=0.104.1 16 | uvicorn[standard]>=0.24.0 17 | pydantic>=2.5.0 18 | python-multipart>=0.0.6 19 | 20 | # File Handling & Serialization 21 | pyarrow>=14.0.0 # For parquet file support 22 | json5>=0.9.0 # Enhanced JSON support 23 | 24 | # Development & Testing (Optional) 25 | pytest>=7.4.0 26 | black>=23.0.0 27 | flake8>=6.1.0 28 | 29 | # Production Deployment 30 | gunicorn>=21.2.0 # Alternative to uvicorn for production 31 | -------------------------------------------------------------------------------- /frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | "moduleResolution": "bundler", 9 | "allowImportingTsExtensions": true, 10 | "resolveJsonModule": true, 11 | "isolatedModules": true, 12 | "noEmit": true, 13 | "jsx": "react-jsx", 14 | "strict": false, 15 | "noUnusedLocals": false, 16 | "noUnusedParameters": false, 17 | "allowJs": true, 18 | "strictNullChecks": false, 19 | "baseUrl": ".", 20 | "paths": { 21 | "@/*": ["./src/*"] 22 | } 23 | }, 24 | "include": ["src"] 25 | } 26 | -------------------------------------------------------------------------------- /frontend/src/components/ui/label.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import * as LabelPrimitive from "@radix-ui/react-label" 3 | import { cva, type VariantProps } from "class-variance-authority" 4 | 5 | import { cn } from "@/lib/utils" 6 | 7 | const labelVariants = cva( 8 | "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" 9 | ) 10 | 11 | const Label = React.forwardRef< 12 | React.ElementRef, 13 | React.ComponentPropsWithoutRef & 14 | VariantProps 15 | >(({ className, ...props }, ref) => ( 16 | 21 | )) 22 | Label.displayName = LabelPrimitive.Root.displayName 23 | 24 | export { Label } 25 | -------------------------------------------------------------------------------- /render.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | # Backend API Service 3 | - type: web 4 | name: quantdash-backend 5 | env: python 6 | plan: free 7 | buildCommand: | 8 | cd backend && 9 | pip install --upgrade pip && 10 | pip install -r ../requirements.txt 11 | startCommand: cd backend && python src/api/server.py 12 | envVars: 13 | - key: PYTHONPATH 14 | value: /opt/render/project/src/backend/src 15 | - key: PORT 16 | value: 8000 17 | 18 | # Frontend Static Site 19 | - type: web 20 | name: quantdash-frontend 21 | env: static 22 | plan: free 23 | buildCommand: | 24 | cd frontend && 25 | npm install && 26 | npm run build 27 | staticPublishPath: frontend/dist 28 | envVars: 29 | - key: VITE_API_BASE_URL 30 | value: https://quantdash-backend.onrender.com/api 31 | -------------------------------------------------------------------------------- /frontend/src/components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | export interface TextareaProps 6 | extends React.TextareaHTMLAttributes {} 7 | 8 | const Textarea = React.forwardRef( 9 | ({ className, ...props }, ref) => { 10 | return ( 11 |