US examples
ADR financial filter
On this page4
Select US companies with strong cash flow, then drop American Depositary Receipts (ADRs) and other foreign-incorporated listings. It suits fundamental strategies that depend on comparable, well-audited financial statements.
ADRs and foreign-incorporated companies listed on US exchanges can carry financial reporting risks: their audited financials may follow different standards, and regulatory oversight can be weaker than for domestically incorporated companies. Many ADRs are large, reputable companies (such as ASML and Toyota), but others, particularly from emerging markets, may carry real financial transparency risks, so filtering them out is a common risk management practice. (Taiwan has a similar category: the "KY" stocks of foreign-incorporated companies listed on its exchanges.)
Strategy logic
The strategy selects companies with strong cash flow profiles, a sign of healthy and sustainable operations:
- Operating cash flow above 0: the core business brings in real cash.
- Free cash flow above 0: the company generates cash even after capital expenditures.
- Price above $10: excludes low-priced stocks that may be distressed.
- ROE above 5%: trailing-12-month return on equity shows basic profitability.
- US-incorporated only: the
countryfield ofus_company_profilegives each company's country of incorporation; anything outside the United States is dropped. - Hold the 20 qualifying stocks with the highest ROE, rebalanced monthly.
Why drop foreign listings
- Different accounting standards: not all foreign companies report under US GAAP. Even those that do may interpret revenue recognition, asset valuation and related-party transactions differently.
- Regulatory environment: companies incorporated in certain jurisdictions may face less stringent disclosure requirements or weaker enforcement.
- Currency effects: ADR prices reflect both the underlying stock and exchange rate movements, which confounds fundamental signals.
- Data quality: financial statement data for foreign-listed companies may have more gaps, delays or inconsistencies.
Code
from finlab import data
from finlab.backtest import sim
from finlab.markets.us import USMarket
data.set_market('us')
close = data.get('price:adj_close')
close = close[close.index.dayofweek < 5] # remove weekends
# Fundamental data
operating_cf = data.get('us_cash_flow:operating_cash_flow')
capex = data.get('us_cash_flow:capital_expenditure')
free_cf = operating_cf - capex.abs()
net_income = data.get('us_income_statement:net_income')
equity = data.get('us_balance_sheet:total_stockholders_equity')
roe = net_income.rolling(4).sum() / equity # Trailing-12-month ROE
# Selection conditions
cond1 = operating_cf > 0 # Positive operating cash flow
cond2 = free_cf > 0 # Positive free cash flow
cond3 = close > 10 # Price above $10
cond4 = roe > 0.05 # ROE above 5%
position = cond1 & cond2 & cond3 & cond4
# Get company profile and identify US-incorporated companies
profile = data.get('us_company_profile')
us_companies = profile[profile['country'] == 'US']['symbol'].tolist()
# Keep only US-incorporated companies in the position
position_cols = position.columns
us_filter = position_cols[position_cols.isin(us_companies)]
position = position[us_filter]
# Select top 20 by ROE among qualifying stocks
position = (roe * position).is_largest(20)
report = sim(position, resample='M', market=USMarket(), fee_ratio=0.001, tax_ratio=0)
report.display()The foreign-listing filter runs after the fundamental selection, so you can add it to any existing strategy without touching its core logic.
How to adjust it
- Cash flow focus: operating and free cash flow are harder to manipulate than earnings, which makes them more reliable quality signals across different accounting regimes.
country == 'US': removes ADRs and foreign-incorporated companies in one step.resample='M': monthly rebalancing follows the quarterly cadence of cash flow data updates.fee_ratio=0.001: a 0.1% commission.tax_ratio=0: US stock trades carry no transaction tax.
Filter by exchange instead
Stocks listed on the major US exchanges (NYSE, NASDAQ) generally face stricter listing requirements than OTC markets. Filtering on exchange instead of country keeps only stocks on these regulated exchanges, which indirectly removes most OTC-traded ADRs and shell companies. Replace the country filter with:
# Filter by exchange instead of country
profile = data.get('us_company_profile')
major_exchange = profile[profile['exchange'].isin(['NYSE', 'NASDAQ'])][
'symbol'
].tolist()
position_cols = position.columns
exchange_filter = position_cols[position_cols.isin(major_exchange)]
position = position[exchange_filter]Keep the well-covered foreign listings
Not every foreign listing needs to go. Large, well-known ADRs (such as ASML, TSM, NVO and SAP) have excellent financial transparency and deep analyst coverage. A more nuanced approach might:
- keep ADRs with a market cap above $10B (large, well-covered companies);
- exclude ADRs only from specific countries with known reporting concerns;
- apply stricter financial quality filters to ADRs instead of excluding them all.
The right choice depends on how sensitive your strategy is to data quality, and how much you trust the underlying fundamental signals.
Related pages
- Penny stock risk filter More add-on filters: price, volume and size floors.
- Quality small caps Another cash-flow and ROE quality screen.
- REIT sector strategy Use
us_company_profileto pick a sector. - Load more data Find statement fields and company profile data.
Was this page helpful?