Repository Analysis

AI4Finance-Foundation/FinRL

FinRL®: Financial Reinforcement Learning. 🔥

18.3 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of AI4Finance-Foundation/FinRL, a Jupyter Notebook project with 15,724 GitHub stars. SynthScan v2.0 examined 19,762 lines of code across 107 source files, recording 262 pattern matches distributed across 13 syntactic categories. The overall adjusted score of 18.3 places this repository in the Moderate AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

18.3
Adjusted Score
18.3
Raw Score
100%
Time Factor
2026-07-13
Last Push
15.7K
Stars
Jupyter Notebook
Language
19.8K
Lines of Code
107
Files
262
Pattern Hits
2026-07-14
Scan Date
0.11
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 12MEDIUM 16LOW 234

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 262 distinct pattern matches across 13 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Unused Imports122 hits · 122 pts
SeverityFileLineSnippetContext
LOWsetup.py1CODE
LOWfinrl/plot.py1CODE
LOWfinrl/plot.py15CODE
LOWfinrl/config.py2CODE
LOWfinrl/config_private.py1CODE
LOWfinrl/trade.py1CODE
LOWfinrl/__init__.py1CODE
LOWfinrl/__init__.py3CODE
LOWfinrl/__init__.py4CODE
LOWfinrl/__init__.py5CODE
LOWfinrl/test.py1CODE
LOWfinrl/test.py4CODE
LOWfinrl/train.py1CODE
LOWfinrl/train.py5CODE
LOWfinrl/train.py6CODE
LOWfinrl/main.py1CODE
LOWfinrl/main.py5CODE
LOWfinrl/config_tickers.py1CODE
LOWfinrl/__main__.py1CODE
LOWfinrl/meta/data_processor.py1CODE
LOWfinrl/meta/meta_config.py1CODE
LOW…v_portfolio_optimization/env_portfolio_optimization.py3CODE
LOWfinrl/meta/env_portfolio_allocation/env_portfolio.py1CODE
LOWfinrl/meta/env_cryptocurrency_trading/env_btc_ccxt.py1CODE
LOW…meta/env_cryptocurrency_trading/env_multiple_crypto.py1CODE
LOWfinrl/meta/paper_trading/common.py4CODE
LOWfinrl/meta/paper_trading/alpaca.py3CODE
LOWfinrl/meta/data_processors/processor_alpaca.py1CODE
LOWfinrl/meta/data_processors/processor_alpaca.py3CODE
LOWfinrl/meta/data_processors/processor_alpaca.py5CODE
LOWfinrl/meta/data_processors/processor_alpaca.py6CODE
LOWfinrl/meta/data_processors/processor_alpaca.py11CODE
LOWfinrl/meta/data_processors/processor_eodhd.py1CODE
LOWfinrl/meta/data_processors/processor_eodhd.py7CODE
LOWfinrl/meta/data_processors/processor_eodhd.py11CODE
LOWfinrl/meta/data_processors/processor_eodhd.py12CODE
LOWfinrl/meta/data_processors/processor_quantconnect.py1CODE
LOWfinrl/meta/data_processors/processor_sinopac.py1CODE
LOWfinrl/meta/data_processors/processor_ccxt.py1CODE
LOWfinrl/meta/data_processors/processor_wrds.py1CODE
LOWfinrl/meta/data_processors/processor_wrds.py8CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py3CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py7CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py10CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py11CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py12CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py13CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py14CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py15CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py16CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py21CODE
LOWfinrl/meta/data_processors/processor_joinquant.py1CODE
LOWfinrl/meta/data_processors/func.py1CODE
LOW…rl/meta/env_stock_trading/env_stocktrading_stoploss.py1CODE
LOWfinrl/meta/env_stock_trading/env_nas100_wrds.py1CODE
LOWfinrl/meta/env_stock_trading/env_stocktrading.py1CODE
LOWfinrl/meta/env_stock_trading/env_stocktrading.py3CODE
LOW…meta/env_stock_trading/env_stocktrading_cashpenalty.py1CODE
LOWfinrl/meta/env_stock_trading/env_stock_papertrading.py1CODE
LOWfinrl/meta/env_stock_trading/env_stocktrading_np.py1CODE
62 more matches not shown…
Cross-File Repetition12 hits · 60 pts
SeverityFileLineSnippetContext
HIGHfinrl/meta/paper_trading/common.py0provides implementations for drl algorithms attributes ---------- env: gym environment class user-defined class methods STRING
HIGHfinrl/agents/elegantrl/models.py0provides implementations for drl algorithms attributes ---------- env: gym environment class user-defined class methods STRING
HIGHfinrl/agents/stablebaselines3/models.py0provides implementations for drl algorithms attributes ---------- env: gym environment class user-defined class methods STRING
HIGHfinrl/meta/data_processors/processor_alpaca.py0add turbulence index from a precalcualted dataframe :param data: (df) pandas dataframe :return: (df) pandas dataframeSTRING
HIGHfinrl/meta/data_processors/processor_eodhd.py0add turbulence index from a precalcualted dataframe :param data: (df) pandas dataframe :return: (df) pandas dataframeSTRING
HIGHfinrl/meta/data_processors/processor_sinopac.py0add turbulence index from a precalcualted dataframe :param data: (df) pandas dataframe :return: (df) pandas dataframeSTRING
HIGHfinrl/meta/data_processors/processor_wrds.py0add turbulence index from a precalcualted dataframe :param data: (df) pandas dataframe :return: (df) pandas dataframeSTRING
HIGHfinrl/meta/data_processors/processor_yahoofinance.py0add turbulence index from a precalcualted dataframe :param data: (df) pandas dataframe :return: (df) pandas dataframeSTRING
HIGHfinrl/meta/preprocessor/preprocessors.py0add turbulence index from a precalcualted dataframe :param data: (df) pandas dataframe :return: (df) pandas dataframeSTRING
HIGHfinrl/meta/preprocessor/tusharedownloader.py0fetches data from ibkr api parameters ---------- returns ------- `pd.dataframe` 7 columns: a date, open, high, low, closSTRING
HIGHfinrl/meta/preprocessor/yahoodownloader.py0fetches data from ibkr api parameters ---------- returns ------- `pd.dataframe` 7 columns: a date, open, high, low, closSTRING
HIGHfinrl/meta/preprocessor/ibkrdownloader.py0fetches data from ibkr api parameters ---------- returns ------- `pd.dataframe` 7 columns: a date, open, high, low, closSTRING
Structural Annotation Overuse16 hits · 34 pts
SeverityFileLineSnippetContext
LOWREADME.md118### Step 1: Clone the RepositoryCOMMENT
LOWREADME.md125### Step 2: Create and Activate Virtual EnvironmentCOMMENT
LOWREADME.md132### Step 3: Install FinRLCOMMENT
LOWREADME.md138### Step 4: Run the ScriptsCOMMENT
LOWfinrl/meta/data_processors/processor_alpaca.py142 # Step 1: Merging dataframes to avoid loopCOMMENT
LOWfinrl/meta/data_processors/processor_alpaca.py150 # Step 2: Handling NaN values efficientlyCOMMENT
LOWfinrl/meta/data_processors/processor_alpaca.py173 # Step 3: Data type conversionCOMMENT
LOWfinrl/meta/data_processors/processor_eodhd.py37 # Step 1: Get NASDAQ 100 componentsCOMMENT
LOWfinrl/meta/data_processors/processor_eodhd.py47 # Step 2: Fetch historical minute data for each tickerCOMMENT
LOWfinrl/meta/data_processors/processor_eodhd.py93 # Step 3: Save the dataCOMMENT
LOWfinrl/meta/data_processors/processor_eodhd.py118 # Step 1: First pass to collect all unique datesCOMMENT
LOWfinrl/meta/data_processors/processor_eodhd.py141 # Step 2: Second pass to update each file with the 'Day' columnCOMMENT
LOWexamples/README.md3### Step 1: Clone the RepositoryCOMMENT
LOWexamples/README.md10### Step 2: Create and Activate Virtual EnvironmentCOMMENT
LOWexamples/README.md17### Step 3: Install FinRLCOMMENT
LOWexamples/README.md23### Step 4: Run the ScriptsCOMMENT
Deep Nesting28 hits · 26 pts
SeverityFileLineSnippetContext
LOWfinrl/plot.py258CODE
LOWfinrl/main.py51CODE
LOW…v_portfolio_optimization/env_portfolio_optimization.py200CODE
LOW…v_portfolio_optimization/env_portfolio_optimization.py571CODE
LOWfinrl/meta/paper_trading/alpaca.py20CODE
LOWfinrl/meta/paper_trading/alpaca.py147CODE
LOWfinrl/meta/data_processors/processor_alpaca.py411CODE
LOWfinrl/meta/data_processors/processor_eodhd.py23CODE
LOWfinrl/meta/data_processors/processor_eodhd.py166CODE
LOWfinrl/meta/data_processors/processor_eodhd.py205CODE
LOWfinrl/meta/data_processors/processor_eodhd.py242CODE
LOWfinrl/meta/data_processors/processor_sinopac.py91CODE
LOWfinrl/meta/data_processors/processor_ccxt.py16CODE
LOWfinrl/meta/data_processors/processor_ccxt.py24CODE
LOWfinrl/meta/data_processors/processor_wrds.py20CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py182CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py274CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py531CODE
LOWfinrl/meta/env_stock_trading/env_stocktrading.py113CODE
LOWfinrl/meta/env_stock_trading/env_stocktrading.py231CODE
LOWfinrl/meta/env_stock_trading/env_stock_papertrading.py17CODE
LOWfinrl/agents/stablebaselines3/tune_sb3.py33CODE
LOWfinrl/agents/stablebaselines3/tune_sb3.py108CODE
LOWfinrl/agents/rllib/models.py80CODE
LOWfinrl/agents/rllib/models.py113CODE
LOW…pplications/stock_trading/fundamental_stock_trading.py4CODE
LOW…pplications/stock_trading/fundamental_stock_trading.py413CODE
LOW…pplications/stock_trading/fundamental_stock_trading.py519CODE
Hyper-Verbose Identifiers23 hits · 23 pts
SeverityFileLineSnippetContext
LOWfinrl/plot.py29def convert_daily_return_to_pyfolio_ts(df):CODE
LOWfinrl/main.py45def check_and_make_directories(directories: list[str]):CODE
LOWfinrl/meta/data_processor.py13class DataProcessor:CODE
LOW…v_portfolio_optimization/env_portfolio_optimization.py403 def _get_state_and_info_from_time_index(self, time_index):CODE
LOW…meta/env_cryptocurrency_trading/env_multiple_crypto.py114 def _generate_action_normalizer(self):CODE
LOWfinrl/meta/data_processors/processor_eodhd.py205 def nber_present_tics_per_day(self, max_days, tics_in_more_than_90perc_days):CODE
LOWfinrl/meta/data_processors/processor_joinquant.py46 def calc_trade_days_by_joinquant(self, start_day, end_day):CODE
LOWfinrl/meta/data_processors/func.py13def calc_stockname_from_filename(filename):CODE
LOWfinrl/meta/data_processors/func.py91def calc_train_trade_starts_ends_if_rolling(CODE
LOWfinrl/agents/stablebaselines3/tune_sb3.py108 def default_sample_hyperparameters(self, trial: optuna.Trial):CODE
LOWfinrl/agents/portfolio_optimization/architectures.py514 def _create_edge_type_for_batch(self, batch, edge_type):CODE
LOW…ications/stock_trading/stock_trading_rolling_window.py31def stock_trading_rolling_window(CODE
LOWunit_tests/test_core.py55def test_check_and_make_directories(DIRS: list[str]) -> None:CODE
LOWunit_tests/test_core.py84def test_feature_engineer_no_turbulence(CODE
LOWunit_tests/test_core.py114def test_feature_engineer_turbulence_less_than_a_year(CODE
LOWunit_tests/test_core.py148def test_feature_engineer_turbulence_more_than_a_year(CODE
LOWunit_tests/preprocessors/test_yahoodownloader.py38 def test_adjust_prices_calculates_correctly(self):CODE
LOWunit_tests/preprocessors/test_yahoodownloader.py82 def test_adjust_prices_drops_columns(self):CODE
LOWunit_tests/preprocessors/test_groupby_scaler.py39def test_fit_transform_specific_column():CODE
LOWunit_tests/preprocessors/test_groupby_scaler.py60def test_fit_transform_other_df():CODE
LOWunit_tests/preprocessors/test_groupby_scaler.py85def test_minmax_fit_transform():CODE
LOWunit_tests/preprocessors/test_groupby_scaler.py106def test_minmax_fit_transform_specific_column():CODE
LOWunit_tests/preprocessors/test_groupby_scaler.py127def test_minmax_fit_transform_other_df():CODE
Decorative Section Separators7 hits · 21 pts
SeverityFileLineSnippetContext
MEDIUMfinrl/meta/paper_trading/common.py2# ----------------------------------------------------------------------------------------------------------------------COMMENT
MEDIUMfinrl/meta/paper_trading/common.py15# ----------------------------------------------------------------------------------------------------------------------COMMENT
MEDIUMfinrl/meta/paper_trading/common.py551# ----------------------------------------------------------------------------------------------------------------------COMMENT
MEDIUMfinrl/meta/paper_trading/common.py686# ----------------------------------------------------------------------------------------------------------------------COMMENT
MEDIUMfinrl/meta/paper_trading/common.py744# ----------------------------------------------------------------------------------------------------------------------COMMENT
MEDIUMfinrl/meta/paper_trading/common.py799# ----------------------------------------------------------------------------------------------------------------------COMMENT
MEDIUMfinrl/meta/paper_trading/common.py842# ----------------------------------------------------------------------------------------------------------------------COMMENT
Excessive Try-Catch Wrapping14 hits · 20 pts
SeverityFileLineSnippetContext
MEDIUMfinrl/meta/data_processors/processor_eodhd.py87 print(f"Error fetching data for {ticker}: {response.text}")CODE
LOWfinrl/meta/data_processors/processor_eodhd.py200 except Exception as e:CODE
LOWfinrl/meta/data_processors/processor_eodhd.py234 except Exception as e:CODE
LOWfinrl/meta/data_processors/processor_eodhd.py277 except Exception as e:CODE
LOWfinrl/meta/data_processors/processor_sinopac.py127 except Exception as e:CODE
MEDIUMfinrl/meta/data_processors/processor_sinopac.py128 print(f"Error calculating {indicator}: {str(e)}")CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py103 except Exception as e:CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py172 except Exception as e:CODE
MEDIUMfinrl/meta/data_processors/processor_yahoofinance.py173 print(f"Error fetching data for {stock_name}: {e}")CODE
LOWfinrl/meta/data_processors/processor_yahoofinance.py403 except Exception as e:CODE
MEDIUMfinrl/meta/data_processors/processor_yahoofinance.py130def safe_convert(value, dtype):CODE
LOWfinrl/meta/preprocessor/preprocessors.py228 except Exception as e:CODE
LOWfinrl/meta/preprocessor/shioajidownloader.py56 except Exception as e:CODE
MEDIUMfinrl/meta/preprocessor/shioajidownloader.py77 print(f"Error renaming columns: {e}")CODE
AI Structural Patterns18 hits · 18 pts
SeverityFileLineSnippetContext
LOWfinrl/plot.py258CODE
LOWfinrl/plot.py337CODE
LOW…v_portfolio_optimization/env_portfolio_optimization.py73CODE
LOWfinrl/meta/env_cryptocurrency_trading/env_btc_ccxt.py7CODE
LOWfinrl/meta/data_processors/processor_alpaca.py312CODE
LOWfinrl/meta/data_processors/processor_sinopac.py41CODE
LOW…rl/meta/env_stock_trading/env_stocktrading_stoploss.py64CODE
LOWfinrl/meta/env_stock_trading/env_nas100_wrds.py15CODE
LOWfinrl/meta/env_stock_trading/env_stocktrading.py35CODE
LOW…meta/env_stock_trading/env_stocktrading_cashpenalty.py52CODE
LOWfinrl/meta/env_stock_trading/env_stocktrading_np.py9CODE
LOWfinrl/agents/rllib/drllibv2.py125CODE
LOWfinrl/agents/portfolio_optimization/algorithms.py34CODE
LOWfinrl/agents/portfolio_optimization/architectures.py101CODE
LOWfinrl/agents/portfolio_optimization/architectures.py245CODE
LOWfinrl/agents/portfolio_optimization/architectures.py278CODE
LOWfinrl/agents/portfolio_optimization/architectures.py464CODE
LOW…pplications/stock_trading/fundamental_stock_trading.py347CODE
Verbosity Indicators8 hits · 16 pts
SeverityFileLineSnippetContext
LOWfinrl/meta/data_processors/processor_alpaca.py142 # Step 1: Merging dataframes to avoid loopCOMMENT
LOWfinrl/meta/data_processors/processor_alpaca.py150 # Step 2: Handling NaN values efficientlyCOMMENT
LOWfinrl/meta/data_processors/processor_alpaca.py173 # Step 3: Data type conversionCOMMENT
LOWfinrl/meta/data_processors/processor_eodhd.py37 # Step 1: Get NASDAQ 100 componentsCOMMENT
LOWfinrl/meta/data_processors/processor_eodhd.py47 # Step 2: Fetch historical minute data for each tickerCOMMENT
LOWfinrl/meta/data_processors/processor_eodhd.py93 # Step 3: Save the dataCOMMENT
LOWfinrl/meta/data_processors/processor_eodhd.py118 # Step 1: First pass to collect all unique datesCOMMENT
LOWfinrl/meta/data_processors/processor_eodhd.py141 # Step 2: Second pass to update each file with the 'Day' columnCOMMENT
Self-Referential Comments3 hits · 9 pts
SeverityFileLineSnippetContext
MEDIUMfinrl/meta/data_processors/processor_sinopac.py48 # Create a new DataFrame to ensure all time points are includedCOMMENT
MEDIUM…pplications/stock_trading/fundamental_stock_trading.py265 # Create a dataframe that merges all the ratiosCOMMENT
MEDIUMunit_tests/preprocessors/test_yahoodownloader.py21 # Create a sample DataFrame similar to what fetch_data might produce before adjustmentCOMMENT
Over-Commented Block8 hits · 8 pts
SeverityFileLineSnippetContext
LOWfinrl/test.py101 cwd="./test_ppo",COMMENT
LOWfinrl/test.py121 # cwd="./test_ppo/checkpoint_000030/checkpoint-30",COMMENT
LOWfinrl/train.py121 erl_params=ERL_PARAMS,COMMENT
LOWfinrl/train.py141 # cwd="./test_ppo",COMMENT
LOWfinrl/agents/stablebaselines3/models.py641 self.unique_trade_date[i - self.rebalance_window],COMMENT
LOWdocs/source/conf.py1#COMMENT
LOWdocs/source/conf.py121# to template names.COMMENT
LOWdocs/source/conf.py141 #COMMENT
AI Slop Vocabulary2 hits · 4 pts
SeverityFileLineSnippetContext
LOWfinrl/meta/env_stock_trading/env_stocktrading.py117 ): # check if the stock is able to sell, for simlicity we just add it in techical indexCODE
MEDIUMunit_tests/preprocessors/test_yahoodownloader.py79 # Use pandas testing utility for robust DataFrame comparisonCOMMENT
Redundant / Tautological Comments1 hit · 2 pts
SeverityFileLineSnippetContext
LOWfinrl/meta/data_processors/processor_alpaca.py158 tmp_df.iloc[0] = [first_valid_price] * 4 + [0.0] # Set volume to zeroCODE