Skip to content
All library documents

Small-Cap Stock Screening with Money Flow and Profitability Filters

Article Lumibot

Summary

This proposed Chinese-equity screen combines three initial conditions: market capitalization below 10 billion yuan, no reported losses, and a daily increase in position share above five percent. It also uses the product of price change and large-order net flow as a signal, interpreting positive price and substantial trading activity as evidence of market attention. The accompanying suggested refinements add profitability and balance-sheet checks, as well as technical and fundamental assessments.

The post explains the rationale for each condition and acknowledges that a narrow screen can miss attractive companies and suffer drawdowns in sharp market moves. It offers example field-based calculations for net flow, price change, turnover, EBITDA margin, debt to equity, trend, and a fundamentals score. These are illustrative screening rules, not a validated trading system: no historical test, portfolio construction, execution assumptions, or performance results are supplied. The stated idea that small capitalization implies greater price fluctuation also highlights risk that a trader would need to address.

Key ideas

  • The screen targets companies below 10 billion yuan in market capitalization that report no losses.
  • A position-share increase threshold and large-order net flow combined with price change are used as short-term interest signals.
  • Suggested additions include profitability, leverage, technical trend, and fundamental scores.
  • The author warns that the simple screen ignores relevant information and may face large drawdowns.
  • No backtest or realized strategy performance is reported.

Tags

Full text
# backtesting


Backtesting Trading Strategies in Python with LumiBot
*****************************************************

.. meta::
   :description: Backtest Python trading strategies with LumiBot using Yahoo, ThetaData, Polygon, Databento, Interactive Brokers, Polymarket, or your own data.

Choose a backtesting source from the strategy's asset class and required bar
interval:

.. list-table:: LumiBot backtesting data choices
   :header-rows: 1
   :widths: 22 22 24 32

   * - Need
     - Start with
     - Typical granularity
     - Setup
   * - Daily stocks and ETFs
     - :doc:`Yahoo <backtesting.yahoo>`
     - Daily
     - No data-provider credentials
   * - Intraday stocks and options
     - :doc:`ThetaData <backtesting.thetadata>`
     - Minute, hour, and daily
     - Data Downloader and provider access
   * - Stocks, options, forex, or crypto
     - :doc:`Polygon.io <backtesting.polygon>`
     - Intraday and daily
     - Polygon.io API key
   * - Futures and market-data schemas
     - :doc:`Databento <backtesting.databento>`
     - Tick through daily, by dataset
     - Databento API key and dataset access
   * - Your own stock or futures data
     - :doc:`Pandas <backtesting.pandas>`
     - Whatever the supplied file contains
     - Local data prepared in LumiBot's format
   * - Interactive Brokers history
     - :doc:`IBKR REST <backtesting.ibkr>`
     - Provider-supported intervals
     - Client Portal and Data Downloader access
   * - Options with your own Alpaca account
     - :doc:`Alpaca <backtesting.alpaca>`
     - Minute and daily
     - Alpaca API key (free accounts include option history from about February 2024)
   * - Prediction contracts
     - Polymarket
     - Market price history
     - Polymarket market identifiers

Use Yahoo for the simplest free daily-stock example. Use ThetaData when a stock
or option strategy needs intraday history, and use Pandas when you already own
the data and can prepare it in LumiBot's input format.

Select the provider with ``BACKTESTING_DATA_SOURCE`` or pass a data-source class
in Python. **An environment setting takes precedence over the class in code.**
See :ref:`Choose your backtest data <backtest-data-source-selection>` for examples,
defaults, and help with an unexpected provider.

Managed Backtesting on BotSpot
==============================

Backtesting is better on `BotSpot <https://botspot.trade/sales?showLogin=1&utm_source=documentation&utm_medium=backtesting&utm_campaign=lumibot&utm_content=managed_backtesting_text&sample=lumibot_deploy_sample>`_ when you want to move faster than a local setup. BotSpot already has the workflow around Lumibot: hosted data setup, parallel backtest workers, generated artifacts, charts, logs, and the path from a passing backtest into paper or live trading.

- **Backtesting data included.** Use supported hosted stock, futures, options, macro, filings, and other data sources without sourcing every vendor, API key, downloader, and local file yourself. Some data is included; premium datasets can be much cheaper than buying direct subscriptions.
- **Parallel experiments.** Launch multiple strategy variants on BotSpot servers and compare results instead of waiting for one local run at a time.
- **Better artifacts.** Inspect charts, trades, logs, files, decisions, and audit history from one place instead of stitching together local output folders.
- **Lumibot-tuned iteration.** BotSpot's AI workflows and MCP tools understand Lumibot strategy structure, so Codex, Claude Code, Cursor, and other agents can run backtests and inspect results instead of only editing Python.
- **Ready for deployment.** A strategy that survives backtesting can move into paper or live trading with supported broker connections, monitoring, alerts, and kill-switch controls already available.

.. image:: ../docs/assets/readme/cta_deploy_on_botspot.png
   :alt: Try backtesting a sample Lumibot strategy on BotSpot
   :align: center
   :width: 520px
   :target: https://botspot.trade/sales?showLogin=1&utm_source=documentation&utm_medium=backtesting&utm_campaign=lumibot&utm_content=managed_backtesting_button&sample=lumibot_deploy_sample

Agentic Backtesting
===================

Lumibot also supports **agentic backtesting**. A strategy can create one or more AI agents, run them from normal lifecycle methods, analyze point-in-time data with DuckDB, and replay identical agent runs from cache on the next backtest instead of paying for another model call.

This matters if you want:

- an **AI trading agent** that makes decisions inside ``on_trading_iteration()``
- an **LLM trading bot** that can also be tested historically
- external **MCP tools** attached to a strategy
- backtest/live parity for agent-driven strategies

See :doc:`agents` for the full agent runtime guide and usage examples.

Files Generated from Backtesting
================================

When you run a backtest, several important files are generated, each prefixed by the strategy name and the date. These files provide detailed insights into the performance and behavior of the strategy.

.. toctree::
   :maxdepth: 2
   :caption: Contents:

   backtesting.how_to_backtest
   backtesting.backtesting_function
   backtesting.performance
   backtesting.yahoo
   backtesting.pandas
   backtesting.polygon
   backtesting.databento
   backtesting.thetadata
   backtesting.ibkr
   backtesting.alpaca
   backtesting.tearsheet_html
   backtesting.trades_files
   backtesting.indicators_files
   backtesting.logs_csv

Learn to build and backtest with Rob
------------------------------------

Learn with Rob Grzesik, creator of LumiBot. Join the FREE AI challenge.

.. image:: ../docs/assets/ai-trading/rob-challenge-backtest.png
   :alt: Rob Grzesik, creator of LumiBot. Join the FREE AI challenge.
   :width: 640px
   :align: center
   :class: lumibot-learning-image
   :target: https://botspot.trade/challenges?utm_source=documentation&utm_medium=docs&utm_campaign=lumibot_ai_trading&utm_content=backtesting_challenge_image

Shown in full with attribution under the source's licence. Licence: GPL-3.0

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.