ADR & Foreign Listing Financial Filter
In the Taiwan market, stocks issued by foreign companies listed on the Taiwan exchange carry a "KY" prefix in their company name. These "KY stocks" have historically attracted scrutiny due to financial reporting concerns -- their audited financials may follow different standards, and regulatory oversight can be weaker than for domestically incorporated companies. A common risk management practice is to filter them out of fundamental strategies.
The US market has an analogous category: American Depositary Receipts (ADRs) and foreign-incorporated companies listed on US exchanges. While many ADRs represent large, reputable companies (e.g., ASML, Toyota), others -- particularly from emerging markets -- may carry similar financial transparency risks.
This example demonstrates how to build a cash flow quality strategy and then filter out ADRs and foreign listings.
Cash Flow Quality Strategy
The strategy selects companies with strong cash flow profiles, indicating healthy and sustainable operations:
- Operating cash flow > 0 -- The core business generates real cash inflows.
- Free cash flow > 0 -- The company generates cash even after capital expenditures.
- Price above $10 -- Excludes low-priced stocks that may be distressed.
- ROE > 5% -- Return on equity demonstrates basic profitability.
Filtering Foreign Listings
The us_company_profile data table includes a country field indicating the country of incorporation. Companies incorporated outside the United States can be identified and excluded.
ADRs and foreign listings may present these risks for fundamental strategies:
- Different accounting standards: Not all foreign companies report under US GAAP. Even those that do may have different interpretations of revenue recognition, asset valuation, and related-party transactions.
- 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 performance and exchange rate movements, adding a confounding variable to fundamental signals.
- Data quality: Financial statement data for foreign-listed companies may have more gaps, delays, or inconsistencies.
Code
Cash Flow Quality Selection
from finlab import data
from finlab.backtest import sim
from finlab.market 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:operatingCashFlow')
capex = data.get('us_cash_flow:capitalExpenditure')
free_cf = operating_cf - capex.abs()
roe = data.get('us_key_metrics: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
Filter Out Foreign Listings
# 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()
Alternative: Filter by Exchange
Instead of filtering by country of incorporation, you can filter by the exchange listing. Stocks listed on major US exchanges (NYSE, NASDAQ) generally have stricter listing requirements than OTC markets:
# Filter by exchange instead of country
profile = data.get('us_company_profile')
major_exchange = profile[profile['exchangeShortName'].isin(['NYSE', 'NASDAQ'])]['symbol'].tolist()
position_cols = position.columns
exchange_filter = position_cols[position_cols.isin(major_exchange)]
position = position[exchange_filter]
Strategy Characteristics
- Cash flow focus: Operating cash flow and free cash flow are harder to manipulate than earnings, making them more reliable quality signals across different accounting regimes.
- Country filter via
us_company_profile: Thecountryfield identifies the country of incorporation. Filtering forcountry == 'US'removes ADRs and foreign-incorporated companies in one step. - Exchange filter alternative: Filtering by
exchangeShortNameensures only stocks on major regulated exchanges are included, which indirectly removes most OTC-traded ADRs and shell companies. - Modular approach: The foreign listing filter is applied after the fundamental selection, so it can be added to any existing strategy without modifying the core logic.
resample='M': Monthly rebalancing aligns with the quarterly cadence of cash flow data updates.fee_ratio=0.001: Commission rate of 0.1%.tax_ratio=0: No transaction tax on US stock trades.
When to Keep Foreign Listings
Not all foreign listings should be excluded. Large, well-known ADRs (e.g., ASML, TSM, NVO, SAP) have excellent financial transparency and deep analyst coverage. A more nuanced approach might:
- Keep ADRs with market cap > $10B (large, well-covered companies)
- Exclude ADRs from specific countries with known reporting concerns
- Apply stricter financial quality filters to ADRs rather than blanket exclusion
The right approach depends on your strategy's sensitivity to data quality and your confidence in the underlying fundamental signals.