Overblik
Hvad er det
En platform til automatiseret handel med værdipapirer, valuta og kryptovaluta
Udbredelse
23.100+ stjerner på GitHub, 2.900+ forks
Relevant for
Privatpersoner der er nysgerrige på algoritmisk handel, investeringsteams og fintech-virksomheder. Du behøver ikke være Python-ekspert.
Sværhedsgrad
Du behøver ikke at kunne skrive koden selv. Med et værktøj som Claude Code, der hjælper med opsætning og kode, kommer du langt med nysgerrighed og tålmodighed.
Licens: LGPL-3.0
Du kan frit bruge NautilusTrader kommercielt, herunder til at tjene penge på handelsstrategier. Dine egne strategier forbliver din ejendom. Hvis du ændrer selve platformen (ikke dine strategier), skal ændringerne gøres offentligt tilgængelige. Skaberne bærer intet ansvar for tab.
De fleste handler på det amerikanske aktiemarked bliver i dag udført af computere, ikke af mennesker. Omkring 70 % af al handel kommer fra programmer, der køber og sælger automatisk efter faste regler1.
Værktøjerne til at eksekvere den slags handel har normalt været forbeholdt hedgefonde og banker, altså aktører med midlerne til at investere i de bedste systemer. NautilusTrader vender den ligning om: det er et professionelt system, der er gratis og Open Source.
Hvad Nautilus gør
Nautilus er bygget til to formål. Det første er at teste handelsalgoritmer mod historiske data. Det andet er at eksekvere dem på rigtige markeder, når du er klar. Begge dele sker i samme system og med samme kode. Du skriver ikke strategien om, når du går fra test til live.
Når du er klar til rigtige markeder, har platformen indbyggede integrationer til en lang række børser, mæglere og dataudbydere:
Integration
Type
Interactive Brokers
INTERACTIVE_BROKERS
Brokerage (multi-venue)
Betfair
BETFAIR
Sports Betting Exchange
Binance
BINANCE
Crypto Exchange (CEX)
Det er blot et udsnit. Alene Interactive Brokers giver adgang til tusindvis af markeder verden over, og ud over de tre ovenfor kan Nautilus også forbinde til en lang række andre kryptobørser, prediction markets og dataudbydere.
Min egen baggrund
Jeg har meget lidt erfaring med algoritmisk handel. Men det er sådan set også en del af pointen. Har man Claude Code, NautilusTrader og viljen, så har man muligheden for at lære det. Værktøjerne er ikke længere flaskehalsen. Det er nysgerrigheden og tålmodigheden, der afgør, hvor langt man kommer.
Jeg vil dog skynde mig at sige, at jeg ikke har sat rigtige penge i spil. Jeg er gået videre fra backtests til at lade strategien køre live på Binance testnet med de fake penge, man får stillet til rådighed der.
Begrebet
En backtest går ud på at afprøve en algoritme på historiske data for at se, hvordan den ville have klaret sig. Det giver en idé om, hvorvidt algoritmen overhovedet fungerer efter hensigten.
Lige så vigtigt: der kan være rene fejl i ens kode. Dem vil man langt hellere opdage i en test end med rigtige penge på spil. En backtest er altså både en test af, om strategien duer, og et sikkerhedsnet, før noget går live.
Historiske resultater er aldrig en garanti for fremtiden. Men en fejl, man fanger i en backtest, er en fejl, der ikke kostede penge.
Den ærlige forudsætning
Noget af det første, jeg lærte, da jeg satte mig ind i det her, er at man ikke kan hamle op med de professionelle på ren hastighed. Hvis en hedgefond kører præcis samme strategi som dig, kommer de først til fadet. Deres infrastruktur lader dem handle hurtigere end den almindelige investor.
Sådan som jeg forstår det, er det egentlig ret simpelt: de placerer en fysisk server så tæt på børsens egne servere som muligt, udelukkende for at vinde de mikrosekunder, som afstanden koster. Det kaldes co-location, og det er en konkurrence om hastighed, du ikke kan vinde fra en laptop derhjemme.
Software er kun den ene side af mønten. NautilusTrader er professionel software bygget til ekstraordinær hastighed, men når det handler om ekstrem hastighed, er hardware og den fysiske distance til børsens server den anden side. Den side ejer de store aktører.
Du vinder ikke kapløbet om millisekunder. Men det betyder ikke, at du ikke kan drage fordel af algoritmisk handel.
Hvad der kan lade sig gøre
Men man kommer tæt på. Der findes algoritmiske strategier, som ikke udelukkende afhænger af at kunne handle hurtigst på professionel vis. Mange af dem opererer på timer, dage eller uger, ikke mikrosekunder, og der spiller co-location ingen rolle.
Min egen tilgang har ikke været at opfinde noget genialt selv. Jeg tog en klassisk strategi, der har været brugt i årtier, og lod den køre. Og jeg behøvede ikke engang skrive den selv.
Færdige strategier
En af grundene til, at jeg valgte Nautilus, er at det kommer med et helt katalog af færdige strategier. Jeg kunne tage en velkendt strategi, konfigurere den med et par linjer og lade den køre, i stedet for at bygge logikken fra bunden. For en, der lige er gået i gang, er det en kæmpe genvej.
Den, jeg valgte, hedder EMA-Crossover Long-Only. Der findes mange flere at prøve, og sider som Quantpedia samler oven i det et stort katalog af strategier hentet fra forskning.
Strategien jeg brugte
EMA står for exponential moving average, altså et glidende gennemsnit af prisen. Forestil dig en linje, der følger prisen, men udjævner de små udsving, så man ser trenden i stedet for hvert lille ryk. Et EMA lægger mest vægt på de nyeste priser, så det reagerer hurtigt, når noget ændrer sig.
Strategien bruger to af dem på én gang: et hurtigt, der reagerer kvikt, og et langsomt, der viser den større trend. Når det hurtige krydser op gennem det langsomme, er det et købssignal. Når det krydser ned igen, sælges der. “Long-only” betyder, at jeg kun køber og sælger det, jeg ejer. Jeg satser ikke på, at prisen falder.
Reglen i to linjer
Hurtigt gennemsnit krydser op gennem det langsomme: køb. Hurtigt gennemsnit krydser ned gennem det langsomme: sælg. Mellem to signaler holder jeg enten positionen eller står i kontanter. Det er en gammel og velkendt strategi, og som ny valgte jeg den netop derfor: så kunne jeg læne mig op ad noget gennemprøvet i stedet for at finde på noget selv. I Nautilus hedder den EMACrossLongOnly og ligger klar til brug.
Jeg kørte den bevidst i en aggressiv opsætning med meget korte intervaller, så den lavede mange handler. Formålet var at se, om hele maskineriet virkede, ikke at tjene penge. Med så korte intervaller og et gebyr på hver handel er den nærmest sikker på at tabe over tid. Mere om det nedenfor.
Data til test
For at teste strategien havde jeg brug for data. Jeg brugte Binance Testnet. Binance tilbyder et API, der kan levere realtidsdata, så jeg kunne afprøve min algoritme mod handel med Bitcoin uden at sætte rigtige penge på spil.
Testnet er en sandbox-version af Binance: man handler med fake penge mod et rigtigt API. Jeg fik stillet fake balance til rådighed og lod botten køre der, så jeg kunne følge, hvordan den opførte sig, uden at noget rigtigt var på spil. Testnet har kun et kort vindue af historiske data, men EMA-Crossover skal kun bruge nogle få timers historik for at komme i gang, så det var ikke noget problem. Nautilus henter selv den smule historik, der skal til, når botten starter.
Opsætning
Kernen i NautilusTrader er skrevet i Rust, et kodesprog der er bygget til hastighed, mens selve strategierne og algoritmerne skrives i Python. Python var i øvrigt den del, jeg kunne få Claude til at skrive. Platformen klarer alt det “kedelige”: forbindelse til børser, korrekt afsendelse af ordrer, styr på positioner, real-time prisdata og reconnects når nettet hakker. Den samme kode kan køre både i backtest mod historiske data og live mod en rigtig børs, uden omskrivning.
Installationen var kort. Med Python 3.12 eller nyere så den sådan ud:
# Opret et isoleret Python-miljø
python3 -m venv .venv
# Installer Nautilus med Binance-adapteren
.venv/bin/pip install -U "nautilus_trader[binance]"Derfra oprettede jeg en gratis Testnet-konto (man kan logge ind med GitHub), genererede et sæt API-nøgler og pegede Nautilus mod testnet i stedet for mainnet. Selve strategien skrev jeg ikke. Jeg importerede den indbyggede EMACrossLongOnly og konfigurerede den med et par linjer: hvilket aktiv, hvor lange de to gennemsnit skulle være, og hvor stor hver handel måtte være.
from nautilus_trader.examples.strategies.ema_cross_long_only import (
EMACrossLongOnly,
EMACrossLongOnlyConfig,
)
# Hele strategi-arbejdet: konfigurer den indbyggede strategi
strategy = EMACrossLongOnly(config=EMACrossLongOnlyConfig(
instrument_id="BTCUSDT.BINANCE",
fast_ema_period=3, # hurtigt gennemsnit (3 min)
slow_ema_period=8, # langsomt gennemsnit (8 min)
trade_size=Decimal("0.001"), # BTC per handel
))Resten af koden er standard-opsætning: opret forbindelse til Binance Testnet, tilføj strategien, og start botten. Den fulde dokumentation findes på nautilustrader.io og i GitHub-repoet, som er linket nederst.
Visualisering
NautilusTrader leverer selv handelsmotoren, men ikke en grafisk visning af, hvad der foregår. For at kunne følge med byggede jeg et lille dashboard med Streamlit, et Python-bibliotek der laver browser-baserede dashboards ud fra ganske få linjer kode. I alt fyldte det omkring 200 linjer Python. Det læser den CSV-fil, botten skriver til, og viser den i browseren.

Jeg startede dashboardet med én kommando:
streamlit run dashboard.pyOpsætningen består af to uafhængige Python-processer, der ikke kender hinanden. De taler kun sammen gennem en CSV-fil på disken: botten skriver til den, og dashboardet læser fra den hvert tiende sekund.
+--------------+ skriv +-----------+ læs +---------------+
| Bot | -------------> | CSV-fil | <------------- | Streamlit |
| (proces 1) | append | | hver 10 s | (proces 2) |
+--------------+ +-----------+ +-------+-------+
|
| HTTP
v
+--------+--------+
| Browser |
| localhost:8501 |
+-----------------+Fordi de er adskilte, påvirker de ikke hinanden. Hvis dashboardet crasher, handler botten videre. Hvis botten stopper, viser dashboardet stadig de sidst kendte data. Og jeg kunne stoppe og genstarte den ene uden at røre den anden.
Status øverst
Om botten kører eller er stoppet, BTC-prisen live hentet fra Binance hvert femte sekund, samt antal handler, antal lukkede positioner og den akkumulerede gevinst eller tab.
Prisgraf med markører
En candlestick-graf med BTC-prisen de seneste 24 timer. Grønne trekanter markerer køb, røde markerer salg. Man kan zoome og holde musen over en candle for detaljer.
Equity-kurve
En linje, der viser kontoens værdi over tid. Den bygges ud fra de lukkede positioner i CSV-filen og er tom, indtil den første position lukker.
Tabel med seneste handler
De 15 seneste handler med tidsstempel, side (køb eller salg), mængde og pris.
I stedet for at koble bot og dashboard direkte sammen med beskedkøer eller delt hukommelse valgte jeg det enkleste, jeg kunne komme i tanke om: en CSV-fil. Der er ingen netværksforbindelser at holde styr på og ingen serialisering. Jeg kan åbne filen direkte i Excel og se, hvad der skete. Og hvis maskinen genstarter, læser dashboardet bare filen igen og viser hele historikken.
For et lille personligt projekt med under tusind handler om året er CSV rigeligt. Ved større mængder ville man skifte til et format som Parquet eller en database som SQLite.
Hvad jeg tog med
I mine backtests slog EMA-Crossover ikke markedet. Den beskyttede fint i faldende markeder, men i stigende markeder haltede den langt efter bare at have holdt Bitcoin. Sådan som jeg læser tallene, handler den mere om at undgå store tab end om at tjene stort. Jeg er stadig ny i det her, så det er en konklusion fra mine egne tests, ikke fra års erfaring.
Den største lektion var nok, hvor meget tidsrammen betyder. Da jeg testede med længere intervaller, halverede jeg næsten gebyrerne og fordoblede nettoresultatet. På de helt korte intervaller, som min live-bot kører på, æder gebyrerne det meste. Derfor er den opsætning også kun til test, ikke til at tjene penge.
En backtest viser kun, hvordan en strategi ville have klaret sig i fortiden. Det er en af grundene til, at jeg indtil videre er blevet på testnet og ikke har sat rigtige penge i spil.
For mig var hele øvelsen lærerig i sig selv. Jeg lærte mere om markeder og kode af at bygge ét fungerende system, end jeg kunne have læst mig til.
Læs mere
Kilder
Nyhedsbrev
Jeg sender en lignende gennemgang af et Open Source-projekt ca. en gang om måneden.