From db3df0cb0c705d01e844f4d8528fb92df3aaf070 Mon Sep 17 00:00:00 2001 From: Satvik-Singh192 Date: Wed, 5 Nov 2025 17:26:41 +0530 Subject: [PATCH] feat: align elements properly --- examples/csv_validation_example.py | 9 +- legacy/streamlit/streamlit_app.py | 88 +- notebooks/01-getting-started.ipynb | 14 +- output/backtest_plot.png | Bin 33111 -> 62703 bytes output/backtest_results.json | 1022 ++--------------- .../SOURCES.txt | 2 +- test_cli.py | 26 +- 7 files changed, 212 insertions(+), 949 deletions(-) diff --git a/examples/csv_validation_example.py b/examples/csv_validation_example.py index 81f5520..2197dea 100644 --- a/examples/csv_validation_example.py +++ b/examples/csv_validation_example.py @@ -6,6 +6,7 @@ """ import pandas as pd + from quant_research_starter.data import validate_input_csv, validate_price_csv @@ -23,7 +24,7 @@ def example_validate_price_file(): # Check results if result["valid"]: - print(f"✓ File is valid!") + print("✓ File is valid!") print(f" Rows: {result['row_count']}") print(f" Columns: {result['column_count']}") else: @@ -55,7 +56,7 @@ def example_validate_with_required_columns(): if is_valid: print(f"✓ All required symbols present: {', '.join(required_symbols)}") else: - print(f"✗ Validation failed:") + print("✗ Validation failed:") for err in errors: print(f" {err}") @@ -76,7 +77,7 @@ def load_and_validate_prices(file_path: str): if not result["valid"]: # Handle errors error_messages = [err["message"] for err in result["errors"]] - raise ValueError(f"Invalid price file:\n" + "\n".join(error_messages)) + raise ValueError("Invalid price file:\n" + "\n".join(error_messages)) # If valid, proceed with loading prices = pd.read_csv(file_path, index_col=0, parse_dates=True) @@ -102,7 +103,7 @@ def example_detailed_error_info(): result = validate_input_csv("invalid_file.csv", csv_type="price") - print(f"Validation Summary:") + print("Validation Summary:") print(f" Valid: {result['valid']}") print(f" Errors: {len(result['errors'])}") print(f" Warnings: {len(result['warnings'])}") diff --git a/legacy/streamlit/streamlit_app.py b/legacy/streamlit/streamlit_app.py index 663d741..179abf0 100644 --- a/legacy/streamlit/streamlit_app.py +++ b/legacy/streamlit/streamlit_app.py @@ -6,47 +6,105 @@ import streamlit as st st.set_page_config(page_title="Quant Research Starter", layout="wide") -st.title("Quant Research Starter Dashboard") - +st.title("📊 Quant Research Starter Dashboard") output_dir = Path.cwd() / "output" default_results = output_dir / "backtest_results.json" default_factors = output_dir / "factors.csv" -st.sidebar.header("Inputs") +# --- Sidebar Inputs --- +st.sidebar.header("⚙️ Inputs") results_file = st.sidebar.text_input("Backtest results JSON", str(default_results)) factors_file = st.sidebar.text_input("Factors CSV", str(default_factors)) -col1, col2 = st.columns(2) +# --- Main Layout --- +st.markdown("### Overview") +st.caption("Visualize portfolio performance and factor signals side-by-side.") + +# Create two balanced columns +col1, col2 = st.columns([1, 1], gap="large") +# --- Left: Equity Curve --- with col1: - st.subheader("Equity Curve") + st.markdown("#### 📈 Equity Curve") if Path(results_file).exists(): with open(results_file) as f: data = json.load(f) + df = pd.DataFrame( { "date": pd.to_datetime(data["dates"]), "portfolio_value": data["portfolio_value"], } ).set_index("date") - fig = px.line(df, y="portfolio_value", title="Portfolio Value") + + fig = px.line( + df, + y="portfolio_value", + title="Portfolio Value Over Time", + labels={"portfolio_value": "Portfolio Value"}, + ) + fig.update_layout( + margin={"l": 30, "r": 30, "t": 40, "b": 30}, + height=400, + title_x=0.5, + ) + st.plotly_chart(fig, use_container_width=True) - st.json(data.get("metrics", {})) + + # Centered metrics section + st.markdown("#### 🔍 Summary Metrics") + metrics = data.get("metrics", {}) + if metrics: + mcol1, mcol2, mcol3 = st.columns(3) + items = list(metrics.items()) + for i, (key, value) in enumerate(items[:3]): + with [mcol1, mcol2, mcol3][i]: + st.metric( + label=key.replace("_", " ").title(), value=round(value, 4) + ) + if len(items) > 3: + st.json(dict(items[3:])) + else: + st.info("No metrics found in results.") else: - st.info("Run the CLI backtest to generate results.") + st.info("⚠️ Run the CLI backtest to generate results.") +# --- Right: Factor Signals --- with col2: - st.subheader("Factor Signals") + st.markdown("#### 📉 Factor Signals") if Path(factors_file).exists(): fdf = pd.read_csv(factors_file, index_col=0, parse_dates=True) - st.dataframe(fdf.tail()) - if "composite" in fdf.columns: - fig2 = px.line(fdf[["composite"]], title="Composite Signal") - st.plotly_chart(fig2, use_container_width=True) + + # Tabs for cleaner organization + tab1, tab2 = st.tabs(["📑 Latest Data", "📊 Composite Signal"]) + + with tab1: + st.dataframe( + fdf.tail().style.set_table_styles( + [{"selector": "th", "props": [("text-align", "center")]}] + ) + ) + + with tab2: + if "composite" in fdf.columns: + fig2 = px.line( + fdf[["composite"]], + title="Composite Factor Signal", + labels={"composite": "Composite"}, + ) + fig2.update_layout( + margin={"l": 30, "r": 30, "t": 40, "b": 30}, + height=400, + title_x=0.5, + ) + st.plotly_chart(fig2, use_container_width=True) + else: + st.info("No composite signal found.") else: - st.info("Compute factors to view signals.") + st.info("⚠️ Compute factors to view signals.") +# --- Footer --- st.markdown("---") st.caption( - "Tip: Use qrs CLI to generate data, factors, and backtest results. Then refresh this page." + "💡 Tip: Use `qrs` CLI to generate data, factors, and backtest results, then refresh this page." ) diff --git a/notebooks/01-getting-started.ipynb b/notebooks/01-getting-started.ipynb index a8a300d..e4c4837 100644 --- a/notebooks/01-getting-started.ipynb +++ b/notebooks/01-getting-started.ipynb @@ -45,6 +45,7 @@ "\n", "# Show which Python the kernel is using (debugging)\n", "import sys as _sys\n", + "\n", "print(\"Kernel Python:\", _sys.executable)\n" ] }, @@ -56,14 +57,17 @@ "outputs": [], "source": [ "# Setup: imports\n", - "import os\n", - "import json\n", - "import pandas as pd\n", "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", "\n", - "from quant_research_starter.data import SampleDataLoader, SyntheticDataGenerator\n", - "from quant_research_starter.factors import MomentumFactor, ValueFactor, SizeFactor, VolatilityFactor\n", "from quant_research_starter.backtest import VectorizedBacktest\n", + "from quant_research_starter.data import SampleDataLoader\n", + "from quant_research_starter.factors import (\n", + " MomentumFactor,\n", + " SizeFactor,\n", + " ValueFactor,\n", + " VolatilityFactor,\n", + ")\n", "from quant_research_starter.metrics import RiskMetrics\n", "\n" ] diff --git a/output/backtest_plot.png b/output/backtest_plot.png index 5e3189d207423a48608f6530b6b12b3029425cda..6eeaac2363bdc7b06637f430baccff6c1c7efaa3 100644 GIT binary patch literal 62703 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 F{tKh`z-Ryf literal 33111 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 diff --git a/output/backtest_results.json b/output/backtest_results.json index 84bf2cc..97ea189 100644 --- a/output/backtest_results.json +++ b/output/backtest_results.json @@ -1,519 +1,119 @@ { "metrics": { - "total_return": -1.0, - "cagr": 0, - "annualized_return": 0, - "volatility": 0, - "downside_volatility": 0, - "max_drawdown": 0.0, + "total_return": -0.056813586365103474, + "cagr": -0.19587422923064846, + "annualized_return": -0.19587422923064846, + "volatility": 0.2011139478190924, + "downside_volatility": 0.12173434517323907, + "max_drawdown": -0.1445684398076149, "drawdown_duration": 0, - "var_95": -1.0, - "cvar_95": -1.0, - "sharpe_ratio": 0, - "sortino_ratio": 0, - "calmar_ratio": 0 + "var_95": -0.019231010104213443, + "cvar_95": -0.025532708667872116, + "sharpe_ratio": -0.9739465181541899, + "sortino_ratio": -1.6090301299267808, + "calmar_ratio": -1.3548892793704417 }, "portfolio_value": [ 1000000.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0, - 0.0 + 999500.0, + 1020983.3814288847, + 1040855.2597947245, + 1031617.9616556381, + 1038169.7347261552, + 1037143.6803305667, + 1062654.988147677, + 1059209.2073003408, + 1071635.9459017066, + 1064083.0110879496, + 1051572.1244648902, + 1064232.6931356927, + 1043836.2224950673, + 1033210.4529692985, + 1029965.7664728428, + 1030642.1909003343, + 1030797.5879213361, + 1029213.0609950781, + 1045008.4968192923, + 1069840.5254072316, + 1052145.4722552695, + 1064470.9606289316, + 1055593.089863988, + 1049313.089097812, + 1029624.3656346899, + 1052513.1696791975, + 1038308.377058927, + 1031453.8035199654, + 1028318.7460267562, + 1022773.3209369407, + 1022702.5188011427, + 1026223.1427891029, + 1013819.3824762587, + 1025729.4583680343, + 1000859.5520236057, + 999062.8882925692, + 997079.2130641966, + 1001744.5823969941, + 1004311.1403878148, + 993169.4664918573, + 982970.4035495098, + 965075.483046621, + 961947.7340228327, + 950202.0747398927, + 940855.6530797088, + 942632.8300845332, + 943728.5626104218, + 951468.244273647, + 949822.8390477881, + 953402.0297732105, + 949716.6760799532, + 975228.5517105173, + 987137.4977917145, + 976291.7073484402, + 972182.8946801375, + 959757.4366244123, + 981422.2908684975, + 982397.8187979326, + 978504.7792785383, + 985273.6795080735, + 977007.5062546888, + 962501.1052683766, + 958271.8463475088, + 950547.8257397416, + 950813.5234779255, + 953864.7324460202, + 960016.9551473227, + 970746.464657049, + 982829.2794015955, + 969195.0065390804, + 982689.3608480592, + 964319.0462584958, + 969460.5961478064, + 949538.9093886046, + 946199.0324565931, + 969372.905074215, + 957198.2343847842, + 956413.2803963589, + 961301.1907152241, + 983283.473231165, + 978577.0330178489, + 973050.533479754, + 967641.3566248857, + 928652.3459703667, + 916711.2091609393, + 931225.7581704466, + 933700.7215615523, + 940032.4160829495, + 938817.4250849152, + 937018.2766361, + 955429.0306893053, + 933689.0951276519, + 934547.5682997877, + 940924.6149227251, + 922274.2786700858, + 934008.1707704184, + 945388.2073425553, + 935925.9707410528, + 943186.4136348969 ], "dates": [ "2020-01-01", @@ -615,406 +215,6 @@ "2020-04-06", "2020-04-07", "2020-04-08", - "2020-04-09", - "2020-04-10", - "2020-04-11", - "2020-04-12", - "2020-04-13", - "2020-04-14", - "2020-04-15", - "2020-04-16", - "2020-04-17", - "2020-04-18", - "2020-04-19", - "2020-04-20", - "2020-04-21", - "2020-04-22", - "2020-04-23", - "2020-04-24", - "2020-04-25", - "2020-04-26", - "2020-04-27", - "2020-04-28", - "2020-04-29", - "2020-04-30", - "2020-05-01", - "2020-05-02", - "2020-05-03", - "2020-05-04", - "2020-05-05", - "2020-05-06", - "2020-05-07", - "2020-05-08", - "2020-05-09", - "2020-05-10", - "2020-05-11", - "2020-05-12", - "2020-05-13", - "2020-05-14", - "2020-05-15", - "2020-05-16", - "2020-05-17", - "2020-05-18", - "2020-05-19", - "2020-05-20", - "2020-05-21", - "2020-05-22", - "2020-05-23", - "2020-05-24", - "2020-05-25", - "2020-05-26", - "2020-05-27", - "2020-05-28", - "2020-05-29", - "2020-05-30", - "2020-05-31", - "2020-06-01", - "2020-06-02", - "2020-06-03", - "2020-06-04", - "2020-06-05", - "2020-06-06", - "2020-06-07", - "2020-06-08", - "2020-06-09", - "2020-06-10", - "2020-06-11", - "2020-06-12", - "2020-06-13", - "2020-06-14", - "2020-06-15", - "2020-06-16", - "2020-06-17", - "2020-06-18", - "2020-06-19", - "2020-06-20", - "2020-06-21", - "2020-06-22", - "2020-06-23", - "2020-06-24", - "2020-06-25", - "2020-06-26", - "2020-06-27", - "2020-06-28", - "2020-06-29", - "2020-06-30", - "2020-07-01", - "2020-07-02", - "2020-07-03", - "2020-07-04", - "2020-07-05", - "2020-07-06", - "2020-07-07", - "2020-07-08", - "2020-07-09", - "2020-07-10", - "2020-07-11", - "2020-07-12", - "2020-07-13", - "2020-07-14", - "2020-07-15", - "2020-07-16", - "2020-07-17", - "2020-07-18", - "2020-07-19", - "2020-07-20", - "2020-07-21", - "2020-07-22", - "2020-07-23", - "2020-07-24", - "2020-07-25", - "2020-07-26", - "2020-07-27", - "2020-07-28", - "2020-07-29", - "2020-07-30", - "2020-07-31", - "2020-08-01", - "2020-08-02", - "2020-08-03", - "2020-08-04", - "2020-08-05", - "2020-08-06", - "2020-08-07", - "2020-08-08", - "2020-08-09", - "2020-08-10", - "2020-08-11", - "2020-08-12", - "2020-08-13", - "2020-08-14", - "2020-08-15", - "2020-08-16", - "2020-08-17", - "2020-08-18", - "2020-08-19", - "2020-08-20", - "2020-08-21", - "2020-08-22", - "2020-08-23", - "2020-08-24", - "2020-08-25", - "2020-08-26", - "2020-08-27", - "2020-08-28", - "2020-08-29", - "2020-08-30", - "2020-08-31", - "2020-09-01", - "2020-09-02", - "2020-09-03", - "2020-09-04", - "2020-09-05", - "2020-09-06", - "2020-09-07", - "2020-09-08", - "2020-09-09", - "2020-09-10", - "2020-09-11", - "2020-09-12", - "2020-09-13", - "2020-09-14", - "2020-09-15", - "2020-09-16", - "2020-09-17", - "2020-09-18", - "2020-09-19", - "2020-09-20", - "2020-09-21", - "2020-09-22", - "2020-09-23", - "2020-09-24", - "2020-09-25", - "2020-09-26", - "2020-09-27", - "2020-09-28", - "2020-09-29", - "2020-09-30", - "2020-10-01", - "2020-10-02", - "2020-10-03", - "2020-10-04", - "2020-10-05", - "2020-10-06", - "2020-10-07", - "2020-10-08", - "2020-10-09", - "2020-10-10", - "2020-10-11", - "2020-10-12", - "2020-10-13", - "2020-10-14", - "2020-10-15", - "2020-10-16", - "2020-10-17", - "2020-10-18", - "2020-10-19", - "2020-10-20", - "2020-10-21", - "2020-10-22", - "2020-10-23", - "2020-10-24", - "2020-10-25", - "2020-10-26", - "2020-10-27", - "2020-10-28", - "2020-10-29", - "2020-10-30", - "2020-10-31", - "2020-11-01", - "2020-11-02", - "2020-11-03", - "2020-11-04", - "2020-11-05", - "2020-11-06", - "2020-11-07", - "2020-11-08", - "2020-11-09", - "2020-11-10", - "2020-11-11", - "2020-11-12", - "2020-11-13", - "2020-11-14", - "2020-11-15", - "2020-11-16", - "2020-11-17", - "2020-11-18", - "2020-11-19", - "2020-11-20", - "2020-11-21", - "2020-11-22", - "2020-11-23", - "2020-11-24", - "2020-11-25", - "2020-11-26", - "2020-11-27", - "2020-11-28", - "2020-11-29", - "2020-11-30", - "2020-12-01", - "2020-12-02", - "2020-12-03", - "2020-12-04", - "2020-12-05", - "2020-12-06", - "2020-12-07", - "2020-12-08", - "2020-12-09", - "2020-12-10", - "2020-12-11", - "2020-12-12", - "2020-12-13", - "2020-12-14", - "2020-12-15", - "2020-12-16", - "2020-12-17", - "2020-12-18", - "2020-12-19", - "2020-12-20", - "2020-12-21", - "2020-12-22", - "2020-12-23", - "2020-12-24", - "2020-12-25", - "2020-12-26", - "2020-12-27", - "2020-12-28", - "2020-12-29", - "2020-12-30", - "2020-12-31", - "2021-01-01", - "2021-01-02", - "2021-01-03", - "2021-01-04", - "2021-01-05", - "2021-01-06", - "2021-01-07", - "2021-01-08", - "2021-01-09", - "2021-01-10", - "2021-01-11", - "2021-01-12", - "2021-01-13", - "2021-01-14", - "2021-01-15", - "2021-01-16", - "2021-01-17", - "2021-01-18", - "2021-01-19", - "2021-01-20", - "2021-01-21", - "2021-01-22", - "2021-01-23", - "2021-01-24", - "2021-01-25", - "2021-01-26", - "2021-01-27", - "2021-01-28", - "2021-01-29", - "2021-01-30", - "2021-01-31", - "2021-02-01", - "2021-02-02", - "2021-02-03", - "2021-02-04", - "2021-02-05", - "2021-02-06", - "2021-02-07", - "2021-02-08", - "2021-02-09", - "2021-02-10", - "2021-02-11", - "2021-02-12", - "2021-02-13", - "2021-02-14", - "2021-02-15", - "2021-02-16", - "2021-02-17", - "2021-02-18", - "2021-02-19", - "2021-02-20", - "2021-02-21", - "2021-02-22", - "2021-02-23", - "2021-02-24", - "2021-02-25", - "2021-02-26", - "2021-02-27", - "2021-02-28", - "2021-03-01", - "2021-03-02", - "2021-03-03", - "2021-03-04", - "2021-03-05", - "2021-03-06", - "2021-03-07", - "2021-03-08", - "2021-03-09", - "2021-03-10", - "2021-03-11", - "2021-03-12", - "2021-03-13", - "2021-03-14", - "2021-03-15", - "2021-03-16", - "2021-03-17", - "2021-03-18", - "2021-03-19", - "2021-03-20", - "2021-03-21", - "2021-03-22", - "2021-03-23", - "2021-03-24", - "2021-03-25", - "2021-03-26", - "2021-03-27", - "2021-03-28", - "2021-03-29", - "2021-03-30", - "2021-03-31", - "2021-04-01", - "2021-04-02", - "2021-04-03", - "2021-04-04", - "2021-04-05", - "2021-04-06", - "2021-04-07", - "2021-04-08", - "2021-04-09", - "2021-04-10", - "2021-04-11", - "2021-04-12", - "2021-04-13", - "2021-04-14", - "2021-04-15", - "2021-04-16", - "2021-04-17", - "2021-04-18", - "2021-04-19", - "2021-04-20", - "2021-04-21", - "2021-04-22", - "2021-04-23", - "2021-04-24", - "2021-04-25", - "2021-04-26", - "2021-04-27", - "2021-04-28", - "2021-04-29", - "2021-04-30", - "2021-05-01", - "2021-05-02", - "2021-05-03", - "2021-05-04", - "2021-05-05", - "2021-05-06", - "2021-05-07", - "2021-05-08", - "2021-05-09", - "2021-05-10", - "2021-05-11", - "2021-05-12", - "2021-05-13", - "2021-05-14" + "2020-04-09" ] } \ No newline at end of file diff --git a/src/quant_research_starter.egg-info/SOURCES.txt b/src/quant_research_starter.egg-info/SOURCES.txt index fd7f853..16db10b 100644 --- a/src/quant_research_starter.egg-info/SOURCES.txt +++ b/src/quant_research_starter.egg-info/SOURCES.txt @@ -10,7 +10,6 @@ src/quant_research_starter.egg-info/dependency_links.txt src/quant_research_starter.egg-info/entry_points.txt src/quant_research_starter.egg-info/requires.txt src/quant_research_starter.egg-info/top_level.txt -src/quant_research_starter/backtest/__init__.py src/quant_research_starter/backtest/vectorized.py src/quant_research_starter/dashboard/streamlit_app.py src/quant_research_starter/data/__init__.py @@ -37,4 +36,5 @@ tests/test_data.py tests/test_factors.py tests/test_metrics.py tests/test_plotting.py +tests/test_plotting.py tests/test_validator.py \ No newline at end of file diff --git a/test_cli.py b/test_cli.py index 8606676..8681486 100644 --- a/test_cli.py +++ b/test_cli.py @@ -15,13 +15,13 @@ def run_command(cmd): print(f"Running: {cmd}") print('='*60) result = subprocess.run(cmd, shell=True, capture_output=True, text=True) - + if result.stdout: print(result.stdout) if result.stderr and result.returncode != 0: print(f"ERROR: {result.stderr}") return False - + return result.returncode == 0 @@ -29,21 +29,21 @@ def main(): """Run all CLI tests""" print("\n🧪 Testing QuantResearch CLI") print("="*60) - + # Define test directories test_data_dir = Path("test_data") test_output_dir = Path("test_output") - + # Create test directories test_data_dir.mkdir(exist_ok=True) test_output_dir.mkdir(exist_ok=True) - + # Test 1: Show help success = run_command("python -m quant_research_starter.cli --help") if not success: print("\n❌ Test 1 FAILED: Help command") sys.exit(1) - + # Test 2: Generate data success = run_command( "python -m quant_research_starter.cli generate-data " @@ -52,7 +52,7 @@ def main(): if not success: print("\n❌ Test 2 FAILED: Generate data") sys.exit(1) - + # Test 3: Compute factors success = run_command( "python -m quant_research_starter.cli compute-factors " @@ -61,7 +61,7 @@ def main(): if not success: print("\n❌ Test 3 FAILED: Compute factors") sys.exit(1) - + # Test 4: Run backtest success = run_command( "python -m quant_research_starter.cli backtest " @@ -71,7 +71,7 @@ def main(): if not success: print("\n❌ Test 4 FAILED: Run backtest") sys.exit(1) - + # Verify output files exist print("\n📁 Checking output files...") files_to_check = [ @@ -80,7 +80,7 @@ def main(): test_output_dir / "backtest_results.json", test_output_dir / "backtest_plot.png" ] - + all_exist = True for file_path in files_to_check: if file_path.exists(): @@ -88,16 +88,16 @@ def main(): else: print(f"❌ {file_path} missing!") all_exist = False - + if not all_exist: print("\n❌ Some output files are missing") sys.exit(1) - + # Summary print("\n" + "="*60) print("✅ ALL TESTS PASSED!") print("="*60) - print(f"\n📂 Test files created in:") + print("\n📂 Test files created in:") print(f" - {test_data_dir}/") print(f" - {test_output_dir}/") print("\n💡 You can view the results and plots in the test_output directory.")