Back to projects

Fundamental Analysis · Buy-Side Tool · Python Desktop

French Small Caps Screener

This project is a desktop tool for fundamental screening on French small caps. The goal is to build a full buy-side analysis chain: define an investable universe, collect and store financial data, compute fundamental ratios, build transparent multi-factor scoring, and surface the best ideas as a usable watchlist. The point is less to predict the market mechanically than to reproduce a first layer of analyst work: filter, compare, prioritize, and document the companies worth studying.

PythonFundamental analysisPySide6SQLAlchemySQLitepandasnumpypytestruff / blackpre-commit

What this project demonstrates

Ability to turn an investment problem into a concrete tool: build a French small-cap universe, structure financial data, compute fundamental ratios, design interpretable multi-factor scoring, persist data locally, and deliver usable outputs for analyst prioritization.

French Small Caps Screener - detailed view

My role

I frame the investment universe, design the architecture, model the data, implement repositories, build ratio services, define the scoring logic, write tests, and document the screening methodology.

Context

The project starts from a straightforward buy-side need: reduce a broad universe to a list of companies that are genuinely worth reviewing, with a consistent reading of ratios, attention points, and first comparison elements.

Objective

Build a buy-side pre-selection tool able to filter, compare, and prioritize French small caps while keeping ratios interpretable, the local data base usable, and the resulting watchlist useful for shaping an initial investment hypothesis.

Deep dive

Technical reading of the project

The project is already well advanced on the data layer and business logic. The challenge is not only to compute ratios, but to produce a pre-selection tool that a buy-side analyst can actually use to move faster from a broad universe to an argued watchlist.

  • Build an investable French small-cap universe with explicit filtering rules.
  • Store company data, financial statements, price history, and screening snapshots locally.
  • Compute fundamental ratios to compare valuation, quality, growth, and balance-sheet strength.
  • Use interpretable multi-factor scoring to prioritize the names worth reviewing.
  • Deliver watchlists and outputs that can support deeper fundamental research.

Integrated fundamental analysis

The project does not stop at ranking companies through ratios. It aims to reproduce a first stage of fundamental analyst work: understanding business quality, valuation, balance-sheet strength, growth, financial risk, and the overall consistency of the investment profile.

  • Valuation: P/E, P/B, EV/EBITDA.
  • Quality: margins, profitability, and cash generation.
  • Growth: revenue, earnings, and historical momentum.
  • Balance sheet: net debt, cash, and leverage.
  • Company profile: sector, industry, website, and business summary.
  • Analyst data: recommendations, target price, and potential upside.

Work already completed

The project is not just a conceptual idea. The data layer and business logic are already substantially built.

  • Data models: Company, FinancialStatement, PriceHistory, ScreeningSnapshot.
  • CRUD repositories with tests.
  • Financial-ratio services.
  • Multi-factor scoring service.
  • Screening and filtering service.
  • Strict UI → Services → Repositories architecture.
  • Unit tests on repositories and services.

Why it is buy-side

The goal is not to predict stock performance mechanically. It is to help an analyst reduce a broad universe to a usable watchlist and then identify the names that deserve deeper fundamental work.

Gallery

Key screens and visualizations

Buy-side small-cap screening engine for French equities under development

Preview of the desktop screener with ratio outputs, company prioritization, and analyst-oriented watchlist logic.

Architecture

Technical organization

UI / PySide6

The interface layer handles display, filters, and user interaction. It remains intentionally thin and does not carry business logic.

Services

The services concentrate ratio calculations, scoring, screening, and business rules. This is the layer that transforms raw data into usable pre-selection outputs.

Repositories

Repositories encapsulate database, file, and external-provider access. They isolate persistence and ingestion so the rest of the code stays testable and maintainable.

Database

SQLite acts as the local database and SQLAlchemy as the structured access layer. The objective is simple, traceable persistence suited to a local-first desktop workflow.

Pipeline

Data flow

  1. 1.Define the investable universe for France, including size bounds and exclusion rules.
  2. 2.Collect financial and market data from external sources, then check them for consistency.
  3. 3.Run a fetch → parse → store pipeline to make ingestion and database writes more reliable.
  4. 4.Compute fundamental ratios and sub-scores across the main analysis axes.
  5. 5.Aggregate the sub-scores into an interpretable composite score.
  6. 6.Return the best candidates through watchlists, snapshots, and exportable outputs.

Technical choices

Structuring decisions

Universe first, scoring second

The project prioritizes a genuinely investable universe before any ranking logic. A good ranking has little value if the starting universe is poorly defined.

Interpretable scoring

Ratios and weightings remain explicit so each score can be reviewed, debated, and challenged the way a buy-side analyst would do it.

Testable local-first architecture

The UI → Services → Repositories split makes unit testing easier, limits side effects, and lets the tool evolve without depending on heavy infrastructure.

Pre-selection, not recommendation

The tool is designed to help filter and prioritize. It does not replace account reading or a full investment thesis.

Reliability

Quality and controls

  • Unit tests already present on repositories and services.
  • Strict separation between display, business logic, and data access.
  • Quality tooling integrated with pytest, ruff / black, and pre-commit.

Limitations

Current attention points

  • Data coverage still depends on free data sources.
  • External ingestion is still being consolidated.
  • Factor backtesting is not finalized yet.
  • Survivorship bias still has to be handled properly.
  • Some fundamental data still requires manual checks.
  • The tool does not replace full fundamental analysis; it is primarily meant to prioritize names.

Roadmap

Next steps

  • Current phase: the data layer and business logic are already well advanced.
  • Next step 1: external ingestion through a financial-data provider.
  • Next step 2: a full fetch → parse → store pipeline.
  • Next step 3: complete PySide6 desktop interface.
  • Next step 4: CSV / Excel export.
  • Next step 5: backtesting and bias controls covering survivorship bias, point-in-time data, and source quality.

Challenges

Main project challenges

Define a coherent investment universe with market, size, liquidity, and exclusion filters without introducing obvious bias.

Handle imperfect financial data with missing values, heterogeneous formats, shifted fiscal years, and inconsistent accounting definitions.

Design robust ratios that can survive edge cases such as negative earnings, unusual EV values, inconsistent net debt, and extreme outliers.

Build a multi-factor score that stays economically meaningful and interpretable from an investment-style perspective.

Outcomes and learnings

What I take away

Strict UI → Services → Repositories architecture already applied to separate display, business logic, and data access.

Local data model covering Company, FinancialStatement, PriceHistory, and ScreeningSnapshot.

Services already implemented for financial ratios, multi-factor scoring, and screening or filtering.

Credible working base to produce watchlists and document the first names worth investigating further through fundamental analysis.

Other projects

Continue exploring

Wealth Tracking Application - project preview

Personal Finance · Python · PyQt6

Wealth Tracking Application

PyQt6 + SQLite desktop application to centralize multi-asset accounts, rebuild weekly history, and analyze portfolio performance.

View this project
Portfolio Backtesting and Optimization - project preview

Quantitative Finance · Analysis · Python

Portfolio Backtesting and Optimization

Python environment to backtest strategies, compare risk and return metrics, and analyze portfolio behavior.

View this project

Discuss

I can detail technical choices and outcomes during an interview.

If this project is relevant for you, I can detail the initial need, data structure, assumptions, challenges encountered, and analysis limitations.