Skip to content

Latest commit

 

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Global X

One of the app's features lets you select Global X ETFs in the Watchlist and aggregate their holdings to see how often each ticker appears across the selected funds. Repeated holdings make overlapping exposure visible: the more selected funds include a ticker, the greater its potential influence on the portfolio; gains in that holding may help, while declines may hurt, and actual impact also depends on each fund's position size. Another feature makes it faster and easier to find funds with stronger growth over different periods, higher dividend yields or distributions, greater Total Return (price performance plus dividends), and other key performance metrics. A single-file client-side tool reading the generated ./api/globalx static feed (Global X ETF catalog and fund pages, dated official daily holdings CSV files, SEC EDGAR N-PORT-P and Yahoo Finance history) into a searchable ETF/asset-class catalog with per-fund tabs, watchlist aggregation, ticker copy and CSV/TXT export — the same look, feel, columns and business logic as the sibling applications.

Using Bun

bunx degit daggerok/Global-X#main ./12345 && cd ./12345 && bunx serve . -p 1234
open http://0:1234

The published application is available at https://daggerok.github.io/Global-X/. No build step, no bundler, no server — index.html carries the markup and a Babel-standalone bootstrap that transpiles app.tsx in the browser. The app reads only relative ./api/globalx/** files generated by scripts/update-data.ts; the committed feed is complete, so the site works offline with no update run at all.

Updating the static Global X data

Run the updater with Bun:

bun install --frozen-lockfile
bun test scripts/update-data.test.ts
bun ./scripts/update-data.ts

Run bun ./scripts/update-data.ts -h (or --help) to print every configuration variable with its default and usage examples.

The Update Global X ETF data GitHub Actions workflow (.github/workflows/update-data.yml) exposes the same settings as manual inputs, runs weekly on Sunday at 00:00 UTC, and commits api/globalx/** and nothing else. All supplied filters use AND logic.

Data sources

Block Source Notes
Fund universe, ticker, fund name, inception date, NAV, net assets, gross/net expense ratio, THEME and SUB_THEME globalxetfs.com/explore The current Next.js page publishes the catalog in its server-delivered React Flight payload. The updater decodes that payload without a headless browser.
CUSIP, ISIN, NAV, market price, daily changes, premium/discount, 30-Day Median Bid-Ask Spread, primary exchange and shares outstanding https://www.globalxetfs.com/funds/<ticker>/ The official fund page's React Flight payload plus its rendered ETF Prices table.
Holdings (daily) https://assets.globalxetfs.com/funds/holdings/<ticker>_full-holdings_<YYYYMMDD>.csv The dated Full Holdings (.csv) link on each fund page. The seven-column file publishes weight, ticker, name, SEDOL, market price, shares held and market value.
NAV-basis performance Official fund-page React Flight payload (PERFORMANCE_HISTORY) Monthly and quarter-end annualized and cumulative NAV values are copied from the provider payload. The catalog stores published annualized values and the app renders the same return rows as the sibling applications.
Distribution history and frequency Official fund-page React Flight payload (DISTRIBUTION_HISTORY) Ex-date, record date, payable date and amount are kept in newest-first order. Global X does not publish a declaration date in this payload, so that shared row stays blank.
Daily price history (Date / Close / Adj Close / Volume) Yahoo Finance chart API Used for the paginated history sheets and as the market-price fallback. Adjusted close is rounded to two decimals before writing.
Holdings fallback SEC EDGAR Form N-PORT-P, Global X Funds CIK 0001432353, file 811-22209 Used only when the official holdings CSV is unavailable and EDGAR_FALLBACK=1; off by default.
Dividend-history fallback Yahoo Finance dividend events Used only when Global X publishes no distribution-history rows; the feed marks those rows distributions.fallback: true.

The official Global X page was live-verified as a server-rendered Next.js shell with real catalog/fund values in React Flight payloads. No WAF proxy is used. Requests are bounded, retried, and paced by the configured per-worker lanes.

The daily holdings CSV

The CSV is parsed with a dependency-free RFC-4180 reader that tolerates the BOM, CRLF and quoted fields. Global X publishes SEDOL for holdings rather than a separate asset-class column, so Asset Category is derived conservatively from the row's own name/ticker: cash/payables, Treasury, fund, option-like and otherwise equity. Provider values are otherwise preserved in the generated sheets.

Return arithmetic

The source publishes annualized NAV values for 1, 3, 5 and, where available, 10 years plus since inception, and cumulative monthly/quarterly readings. The feed keeps both readings and does not extrapolate a missing tenor; unavailable values remain null and the app renders —.

Known value limitations

Metric Status Reason
Declaration Date always blank in Global X distribution rows The current official DISTRIBUTION_HISTORY payload publishes ex-date, record date, payable date and amount, but no declaration-date field.
Underlying Exposure — It is not part of the current Global X catalog/fund-page payload used by the updater; the updater does not infer an index from a fund name.
SEDOL / CUSIP both may appear, in different places The daily holdings CSV publishes SEDOL; the fund page's Trading Details panel publishes CUSIP and ISIN. The shared Identifier holdings field uses the provider's SEDOL.
Growth-of-$10,000 series and document links — where the current payload does not expose a stable value The updater does not invent a chart series or document URL from an unrelated page.
Premium / Discount official value preferred; derived quotient retained The page payload's current premium/discount value is kept alongside (Market Price - NAV) / NAV as a guard.
EDGAR fallback opt-in SEC EDGAR can reject GitHub-hosted runner IPs with HTTP 403; the normal source is the official dated holdings CSV.

Update controls

Environment variable Default Meaning
MAX_FETCHES 0 Funds to process; 0 means a full pass. A positive value resumes after the saved cursor in api/globalx/update-state.json.
TICKERS "" Space/comma-separated ticker allowlist, combined with all other filters.
CATEGORY "" Substring match on the official THEME / SUB_THEME category.
AUM / TER / DIVIDEND_YIELD / SEC_YIELD "" Strict min:max ranges; AUM also accepts nano, micro, small, mid and large.
PERFORMANCE_YTD … PERFORMANCE_10Y / TOTAL_RETURN_YTD … TOTAL_RETURN_10Y "" min:max filters on official/derived return values.
CONCURRENCY / REQUEST_SLEEP 2 / 1.5 Per-worker request lanes and the minimum spacing within each lane.
HOLDINGS_PAGE_SIZE / HISTORY_PAGE_SIZE 250 / 1000 Rows per generated JSON page.
MAX_RETRIES 3 Retries after the initial request for network errors and HTTP 408/425/429/5xx.
HISTORY_RANGE max Yahoo chart range (max, 10y, 5y, …).
EDGAR_FALLBACK off Use SEC N-PORT-P if a holdings CSV is unavailable.
SKIP_YAHOO / SKIP_GLOBALX off Skip the Yahoo stage or the official Global X catalog/fund stages.
STORE_RAW_DOWNLOADS off Keep raw catalog, fund pages and CSV samples under api/globalx/raw.
SEC_UA repo URL Declared User-Agent contact string for SEC EDGAR.

A bounded or partly failed run preserves previously published files. TICKERS combines with AUM/TER/yield/return filters using AND logic; it does not override them.

Examples

MAX_FETCHES=10 bun ./scripts/update-data.ts
TICKERS="PAVE AIQ COPX" bun ./scripts/update-data.ts
AUM="1B:" TER=":0.70" bun ./scripts/update-data.ts
CATEGORY="Fixed Income" bun ./scripts/update-data.ts

TypeScript

The browser app is intentionally build-free: index.html carries the markup, styles and bootstrap, and app.tsx is TypeScript compiled in the browser with Babel standalone — no build step, no bundler, no tsconfig.json needed. Bun runs TypeScript out of the box.

Verification before every publish: bun install --frozen-lockfile, bun test scripts/update-data.test.ts, bun build --target=bun scripts/update-data.ts --outfile=/dev/null, and git diff --check.

Brands table

Brand Where to get the data
abrdn (Aberdeen) aberdeeninvestments.com | aberdeen
Amplify amplifyetfs.com | Amplify
Capital Group capitalgroup.com | Capital-Group
Fidelity fidelity.com | Fidelity
Franklin Templeton franklintempleton.com | Franklin
Global X globalxetfs.com/explore | Global X
Goldman Sachs am.gs.com | Goldman-Sachs
Invesco invesco.com | Invesco
iShares ishares.com | iShares
JPMorgan am.jpmorgan.com | JPMorgan
NEOS neosfunds.com | Neos
Northern Trust etfs.ntam.northerntrust.com | Northern-Trust
ProShares proshares.com | ProShares
Schwab schwabassetmanagement.com | Schwab
SPDR ssga.com | SPDR
VanEck vaneck.com | VanEck
Vanguard investor.vanguard.com | Vanguard
VictoryShares vcm.com VictoryShares ETFs | VictoryShares
WisdomTree wisdomtree.com | WisdomTree

Sibling applications

Application Data provider Repository
abrdn (Aberdeen) Official Aberdeen gateway + SEC N-PORT holdings fallback + Yahoo history/dividends aberdeen
Amplify Amplify ETFs (Firestore data feed) Amplify
Capital Group Official Capital Group fund data + SEC N-PORT holdings fallback + Yahoo history fallback Capital-Group
Fidelity SEC EDGAR N-PORT-P + Yahoo Finance Fidelity
Franklin Templeton franklintempleton.com ETF listings + product pages + SEC EDGAR N-PORT-P Franklin
Global X globalxetfs.com Next.js catalog and fund pages + dated full-holdings CSV Global X
Goldman Sachs am.gs.com fund finder + detail pages + SEC EDGAR N-PORT-P Goldman-Sachs
Invesco invesco.com CSV downloads + Yahoo Finance Invesco
iShares iShares (BlackRock) product workbooks iShares
JPMorgan am.jpmorgan.com fund explorer + product-data JSON JPMorgan
NEOS neosfunds.com lineup table + official fund pages + daily holdings CSV Neos
Northern Trust etfs.ntam.northerntrust.com funds list + per-fund CSV/JSON downloads Northern-Trust
ProShares proshares.com ETF finder + fund pages + official data host ProShares
Schwab schwabassetmanagement.com product pages + CSV exports Schwab
SPDR SSGA / State Street public feeds SPDR
VanEck vaneck.com ETF finder + product pages VanEck
Vanguard Vanguard product pages + SEC EDGAR N-PORT-P Vanguard
VictoryShares VCM VictoryShares catalog and product JSON + SEC EDGAR N-PORT-P holdings fallback + Yahoo Finance adjusted-market-price history VictoryShares
WisdomTree WisdomTree product table + SEC EDGAR N-PORT-P + Yahoo Finance WisdomTree

License

MIT — same as all sibling ETF repositories.

Global X® and the fund names/tickers referenced here are trademarks of Global X Investment Management LLC. This is an independent, unofficial tool; it is not affiliated with, endorsed by, or sponsored by Global X. All data is reproduced from Global X's own public pages and downloads, with public SEC EDGAR filings and Yahoo Finance as fallbacks, for research purposes. All other trademarks, including index names, are the property of their respective owners.

About

Global X ETF. A single-file client-side tool reading ./api/globalx (globalxetfs.com Next.js catalog and fund pages, dated full-holdings CSV, Yahoo Finance and SEC EDGAR fallback) into a searchable ETF/asset-class catalog with per-fund tabs, watchlist, CSV/TXT export. TailwindCSS, dark mode, Bun updater.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages