Dansk

Alex Henry Christensen

Economist · MSc in Economics · Copenhagen

Download my CV (PDF)

Projects

I am an economist working with the analysis of large volumes of data. I use AI to build the tools and databases that analysis requires, far faster than would otherwise be possible, but I never trust a result until I have checked it myself. I build those tools with AI agents such as Claude Code and Codex, and design them so that both the agents and I can use them.

The common thread in my work is information: how good it is, and what it can be used for. It goes back to nine years as a trader, making decisions on incomplete information, and it runs through both projects below.

What ties these projects together is that I want to own my data. That way I can keep the history, combine sources freely and ask new questions. I enjoy working with numbers and text alike: prices, financial statements and interest rates on one side, annual reports and news on the other. The best answers often come from combining the two, and that is what my projects are built to do.

Project 1

Custom industry classification of US companies

July 2025 – present

Official industry codes often say too little about what a company actually does. So I collect the annual reports of US listed companies myself, extract the business description and risk factors, and compare the texts. The result is a set of groups and themes that cut across industries, which I use to find related companies when a stock rises or falls unusually sharply.

An end-to-end example: Red Cat. Red Cat Holdings makes drones for the US military. Here we follow the company through the method.

Step 1 · The problem

What is Red Cat according to the official codes?

The SIC code puts Red Cat with software companies, and GICS puts it with aircraft manufacturers and defence giants. Neither tells you that it is a small drone company.

Step 2 · The annual report

Only what is specific to Red Cat counts

The risk factor section of Red Cat's annual report is split into passages. Boilerplate – passages that appear almost word for word at many other companies – is removed, because otherwise it makes every company look alike. Most of Red Cat's passages turn out to be boilerplate.

Step 3 · From text to numbers

The text becomes vectors that can be compared

Item 1A→slightly overlapping
passages
→ embedding model→one vector per passage
and per document

An embedding model reads the text and turns it into a long vector of numbers, where texts with similar meaning get vectors that point in the same direction. This is done for each passage of the risk factor section, for the section as a whole and for the company profile. Alongside this, TF-IDF measures which words are distinctive for the company, and that word vector is compressed with SVD. Each vector is normalised, weighted and combined into a single vector per company.

Fingerprint: the first 24 principal components of each company's combined vector. Blue is below average, red above, grey close to zero. Red Cat and Ondas clearly share the same pattern; Microsoft's is different. Hover over a cell to see the value.

Cosine similarity between Red Cat and four other companies, for each source and combined. The highest value in each column is in bold.

The sources disagree. TF-IDF counts words and finds Kratos closest, because they share the language of defence contracts. Embeddings place companies by what the text means, and find Ondas closest. The company profile is the only text the company has not written itself in its annual report, and it points the same way. That is why the sources are weighted together rather than relying on any one of them.

Step 4 · Ranking

Red Cat's nearest peers, ranked

Every company is compared with every other in three ways: the most similar text passages, TF-IDF and the business description. Each measure is standardised, and their sum gives a single score by which all companies are ranked. The table shows Red Cat's eight nearest peers, with their rank on each measure.

The two closest are the defence companies Kratos and AeroVironment, which share the language of Pentagon contracts. But Red Cat shares its drone vocabulary with AIRO, Ondas and Unusual Machines. So the individual peers pull in two directions. It is the groups in the next step that bring the picture together.

Step 5 · The map

Every company, placed by how similar their text is

Red Cat's own group: Drone & Robotics Ventures GICS: Aerospace & Defense SIC 7372: software All other companies

Hover over a point to see the company and its group. The map is a t-SNE projection of the same text vectors the groups are built from. The projection preserves which companies are close to each other, but not the exact distances between groups.

The groups are formed with two-level Ward clustering on the combined text vectors, and on those alone. Clusters are built from companies above a certain size, so that the many very small companies do not dictate the groups. Smaller companies are then assigned to the group they are closest to. Red Cat is large enough to be included from the start. A language model names the groups afterwards, but it plays no part in forming them.

The software companies from the SIC code sit somewhere else entirely. Red Cat, on the other hand, sits right among the GICS defence companies because the text is similar, and Red Cat's own group appears as two clusters. The map is only a two-dimensional sketch. The grouping happens in the full vectors, where Red Cat is closest to the drone group, as the next step shows.

Step 6 · Checking against returns

Does Red Cat's own group fit better than SIC and GICS?

Returns play no part in forming the groups. They are used afterwards to check whether the grouping is right. Here Red Cat is compared with its own group and with the two official groups from step 1.

Drone & Robotics Ventures GICS: Aerospace & Defense SIC 7372: software

Each dot is one group. Text: how close Red Cat's text is to the group average. Returns: how closely Red Cat's daily returns track the group's average return over the past year. Hover over a dot to see the value.

Red Cat's own group is the closest on both rows. The SIC code misses by a wide margin: the software companies' returns track Red Cat poorly. GICS comes closer, because the defence industry does share customers with Red Cat.

How much do the groups move with the market?

Beta against the average stock over the past year, for each group as a whole and for Red Cat itself.

This is where the difference is clearest. Red Cat swings far more than the average stock, and only its own group comes close. Software and defence stocks swing much less. An investor comparing Red Cat with the official groups would get the wrong picture of the risk.

Step 7 · The journey

Where Red Cat started, and where it ended up

Before · SIC 7372

Software

  • Microsoft software and cloud
  • Oracle databases and cloud
  • Palantir data analytics for government and business
  • CrowdStrike cybersecurity
  • SAP business software
Before · GICS

Aerospace & Defense

  • GE Aerospace jet engines
  • RTX jet engines, missiles and defence systems
  • Boeing commercial and military aircraft
  • Lockheed Martin fighter jets, missiles and space
  • General Dynamics submarines, tanks and business jets
↓
After · Red Cat's own group

Drone & Robotics Ventures

  • Red Cat drones for military and commercial use
  • Ondas drones and private wireless networks
  • Unusual Machines small drones and drone components
  • AIRO Group drones, avionics and pilot training
  • Serve Robotics autonomous food delivery robots
  • Richtech Robotics service robots for restaurants and more
  • Palladyne AI AI software for robots

Red Cat started out alongside the world's largest software and defence companies. It now sits among small companies that make drones and robots and, like Red Cat, swing far more than the market.

What the example shows

From the wrong industry code to the right peers

The official codes grouped Red Cat with software companies and defence giants. By reading what the company writes about itself, removing boilerplate and comparing the text in three ways, Red Cat ended up in a group of small drone and robotics companies. Returns played no part in the grouping, but they confirm it: Red Cat tracks its own group more closely than either official one, and only that group comes close to how much Red Cat swings.

That Red Cat tracks its own group more closely is the whole point. Comparable companies are used everywhere in finance: to build portfolios, to value stocks and to explain where risk comes from. Get the peer group wrong, and all three go wrong. Researchers at BlackRock reached a similar conclusion: companies that are similar in embeddings of their business descriptions in SEC filings also have similar returns (Company Similarity using Large Language Models, 2023).

Project 2

Stock market analysis system

May 2026 – present

I built the entire system myself. Every day, an SQL database pulls in prices, news, financial statements, interest rates and the calendar of upcoming economic releases, and a background service keeps it up to date. The analysis itself runs in local software I have built in Rust with AI agents, with a separate program for each area. Using time series analysis of prices and trading volume, I find stocks that move unusually and investigate why.

An example: why did AIRO rise 26% on 13 August 2026? AIRO Group makes drones, avionics and pilot training, and sits in the same group as Red Cat. A price move does not explain itself. The answer is scattered across prices, financial statements, SEC filings, news, interest rates and the economic calendar. With everything in one database and the date as the common key, the question can be asked in one place.

Step 1 · The signal

The day stands out from AIRO's own history

The signals program on 13 August 2026 with AIRO highlighted
The signals program on 13 August: every stock with an unusual move that day. AIRO is highlighted with a return of +26.1% and a z-score of 4.6.
AIRO's price chart with 13 August highlighted
The chart program: AIRO's price and trading volume with 13 August highlighted. The numbers above the candles are z-scores for the largest moves.

Every day, each stock is compared with its own history using rolling z-scores for returns and trading volume.

On 13 August, both the return and the trading volume were far outside what is normal for AIRO. That is how stocks in focus are found: the unusual rises to the top.

Step 2 · The group

Did the whole drone group rise?

The clusters program on 13 August 2026 with the drone group highlighted
The clusters program on 13 August: how each group moved that day. The drone group is highlighted, with AIRO at the top of its biggest movers.

Return that day for each company in the group.

No. The companies in the group went in different directions, and the group median was roughly zero. The move came from AIRO itself.

Step 3 · The market

Was it the market?

The treasury program with the yield curve on 13 August 2026
The treasury program: the yield curve on 13 August against the day before. Yields fell by up to 6 basis points; at the bottom is the spread between 2- and 10-year yields over the past year.

That morning, producer prices came in below expectations, and yields dipped slightly across the curve. The typical stock rose a few tenths of a percent. A gentle lift for the market, but nothing that explains 26%.

Step 4 · The company

Quarterly results beat expectations

The filings program with the day's SEC filings
The filings program: the day's SEC filings, sorted by price reaction. AIRO's 8-K at 6:30 am is highlighted.

That morning, before the market opened, AIRO filed its quarterly results with the SEC. Revenue was well above what analysts expected, and the loss much smaller. This is the explanation.

Step 5 · The day's timeline

Every source on one timeline

Times are New York time.

The results came out at 6:30 am, three hours before the market opened. That is why the stock opened sharply higher and kept rising through the day. The macro data landed in between and moved the market only slightly.

Step 6 · Ownership

Who owns AIRO, and when did it become known?

The ownership program with AIRO's owners above 5%
The ownership program: filings on ownership above 5% over the past 90 days, filtered for AIRO. Both were filed on 14 August, the day after the jump.

The program collects every filing on ownership above 5% (13D and 13G) across the whole stock universe, and tracks the quarterly 13F portfolios of the investors I follow.

The day after the jump, two new owners above 5% appear, with 14.6% and 5.3% of the shares. That could look like a reaction to the results. But the filings report ownership as of 30 June, before the results came out. Both were filed under Rule 13d-1(d), which covers owners who did not buy their stake in the market – typically those who held the shares before the company went public. They must file within 45 days of the end of the quarter, and 14 August is exactly 45 days after 30 June. The date follows the calendar, not the share price. That is the kind of thing you only see when you go back to the source.

What the example shows

The answer needed every source at once

Explaining a single day's price move took prices, the group's move, interest rates, the economic calendar, SEC filings, the earnings report and the news. The ownership filings turned out to be a false lead, and only going back to the source could rule them out. That is why I built the system. A background service fetches everything on a fixed schedule, even when no windows are open. The history is stored, so I can go back in time with new questions, and the date ties the sources together.

On top of the database, I have built my own local software in Rust with AI agents, one program for each area: signals, price chart, groups, yield curve, earnings, filings, ownership, news and calendars. They stay in sync: when I pick a stock and a day in one window, the others follow to the same stock and day.

I built it myself to be free to analyse whatever I want, but also because a lot of trading software is slow and bloated. The programs are written in Rust with ratatui and run in the terminal. They start instantly and use only a fraction of the memory my first version, a web app, needed. When I am not using them, they put almost no load on the computer.