<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alex B</title>
    <description>The latest articles on DEV Community by Alex B (@alexbsolodev).</description>
    <link>https://dev.to/alexbsolodev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4179536%2F50ca3b4b-9cc8-4636-a817-cb239396cf51.png</url>
      <title>DEV Community: Alex B</title>
      <link>https://dev.to/alexbsolodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexbsolodev"/>
    <language>en</language>
    <item>
      <title>A vendor bar for a day nothing traded - why our completeness check was 97% wrong</title>
      <dc:creator>Alex B</dc:creator>
      <pubDate>Thu, 29 Oct 2026 14:05:44 +0000</pubDate>
      <link>https://dev.to/alexbsolodev/a-vendor-bar-for-a-day-nothing-traded-why-our-completeness-check-was-97-wrong-a1a</link>
      <guid>https://dev.to/alexbsolodev/a-vendor-bar-for-a-day-nothing-traded-why-our-completeness-check-was-97-wrong-a1a</guid>
      <description>&lt;p&gt;The first check we built to measure missing price data was 97% wrong, and nothing in the data said so.&lt;/p&gt;

&lt;p&gt;Every backtest starts with an assumption nobody writes down: &lt;strong&gt;the price history is complete.&lt;/strong&gt; Every trading day a&lt;br&gt;
stock was listed, there is a bar.&lt;/p&gt;

&lt;p&gt;Ours wasn't. And the first check we built to measure how incomplete it was turned out to be 97% wrong - with nothing in&lt;br&gt;
the data to tell us.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap
&lt;/h2&gt;

&lt;p&gt;We compared our own daily price files against the exchange calendar, stock by stock, inside each stock's own&lt;br&gt;
first-to-last trading span since June 2025. &lt;strong&gt;30,581 missing stock-days across 738 listed common stocks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most of them were names that had changed ticker or listed recently. The list of symbols our fetcher asked for only knew&lt;br&gt;
names it already held, so a renamed company quietly stopped being fetched. One large bank was missing &lt;strong&gt;86 daily&lt;br&gt;
sessions&lt;/strong&gt; after its ticker change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first check: "is there a bar?"
&lt;/h2&gt;

&lt;p&gt;To separate real gaps from days a stock genuinely did not trade, we asked a market-data vendor one question per&lt;br&gt;
missing day: &lt;em&gt;do you have a bar for this stock on this day?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It said yes for &lt;strong&gt;29,793 of the 30,581&lt;/strong&gt;. That looked like a clean result: nearly every gap is real, go fill them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the bars actually were
&lt;/h2&gt;

&lt;p&gt;Before filling anything, we read a few of the worst cases by hand. The bars were there - with &lt;strong&gt;zero volume and zero&lt;br&gt;
trades.&lt;/strong&gt; The price was simply the previous day's close, carried forward.&lt;/p&gt;

&lt;p&gt;The vendor serves a bar for a day nothing traded. &lt;strong&gt;19,066&lt;/strong&gt; of the "real" gaps were these placeholders.&lt;/p&gt;

&lt;p&gt;Asking a different question - &lt;em&gt;does the vendor's bar have trades?&lt;/em&gt; - the real number was &lt;strong&gt;10,727 sessions across 240&lt;br&gt;
stocks.&lt;/strong&gt; All of them were filled the same morning (11,408 daily rows and 869,391 one-minute rows), and the same count&lt;br&gt;
now reads &lt;strong&gt;0&lt;/strong&gt;. It runs every night.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for a backtest
&lt;/h2&gt;

&lt;p&gt;A placeholder bar is not harmless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volume filters lie.&lt;/strong&gt; A stock looks listed and priced on a day it had no market at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Returns get smoothed.&lt;/strong&gt; A flat day carried forward hides the real move, which then lands all at once on the next
day that traded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Completeness" checks pass.&lt;/strong&gt; Any check that asks &lt;em&gt;does a row exist?&lt;/em&gt; is satisfied by a row that says nothing
happened.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We found the same thing in our own stored files: three sampled days held 189, 467 and 432 zero-volume rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson
&lt;/h2&gt;

&lt;p&gt;A check that asks &lt;em&gt;does a record exist?&lt;/em&gt; measures the vendor's habits, not the market. Ask the question the record is&lt;br&gt;
supposed to answer: &lt;strong&gt;did this stock trade?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I don't know
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Whether the placeholder bars are documented behaviour, or a quirk of the way we ask for historical data.&lt;/li&gt;
&lt;li&gt;What the right storage policy is. A day with no trades arguably has no bar at all - but many tools expect one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A question for you
&lt;/h2&gt;

&lt;p&gt;Who has a reliable public rule for "did this stock trade today" that doesn't depend on the vendor's own bar - the&lt;br&gt;
exchange's daily volume files, consolidated trade counts, something else? If you've solved it, I'd like to learn how.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want this checked on your own data or backtest?&lt;/strong&gt; Backtest &amp;amp; Data Audit, one-week pilot: &lt;a href="https://altdataforge.com/audit" rel="noopener noreferrer"&gt;https://altdataforge.com/audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Research and education only - not investment advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>dataengineering</category>
      <category>finance</category>
      <category>python</category>
    </item>
    <item>
      <title>How do you know your company matching is right? We had to grade the grader</title>
      <dc:creator>Alex B</dc:creator>
      <pubDate>Mon, 26 Oct 2026 14:05:24 +0000</pubDate>
      <link>https://dev.to/alexbsolodev/how-do-you-know-your-company-matching-is-right-we-had-to-grade-the-grader-1jki</link>
      <guid>https://dev.to/alexbsolodev/how-do-you-know-your-company-matching-is-right-we-had-to-grade-the-grader-1jki</guid>
      <description>&lt;p&gt;Every agent that reads financial text has to decide which company a name means. Here is how we graded ours - and why we had to grade the answer key first.&lt;/p&gt;

&lt;p&gt;Every AI agent that reads financial text has to answer one question before anything else: &lt;strong&gt;which company is this?&lt;/strong&gt;&lt;br&gt;
"Apple" in a filing. "MS" in a headline. A name that changed three years ago, or a ticker that now belongs to someone&lt;br&gt;
else. Get it wrong and everything downstream is confidently wrong.&lt;/p&gt;

&lt;p&gt;We have been building a lookup for exactly that: give it a company name as it was written, in a filing or an article,&lt;br&gt;
and a date, and it returns the company that name meant on that date - including renamed and delisted ones. This week&lt;br&gt;
we measured it properly. Three things surprised me.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. We had to check the answer key first
&lt;/h2&gt;

&lt;p&gt;To grade a matcher you need an answer key: a set of names where careful labellers have written down the right company.&lt;br&gt;
We split ours in two - one half to tune on, one half held out and never looked at while tuning.&lt;/p&gt;

&lt;p&gt;Before trusting any score, we had a second model act as a referee on 891 items of the key, without ever seeing what our&lt;br&gt;
lookup had answered. It cost about $3.50 of API usage. What it found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;485 confirmed&lt;/strong&gt; as they stood.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;226 widened&lt;/strong&gt;: the original answer was right, but the same company also existed as a second record, and the two
had been offered as rivals. One company, two entries - both are now accepted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;101 settled&lt;/strong&gt;: items the labellers had marked "can't tell" now have an answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2 reversed&lt;/strong&gt;: outright wrong labels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the key was rarely wrong; it was incomplete. Every change is stored as its own record with a reason, on top of the&lt;br&gt;
original, never as a silent edit.&lt;/p&gt;

&lt;p&gt;On the checked key, the lookup scores &lt;strong&gt;0.927 on the held-out half (629 matches; lower bound 0.904)&lt;/strong&gt;. The part I find&lt;br&gt;
most useful: answers the lookup gave where the key said "can't tell" fell &lt;strong&gt;from 27 to 10&lt;/strong&gt; - most of them turned out&lt;br&gt;
to be the same company listed twice. Real wrong answers barely moved (37 to 36). Checking the key changed what we&lt;br&gt;
thought was a mistake, not how many mistakes we make.&lt;/p&gt;

&lt;p&gt;If you grade an entity matcher against an answer key nobody has audited, you are partly grading the key.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Same question, three different orderings
&lt;/h2&gt;

&lt;p&gt;Some names legitimately point to several entities - Morgan Stanley is a good example. When the lookup returned those&lt;br&gt;
tied alternatives, their order depended on a random seed that changes every time a program starts. Same question,&lt;br&gt;
three runs, three orderings. The answer itself never changed - only the order of the alternatives. For a person that is&lt;br&gt;
a shrug; for an agent that takes the first item in a list, it is a coin flip. Ties now break on a stable identifier, and&lt;br&gt;
the same question gets the same list every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. News is not filings
&lt;/h2&gt;

&lt;p&gt;Filings are formal; company names sit in predictable places. News prose is not. On FiNER-ORD, a public, human-labelled&lt;br&gt;
set of financial news text (Shah et al., 2023), rule-based name finding scored an F1 of &lt;strong&gt;0.350&lt;/strong&gt;. A free open model&lt;br&gt;
(GLiNER), fine-tuned on our filings data, scored &lt;strong&gt;0.820&lt;/strong&gt;. Rules that work on filings fall apart on headlines.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I don't know yet
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How well &lt;em&gt;matching&lt;/em&gt; (not just finding) works on news text - there is no human-labelled answer key for that yet.&lt;/li&gt;
&lt;li&gt;Whether 0.927 holds outside SEC filings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;We are working on letting AI agents ask this lookup directly - "which company did this name mean on this date?" -&lt;br&gt;
with the answer key's score attached to every answer. If you are building an agent that needs that, reply or write to&lt;br&gt;
&lt;a href="mailto:AlexB@AltDataForge.com"&gt;AlexB@AltDataForge.com&lt;/a&gt; and I'll let you know when there is something to try.&lt;/p&gt;

&lt;p&gt;Next post: &lt;strong&gt;when a ticker changes hands&lt;/strong&gt; - how one company's history quietly leaks into another's when a symbol is&lt;br&gt;
reused, and what it takes to stop it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A question for you
&lt;/h2&gt;

&lt;p&gt;If you run entity resolution for agents or research: how do you grade it - and has your answer key ever turned out to&lt;br&gt;
be incomplete rather than wrong? If someone has published a good open answer key for company matching, link it and I'll&lt;br&gt;
credit it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want this checked on your own data or backtest?&lt;/strong&gt; Backtest &amp;amp; Data Audit, one-week pilot: &lt;a href="https://altdataforge.com/audit" rel="noopener noreferrer"&gt;https://altdataforge.com/audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;FiNER-ORD: Shah et al., 2023, arXiv:2302.11157 (CC BY-NC 4.0; used here for evaluation only). The free SEC data&lt;br&gt;
dictionaries this work sits on: &lt;a href="https://alexbocio.github.io/us-gov-data-dictionary/" rel="noopener noreferrer"&gt;https://alexbocio.github.io/us-gov-data-dictionary/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>data</category>
      <category>machinelearning</category>
      <category>python</category>
    </item>
    <item>
      <title>Why your AI agent gets fund holdings wrong: the SEC's "Ticker" field isn't a ticker</title>
      <dc:creator>Alex B</dc:creator>
      <pubDate>Sat, 17 Oct 2026 14:58:25 +0000</pubDate>
      <link>https://dev.to/alexbsolodev/why-your-ai-agent-gets-fund-holdings-wrong-the-secs-ticker-field-isnt-a-ticker-7a4</link>
      <guid>https://dev.to/alexbsolodev/why-your-ai-agent-gets-fund-holdings-wrong-the-secs-ticker-field-isnt-a-ticker-7a4</guid>
      <description>&lt;p&gt;If you are building an agent or a model on SEC fund-holdings data, it will read a field called IDENTIFIER_TICKER and trust it. Here is what that field actually contains.&lt;/p&gt;

&lt;p&gt;If you build fund-ownership data from SEC Form N-PORT, you will read a field called IDENTIFIER_TICKER and treat it as a stock symbol. The SEC's data-set documentation describes it in one word: "Ticker".&lt;/p&gt;

&lt;p&gt;The form itself says more. Form N-PORT, Item C.1.e, asks for "at least one" other identifier: an ISIN, or a "Ticker (if ISIN is not available)", or some other identifier. Nothing requires the ticker to be an exchange symbol. It is a fallback.&lt;/p&gt;

&lt;p&gt;So we measured what funds actually put there - every quarter the SEC has published, 2019 Q4 to 2026 Q2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;17,361,050 rows carry a ticker.&lt;/li&gt;
&lt;li&gt;72% are on common-stock lines, and they look like real tickers: MSFT, AMZN, AAPL.&lt;/li&gt;
&lt;li&gt;On mortgage-backed lines (676,336 rows) the "tickers" are agency pool-type prefixes: FN 161,550 rows, GN 109,156, FNMA 55,140, FHLMC 45,223.&lt;/li&gt;
&lt;li&gt;On bond lines (2,312,102 rows) the ticker is the ISSUER's stock symbol, not the bond's: AT&amp;amp;T bonds carry "T" on 86,298 rows.&lt;/li&gt;
&lt;li&gt;On derivative lines you find futures contract codes (TYZ2, ESZ2) and currency codes (USD, EUR).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why it matters: FG is a Freddie Mac pool prefix. It is also the NYSE ticker of F&amp;amp;G Annuities &amp;amp; Life. Join N-PORT's ticker field to a ticker list and Freddie Mac mortgage pools turn into holdings of an insurance company. Bond holdings turn into stock holdings. Ownership counts, "smart money" signals and flow features all inherit it - silently.&lt;/p&gt;

&lt;p&gt;Two more traps in the same files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Placeholders that look like data: ISSUER_CUSIP is "N/A" on 47.5 million rows, "000000000" on 15.2 million and "999999999" on 210 thousand. ISSUER_LEI is "N/A" on 67.6 million. Count those as filled and your coverage numbers are wrong.&lt;/li&gt;
&lt;li&gt;The SEC's machine-readable field list ships unchanged with every historical quarter, so a field "defined" there may not exist in older files (the VaR table is listed back to 2019 but only appears from 2022 Q1).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What to do: before trusting any identifier on an N-PORT line, check what kind of holding the line is (the ASSET_CAT field), and treat placeholder values as blank.&lt;/p&gt;

&lt;p&gt;What I don't know yet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether anyone publishes an open mapping from N-PORT pool prefixes (FN, GN, FG...) to the agency programs they stand for. I could not find one.&lt;/li&gt;
&lt;li&gt;How much of the bond-line "issuer ticker" habit comes from filers themselves and how much from the software vendors that prepare their filings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We published the full N-PORT field dictionary - the SEC's definitions with citations, the official code lists, and what is actually in each field - free, under CC BY 4.0: &lt;a href="https://alexbocio.github.io/us-gov-data-dictionary/sec_nport.html" rel="noopener noreferrer"&gt;https://alexbocio.github.io/us-gov-data-dictionary/sec_nport.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source data: SEC Form N-PORT data sets, 2019 Q4 - 2026 Q2.&lt;/p&gt;

&lt;p&gt;If you build fund-ownership data from N-PORT: how do you handle the non-stock lines today - map them, or drop them? And if someone has already solved this better, link it in the comments and I'll credit it in the dictionary.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>data</category>
      <category>finance</category>
      <category>python</category>
    </item>
    <item>
      <title>One developer, one year, 1.8 billion rows: a point-in-time alternative-data platform</title>
      <dc:creator>Alex B</dc:creator>
      <pubDate>Mon, 12 Oct 2026 19:33:37 +0000</pubDate>
      <link>https://dev.to/alexbsolodev/one-developer-one-year-18-billion-rows-a-point-in-time-alternative-data-platform-382l</link>
      <guid>https://dev.to/alexbsolodev/one-developer-one-year-18-billion-rows-a-point-in-time-alternative-data-platform-382l</guid>
      <description>&lt;p&gt;In the last year I built, alone, a quantitative research data platform: about 1.8 billion rows across 764 tables of alternative data, SEC filings, government records and market data, engineered to be trusted in a backtest. I am self-taught. The discipline came from the work itself: 206 architecture decision records and 680 research notes, one for every problem worth not solving twice.&lt;/p&gt;

&lt;p&gt;The hard problems were not the ones anyone warns you about. They were data problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack, in the terms the field uses
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Point-in-time (as-of) data.&lt;/strong&gt; Every record carries when it became public, not just when it happened, and 103 tables are bitemporal (valid time and recorded time). That is the defence against look-ahead bias, the most common way a backtest flatters itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Survivorship-bias-free history.&lt;/strong&gt; Delisted and renamed companies stay in the data with their history, and a window in which a stock dies is scored with its delisting return instead of being dropped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Entity resolution and a security master.&lt;/strong&gt; Record linkage across tickers, CIKs, LEIs and CUSIPs, with point-in-time symbology: tickers get renamed, reused and delisted, so "which company was this on that date" is answered as of the date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corporate actions.&lt;/strong&gt; Split and dividend adjustment validated against an independent source rather than against itself; the split-adjustment tool is open source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Information extraction (NLP) from regulatory filings.&lt;/strong&gt; 8-K events, earnings guidance and reported results, press releases, IPO prospectuses, SEC comment letters, material contracts, Schedule 13D/13G beneficial ownership, insider Forms 3/4/5, foreign-issuer reports and XBRL financial statements, turned into structured, dated facts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A medallion lakehouse.&lt;/strong&gt; Bronze, silver and gold layers on Parquet, PostgreSQL for the serving tables, about 456 data contracts guarding them, and data lineage that answers "what breaks downstream if this table changes" in one command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MLOps and model validation.&lt;/strong&gt; Feature pipelines, walk-forward and purged cross-validation, backtesting and paper trading, because a model that cannot fail a test is a horoscope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain-specific language models.&lt;/strong&gt; Small models fine-tuned for narrow financial extraction tasks on a desktop GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic workflows.&lt;/strong&gt; Model Context Protocol (MCP) servers that let AI agents query the data, and agent-to-agent orchestration around them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All of it on one workstation,&lt;/strong&gt; with a resource broker that schedules heavy jobs so the machine does not eat itself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the numbers: 4,776 commits since 21 November 2025, 5,281 Python files, 738 of them tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three lessons in data quality
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Labels lie; specifications do not.&lt;/strong&gt; The SEC's fund-holdings data (Form N-PORT) has a field called "Ticker". Measured across every quarter the SEC has published, about 28% of its 17.4 million values are not stock tickers: mortgage-pool codes, bond issuers' symbols, futures contracts. One pool code, FG, is also an NYSE ticker, so a naive join turns Freddie Mac mortgage pools into shares of an insurance company. The fix was metadata management, not cleverer code: the SEC's own form instructions say the field is a fallback identifier. I now build a data dictionary (a codebook, in the ISO/IEC 11179 sense) from each agency's official documentation before touching its data. The first seven dictionaries turned up twelve defects in the SEC's own published files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A test that compares data with itself proves nothing.&lt;/strong&gt; One evening every data-quality check on prices passed. The next morning an independent reconciliation found 236 days of prices rewritten onto the wrong side of a stock split. Every check had been comparing the pipeline with its own output. Now a data-quality claim needs an external witness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Coverage is not precision.&lt;/strong&gt; The easy metric in entity resolution is match rate. The useful one is precision. A shortcut that raised one match rate by ten points was right only 38% of the time against an independent identifier. It never shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is public
&lt;/h2&gt;

&lt;p&gt;Two open-source releases so far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;split-adjustment-tool&lt;/strong&gt; - verify, repair and apply stock-split adjustments against your own as-traded price tape. Vendor-neutral Python (Polars), Apache 2.0, release 0.4.0: &lt;a href="https://github.com/AlexBocio/split-adjustment-tool" rel="noopener noreferrer"&gt;https://github.com/AlexBocio/split-adjustment-tool&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;us-gov-data-dictionary&lt;/strong&gt; - machine-readable data dictionaries for seven SEC data sets: 1,469 fields, each with the SEC's own definition and citation, official code lists, and a profile of what the published files actually contain. W3C CSVW and SKOS formats, CC BY 4.0: &lt;a href="https://github.com/AlexBocio/us-gov-data-dictionary" rel="noopener noreferrer"&gt;https://github.com/AlexBocio/us-gov-data-dictionary&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More agencies are next. If you work with public financial data and it has ever quietly lied to you, I would like to hear the story.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>python</category>
      <category>machinelearning</category>
      <category>finance</category>
    </item>
  </channel>
</rss>
