QuantLib in Rust: libitofin und Python Integration
libitofin ist eine Portierung von QuantLib in Rust, die über itofin in Python verfügbar ist. Erfahren Sie, warum eine Bewertungsbibliothek Tabellen überlegen ist.
QuantLib in Rust ist die Kurzbezeichnung für libitofin: eine Portierung von QuantLib, der C++-Bibliothek, die seit Anfang der 2000er Jahre als Open-Source-Referenz für die Bewertung von Derivaten gilt, in die Sprache Rust, ergänzt durch ein Python-Paket namens itofin. Mit Stand August 2026 bezeichnet sich das Projekt selbst als Pre-1.0-Version; dieser Status bestimmt alle praktischen Aspekte der Anwendung. Eine Bewertungsbibliothek rechtfertigt ihre Existenz durch die Mechanismen, die um die mathematische Formel herum aufgebaut sind – und diese Mechanismen sind in jeder Programmiersprache die gleiche Aufgabe.
Was eine Bewertungsbibliothek bietet, das eine Tabellenkalkulationsformel nicht leisten kann
Eine Black-Scholes-Zelle in einer Tabellenkalkulation benötigt fünf Eingabewerte und liefert einen Preis. Die Formel ist dabei der einfache Teil. Vier Ebenen liegen um sie herum, und diese Ebenen bilden die Bibliothek.
Zinskurven (Term Structures). Ein Diskontierungssatz ist eine Kurve über verschiedene Laufzeiten hinweg, ergänzt durch eine Interpolationsregel für die Lücken zwischen den tatsächlich quotierten Punkten. Die folgende Grafik zeigt das Rohmaterial: die quotierten Treasury-Laufzeiten an einem bestimmten Datum.
Das exakte SQL hinter jeder Zahl
SELECT
arrayElement(tenors, i) AS tenor,
round(arrayElement(rates, i), 2) AS yield_pct,
formatDateTime(curve_date, '%b %e, %Y') AS as_of
FROM
(
SELECT
date AS curve_date,
['1 month', '3 months', '6 months', '1 year', '2 years', '3 years',
'5 years', '7 years', '10 years', '20 years', '30 years'] AS tenors,
[toFloat64(yield_1_month), toFloat64(yield_3_month), toFloat64(yield_6_month),
toFloat64(yield_1_year), toFloat64(yield_2_year), toFloat64(yield_3_year),
toFloat64(yield_5_year), toFloat64(yield_7_year), toFloat64(yield_10_year),
toFloat64(yield_20_year), toFloat64(yield_30_year)] AS rates,
arrayJoin(range(1, 12)) AS i
FROM global_markets.treasury_yields
WHERE date = (SELECT max(date) FROM global_markets.treasury_yields)
)
WHERE yield_pct > 0
ORDER BY iZum Stand Aug 10, 2026 umfasste die quotierte Kurve 7 Laufzeiten, von 3.79% bei 1 month bis 5.25% bei 30 years. Eine Tabellenkalkulation löst dies mit einem SVERWEIS und einem fest kodierten Wert von 4 %. Eine Bibliothek verwendet dafür ein Kurvenobjekt, auf dessen Basis jedes Instrument bewertet wird, unter Anwendung einer definierten Interpolation (linear bei Nullkuponraten, log-linear bei Diskontierungsfaktoren, monotone Splines) und einer Extrapolationsregel für den Bereich nach dem letzten Punkt. Verschiebt man dieses eine Objekt um einen Basispunkt, ändern sich alle Sensitivitäten im Portfolio konsistent mit.
Zinstagekonventionen (Day-count conventions). Zinsen fallen über einen Bruchteil eines Jahres an, und die Definition dieses Bruchteils ist eine an das Instrument gebundene Konvention. Actual/360 teilt die verstrichenen Tage durch 360. Actual/365 teilt durch 365. Die 30/360-Familie unterstellt, dass jeder Monat dreißig Tage hat. Business/252 zählt Handelstage im Verhältnis zu einem 252-Tage-Jahr, was einen echten Börsenkalender mit hinterlegten Feiertagen erfordert. Nehmen wir eine hypothetische Million Dollar, die zu 5 % für 90 Tage geliehen wird: Bei Actual/360 fallen 12.500 Dollar an, bei Actual/365 sind es 12.329 Dollar für denselben Handel. Die folgende Grafik zeigt, warum die Business-Day-Basis einen Kalender anstelle eines Divisors benötigt.
Das exakte SQL hinter jeder Zahl
SELECT
formatDateTime(toStartOfMonth(date), '%Y-%m') AS month,
countDistinct(date) AS trading_days,
toUInt8(toDayOfMonth(toLastDayOfMonth(max(date)))) AS calendar_days
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY'
AND date >= toStartOfMonth(today() - 365)
AND date < toStartOfMonth(today())
GROUP BY month
ORDER BY monthÜber die 12 Monate im Betrachtungszeitraum wies 2026-07 insgesamt 22 Handelstage gegenüber 31 Kalendertagen auf. Keine arithmetische Regel liefert diese erste Zahl. Sie stammt aus einem Feiertagskalender, und jeder Monat hat sein eigenes Ergebnis. Eine Bibliothek liefert diese Kalender für jeden Handelsplatz und jedes Land mit; in einer Tabellenkalkulation müssen Sie diese selbst pflegen.
Kalibrierungsmechanismen. Modellparameter sind nirgendwo direkt quotiert. Man wählt sie aus, indem man Modellpreise an beobachtete Marktpreise über eine gesamte Fläche von Quotierungen anpasst und bei Bewegungen der Fläche neu kalibriert. Dies ist ein Problem der beschränkten kleinsten Quadrate, für das die Bibliothek die notwendige Schleife bereitstellt: einen Levenberg-Marquardt-Optimierer, Parametertransformationen, die eine Varianz ohne harte Nebenbedingungen positiv halten, eine Kostenfunktion über den Quotierungssatz sowie Konvergenzkriterien, die bei Scheitern eine Fehlermeldung ausgeben, anstatt stillschweigend den Startwert zurückzugeben.
Eine numerische Ebene. Unter allem liegen lineare Algebra und Integration. QR- und SVD-Zerlegungen lösen die Systeme, die eine Anpassung erzeugt; Quadratur und Fourier-Integration bewerten Modelle, deren Formeln Integrale sind; Nullstellensucher leiten die implizite Volatilität ab. Diese Ebene ist unspektakulär, aber genau hier passieren bei Eigenentwicklungen die Fehler. Die klassische Variante ist ein selbst geschriebener Newton-Solver, der bei liquiden At-the-Money-Quotierungen konvergiert, aber bei tiefen Out-of-the-Money-Optionen versagt. Dicht gefolgt von einer Matrixinversion, die bei einer fast singulären Anpassung an Präzision verliert und völlig plausibel erscheinende, aber falsche Parameter zurückgibt. Wenn Sie das mentale Modell von Grund auf neu aufbauen, ist ein Open-Source-Quant-Trading-Buch ein besserer Ausgangspunkt als die API-Referenz einer Bibliothek.
Was ist libitofin und ist es QuantLib in Rust?
Ja, in der entscheidenden Hinsicht. Es ist eine Portierung des QuantLib-Designs in Rust, und das Projekt gibt an, gegen die eigene Test-Suite von QuantLib validiert zu sein. Das ist der seriöse Weg, eine numerische Bibliothek zu portieren: Ergebnisse werden gegen die Referenzimplementierung geprüft und nicht gegen eine handgeschriebene Erwartung, wie das Ergebnis aussehen sollte. Der Python-Zugang erfolgt über das Paket itofin, sodass ein Python-Prozess die Rust-Engine ohne C++-Toolchain ansprechen kann.
Die wichtigere Bezeichnung ist Pre-1.0. Nach der Versionierungskonvention von Rust gibt ein 0.x-Release kein Kompatibilitätsversprechen zwischen Nebenversionen ab: Von 0.4 auf 0.5 darf alles umbenannt, verschoben oder gelöscht werden. Betrachten Sie die API als bewegliches Ziel, woraus sich einige Gewohnheiten ergeben.
- Fixieren Sie eine exakte getaggte Version in Ihrer Lock-Datei und führen Sie Upgrades gezielt durch, wobei Ihre eigene Test-Suite als Kontrollinstanz dient.
- Pflegen Sie eine dünne eigene Wrapper-Schicht um die Typen der Bibliothek, damit eine Umbenennung nur in einer Datei statt in vierzig angepasst werden muss.
- Protokollieren Sie die Bibliotheksversion neben den erzeugten Zahlen, damit ein erneuter Lauf bei abweichenden Ergebnissen auf das Upgrade und nicht auf den Markt verweist.
- Halten Sie Kennzahlen für Produktionsmargen, Sicherheiten und regulatorische Risiken auf einer Basis, die ein Kompatibilitätsversprechen trägt, bis eine 1.0-Version verfügbar ist.
Dies ist keine Kritik am Projekt. Pre-1.0 ist eine zutreffende Selbstbeschreibung und der richtige Status für eine junge Portierung einer sehr umfangreichen Bibliothek. Das Fehlerszenario besteht darin, dass ein Anwender es als Drop-in-Ersatz für QuantLib behandelt und mitten im Quartal auf eine geänderte Signatur in einem Minor-Release stößt. Installationsanweisungen ändern sich ebenfalls mit der Version, und sowohl cargo als auch pip benötigen Netzwerkzugriff zur Auflösung; lesen Sie daher das README des Projekts bei dem Tag, den Sie fixieren wollen, anstatt einen Schnipsel aus einem Blogbeitrag zu kopieren – diesen hier eingeschlossen.
Python, eine kompilierte Engine oder Rust?
Zwei Fragen entscheiden dies, und bei keiner geht es um persönlichen Geschmack. Wie oft pro Sekunde bewerten Sie neu, und müssen Ihre Zahlen über verschiedene Prozesse hinweg übereinstimmen? Die Größe der Optionskette bestimmt den Maßstab der ersten Frage.
Das exakte SQL hinter jeder Zahl
WITH (SELECT max(date) FROM global_markets.options_greeks) AS last_session
SELECT
underlying_symbol AS symbol,
countDistinct(ticker) AS contracts_priced,
formatDateTime(max(date), '%b %e, %Y') AS as_of
FROM global_markets.options_greeks
WHERE date = last_session
AND underlying_symbol IN ('SPY', 'AAPL', 'NVDA', 'MSFT', 'KO')
AND volume > 0
GROUP BY symbol
ORDER BY contracts_priced DESCAm Aug 11, 2026 handelte SPY 5336 verschiedene Kontrakte in einer einzigen Sitzung, gegenüber 360 bei KO. Eine breite Kette einmal zu bewerten, ist trivial. Sie jedoch mit fünf Sensitivitäten pro Kontrakt bei jeder Kursaktualisierung über ein ganzes Portfolio von Basiswerten hinweg zu bewerten, ist ein anderes Programm mit anderen Anforderungen.
Bleiben Sie bei Python mit einer etablierten Bibliothek, wenn die Schleife in Tausenden von Bewertungen pro Minute gemessen wird und die Arbeit drumherum Forschung, Analyse oder End-of-Day-Bewertungen umfasst. Die Python-Bindings von QuantLib selbst sind die ausgereifte Wahl: dieselbe C++-Engine, die breiteste Instrumentenabdeckung und jahrelange Praxiserfahrung. Geschwindigkeit ist in der Forschung selten der limitierende Faktor; Abdeckung und Korrektheit sind es.
Rufen Sie eine kompilierte Engine aus Python auf, wenn die Schleife rechenintensiv ist, der Code drumherum jedoch nicht. Die zu beachtenden Kosten liegen an der Schnittstelle selbst. Ein Aufruf pro Kontrakt aus Python verursacht bei jedem Übergang Overhead; die Lösung besteht darin, der Engine ein Array zu übergeben und ein Array zurückzuerhalten. Dies ist der Anwendungsbereich, auf den itofin neben QuantLib-Python abzielt.
Schreiben Sie Rust, wenn die Bewertungsschleife das Produkt selbst ist: ein Pricer innerhalb eines Quoting-Dienstes, eine Risikoberechnung nach einem Zeitplan, den Sie einhalten müssen, oder eine Binärdatei für ein System ohne Python. Die zweite Frage führt ebenfalls hierher. Fließkommaergebnisse hängen von der Reihenfolge der Operationen ab; daher kann dasselbe Modell bei zwei Implementierungen in den letzten Nachkommastellen abweichen. Ein Forschungs-Notebook, das nicht mit einem Produktionsdienst übereinstimmt, bedeutet eine Woche Forensik. Eine Engine, die von beiden Seiten genutzt wird, eliminiert diese Kategorie von Diskrepanzen – das ist das stichhaltige Argument für einen kompilierten Kern mit Bindings, unabhängig von der Sprache. Dasselbe gilt für die Strategieentwicklung, wie ein reproduzierbarer Backtest zeigt.
Wo das Kalibrierungsziel tatsächlich liegt
Kalibrierung benötigt eine Referenz, und diese Referenz ist eine Fläche marktimpliziter Volatilitäten. Die Nullstellensuche hierfür wird in wie implizite Volatilität berechnet wird behandelt. Die folgende Form ist das, was ein Modell treffen muss.
Das exakte SQL hinter jeder Zahl
SELECT
multiIf(days_to_expiry <= 7, '0 to 7 days',
days_to_expiry <= 30, '8 to 30 days',
days_to_expiry <= 60, '31 to 60 days',
days_to_expiry <= 120, '61 to 120 days',
days_to_expiry <= 240, '121 to 240 days',
'241 days or more') AS dte_bucket,
round(avg(implied_volatility) * 100, 1) AS iv_pct,
countDistinct(ticker) AS contracts
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date >= today() - 10
AND days_to_expiry >= 0
AND iv_converged = 1
AND volume > 0
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
GROUP BY dte_bucket
ORDER BY min(days_to_expiry)Im Bereich At-the-Money wiesen AAPL-Kontrakte im 0 to 7 days-Bucket eine durchschnittliche implizite Volatilität von 29.6% über die betrachteten Sitzungen auf, gegenüber 29.3% bei 241 days or more. Ein Modell mit nur einem Volatilitätsparameter kann nicht beide Punkte gleichzeitig treffen; genau deshalb existieren Modelle mit einer Volatilitätsstruktur. Die Anpassung an eine solche Fläche ist der Kalibrierungsschritt, und die Sensitivitäten, die aus dem angepassten Modell resultieren, sind die Griechen, die in die Optionsgriechen erklärt behandelt werden.
Wie diese Panels erstellt wurden
Das Kurven-Panel liest das aktuellste quotierte Datum der Treasury-Serie und entfaltet dessen elf Laufzeitspalten in Zeilen, wobei Laufzeiten ohne Quotierung an diesem Tag verworfen werden. Das Sitzungs-Panel zählt unterschiedliche Daten auf dem SPY-Tape pro Monat, was ein sauberer Indikator für die Anzahl der tatsächlichen Handelstage ist. Das Ketten-Panel zählt unterschiedliche Kontraktcodes mit einem Volumen ungleich Null in der letzten verfügbaren Sitzung, gruppiert nach Basiswert. Das Volatilitäts-Panel behält nur konvergierte Lösungen mit Volumen ungleich Null und Strikes innerhalb von 5 % des Schlusskurses des Basiswerts bei, was dem Standardband für At-the-Money entspricht; der vordere Bucket beinhaltet Verfallstage am selben Tag.
FAQ
Ist libitofin ein Drop-in-Ersatz für QuantLib?
Nein. Mit Stand August 2026 ist es eine Pre-1.0-Portierung, die einen Teil des QuantLib-Umfangs abdeckt und ihre Ergebnisse gegen die eigene Test-Suite von QuantLib validiert. QuantLib selbst, angesprochen über seine Python-Bindings, bleibt die umfassendere und stabilere Option für die Produktion.
Was bedeutet Pre-1.0 für eine Bewertungsbibliothek?
Nach der Versionierungskonvention von Rust gibt ein 0.x-Release kein Kompatibilitätsversprechen ab: Die nächste Nebenversion kann alles umbenennen oder entfernen. In der Praxis bedeutet dies, eine exakte getaggte Version zu fixieren und bei jedem Upgrade die eigene Test-Suite erneut auszuführen.
Muss ich Rust beherrschen, um libitofin zu nutzen?
Nein. Das Projekt veröffentlicht ein Python-Paket namens itofin, sodass die Engine aus einem normalen Python-Prozess aufrufbar ist. Rust wird erst relevant, wenn die Bewertungsschleife selbst das Produkt ist, das Sie ausliefern.
Was bietet mir eine Bewertungsbibliothek, das eine Tabellenkalkulationsformel nicht kann?
Kurven statt einzelner Zinssätze, Zinstagekonventionen mit echten Börsenkalendern, eine Kalibrierungsschleife, die Modellparameter an quotierte Preise anpasst, und eine getestete numerische Ebene unter all dem. Die geschlossene Formel ist nur ein kleiner Teil der Arbeit.
Ändert die Programmiersprache den Optionspreis?
Mathematisch nicht. Sie ändert die Reproduzierbarkeit: Fließkommaergebnisse hängen von der Reihenfolge der Operationen ab, sodass zwei Implementierungen eines Modells in den letzten Stellen abweichen können. Forschung und Produktion mit derselben Engine zu betreiben, beseitigt diese Lücke.
Jedes Panel hier enthält die exakte SQL-Abfrage, sodass Sie eines aufklappen können, um die Zählweise zu sehen. Dieselben Fragen zu Kurven, Kalendern und Ketten können auf dem Strasmore-Terminal in einfacher Sprache gestellt werden.