Explore more topics
Market-data lake

lake.institutional_holdings dataset schema

Column types and research semantics for NexusTrade’s lake.institutional_holdings dataset. Read the supported schema before submitting a bounded SQL query.

Jump to a section

TL;DR

Institutional holdings are delayed quarterly snapshots, not entry timestamps. Filter availableAt to your decision date, join filings for manager and period, and distinguish restatements that replace a prior version from amendments adding holdings. Values are normalized whole USD. Join securities to prices by ticker and date, preserving unresolved identities, and check common stock eligibility before forming a portfolio. The displayed query previews filing rows; it does not reconstruct a current book or prove a tradable strategy's performance.

Query name
lake.institutional_holdings
Storage partition
year
Columns
20

Columns and types

VARCHAR

  • accession
  • infoTableSk
  • availabilitySource
  • issuerName
  • titleOfClass
  • cusip
  • figi
  • sharesType
  • putCall

TIMESTAMP

  • availableAt

DOUBLE

  • value
  • sharesAmount

Showing 12 of 20 recorded rows. The complete table is below.

Current logical schema for lake.institutional_holdings

Inspect the complete lake.institutional_holdings schema

Scroll sideways to compare all columns. Select a heading to sort.

accessionVARCHAR
infoTableSkVARCHAR
availableAtTIMESTAMP
availabilitySourceVARCHAR
issuerNameVARCHAR
titleOfClassVARCHAR
cusipVARCHAR
figiVARCHAR
valueDOUBLE
sharesAmountDOUBLE
sharesTypeVARCHAR
putCallVARCHAR
discretionVARCHAR
otherManagerVARCHAR
votingSoleDOUBLE
votingSharedDOUBLE
votingNoneDOUBLE
resolvedTickerVARCHAR
valueUnitSourceVARCHAR
rawArchiveKeyVARCHAR

Current logical schema for lake.institutional_holdings

Query lake.institutional_holdings using the column names and types below. The query validator and engine use this logical catalog; a field absent from an older shard returns typed NULL.

What this table contains

The logical view is backed by canonical manifest-resolved data. Query this name rather than guessing a physical database collection or object-storage path.

Inspect holdings with their filing context

Query example, not executed here. The dates and filters define the proposed research scope; returned rows and current coverage must be checked in your workspace.

value is normalized whole USD. The join supplies manager and reporting period. This is a filing-row preview, not a merged current book: restatement versus new-holdings amendment handling and security eligibility still matter before aggregation.

SQL
SELECT h.accession, f.cik, f.managerName, f.periodOfReport,
       h.availableAt, h.resolvedTicker, h.value, h.sharesAmount, h.sharesType, h.putCall
FROM lake.institutional_holdings h
JOIN lake.institutional_filings f ON f.accession = h.accession
WHERE h.availableAt >= TIMESTAMP '2026-09-01'
  AND h.availableAt < TIMESTAMP '2026-09-19'
  AND h.value > 0
ORDER BY h.availableAt, h.accession, h.infoTableSk
LIMIT 20;

Submit the institutional_holdings example and read back its parts

Run the exact SQL through the Python SDK

Save this page's SQL as query.sql and the runner below as query.py. Use a registered key with lake scope from Developers. The runner submits the displayed institutional_holdings query once, saves its operation, waits on that same ID, saves the returned manifest and downloads its Parquet parts.

This submission has not been executed for the reference page. Inspect the SQL, dates and resource limits before running it. Reuse the request key only for this identical SQL and limits; use a new key when changing them.

Shell
python3 -m pip install nexustrade==1.42.0
export NEXUSTRADE_API_KEY="YOUR_LAKE_SCOPED_KEY"
python3 query.py

Python
import json
from pathlib import Path
from nexustrade import NexusTradeClient

# Save the SQL displayed on this page as query.sql.
sql = Path("query.sql").read_text()
client = NexusTradeClient.from_environment()
operation = client.create_lake_query(
    {"query": sql, "limits": {"timeoutSeconds": 30, "maxRows": 50,
                              "maxResultBytes": 1048576}},
    idempotency_key="reference-institutional_holdings-20261012-v1",
)
Path("query-operation.json").write_text(json.dumps(operation, indent=2))
finished = client.wait_for_lake_query(operation["id"])
if finished["status"] != "completed":
    raise RuntimeError(finished)
manifest = client.get_lake_query_manifest(operation["id"])["result"]
Path("query-manifest.json").write_text(json.dumps(manifest, indent=2))
print(json.dumps(manifest, indent=2))
for part in manifest["parts"]:
    Path(f"query-{part['part']}.parquet").write_bytes(
        client.download_lake_query_part(operation["id"], part["part"], max_bytes=1048576)
    )

Coverage and timing

Inspect source coverage and timing before using the rows

The logical view is backed by canonical manifest-resolved data. Query this name rather than guessing a physical database collection or object-storage path.

`availableAt` is the point-in-time column: filter `availableAt <= as_of`. Holdings are long-only quarterly snapshots with up to 45 days of lag — they measure accumulation, never entry timing.

One row per (accession, infoTableSk). Join to `institutional_filings` on `accession` for manager and period. A RESTATEMENT amendment replaces the prior version of that manager and period when it becomes public; a NEW HOLDINGS amendment adds positions. Never overwrite the raw versions.

`resolvedTicker` is the ticker this security traded under AT `availableAt`, resolved from `cusip` — join it to price tables on ticker AND date, never on ticker alone. It is NULL where no listed symbol covers that date (~35% of rows: bonds, money-market classes, foreign listings and CUSIPs no listing table knows), and a null is deliberate because a wrong ticker joins cleanly to another company. `valueUnitSource` says which evidence settled `value`'s unit: `median` the filing's own implied price, `date` SEC's rule alone, `unknown` undetermined.

`cusip` remains the raw security key (normalized; source `figi` is EMPTY before 2024 and cannot bridge to a ticker across the history).

`value` is **whole USD, normalized on publish**: SEC's 2022 Form 13F amendments switched the information table from thousands to whole dollars for filings from 2023-01-01, and the source column does not say which, so `SUM(value)` over the raw feed adds the two together. Filings before that date are scaled by 1000 at publish (`models/insiderDisclosure/thirteenFValueUnits.ts`).

Verified after the 2026-09-23 republish: median implied price per share is $40-68 in every year 2013-2026, with no break; `sharesAmount` with `sharesType` SH/PRN.

About 5.4% of rows are put/call options; other rows can include bonds, ETFs and non-common shares, so a tradable common-stock basket needs additional eligibility checks.

914k zero-position rows (0.7%, incl. placeholder CUSIP `000000000`) are preserved, not dropped — exclude explicitly (`value > 0`) when they would pollute an aggregation.

For the filing's EDGAR index page, join to `institutional_filings` on `accession` and use its `sourceUrl`.

Discussion

Sign in or create a free account to join the discussion.

No comments yet.