Hallo Habr!
Diese Veröffentlichung erschien mir interessant:
Wir erhalten
absolute Wechselkurse aus gepaarten Wechselkursen, und ich wollte die Fähigkeit testen, diesen aaaabsoluten Wechselkurs durch numerische Modellierung zu ermitteln, wobei die lineare Algebra im Allgemeinen aufgegeben wird.

Die Ergebnisse waren interessant.
Das Experiment wird klein sein: 4 Währungen, 6 Währungspaare. Für jedes Paar eine Kursmessung.
Also fangen wir an
Die Hypothese ist, dass der Wert einer Währung als ein Wert ausgedrückt werden kann, der den Wert anderer Währungen berücksichtigt, in denen er notiert ist, während andere Währungen selbst im Wert aller anderen Währungen ausgedrückt werden. Dies ist eine interessante rekursive Aufgabe.
Es gibt 4 Währungen:
Für sie wurden die Währungspaare gewählt:
- eurusd
- gbpusd
- eurchf
- eurgbp
- gbpchf
- usdchf
Bitte beachten Sie, dass wenn die Anzahl der Währungen n = 4 ist, die Anzahl der Paare k = (n ^ 2 - n) / 2 = 6 ist. Es macht keinen Sinn, nach usdeur zu suchen, wenn eurusd angegeben ist ...
Zum Zeitpunkt t wurde der Wechselkurs eines der Anbieter gemessen:

Für diese Werte werden Berechnungen durchgeführt.
Mathe
Ich löse das Problem, indem ich den Gradienten der Verlustfunktion, die im Wesentlichen ein Gleichungssystem ist, analytisch nehme.
Der Experimentcode wird in R sein:
R ermöglicht die Verwendung von stats :: D, um eine Ableitung einer Funktion zu erhalten. Wenn wir zum Beispiel nach der USD-Währung differenzieren möchten, erhalten wir den Ausdruck:
2 * (eur / usd ^ 2 * (eurusd - eur / usd)) + 2 * (gbp / usd ^ 2 * (gbpusd -
gbp / usd)) - 2 * (1 / chf * (usdchf - usd / chf))
Um den Wert der Express-Funktion zu reduzieren, führen wir einen Gradientenabstieg durch und es ist sofort klar (wir sehen quadratische Unterschiede), dass der Mindestwert Null ist, was wir brauchen.
-deriv_vals * lr
Der Gradientenabstiegsschritt wird durch den Parameter lr gesteuert und dies alles mit einem negativen Vorzeichen.
Das heißt, in menschlichen Worten, wir wählen die Kurse von 4 Währungen so aus, dass alle Währungspaare im Experiment Werte erhalten, die den Anfangswerten dieser Paare entsprechen. Mmm, lass uns das Rätsel lösen - in der Stirn!
Ergebnisse
Um mich nicht zu dehnen, werde ich Sie sofort über Folgendes informieren: Das gesamte Experiment war erfolgreich, der Code funktionierte, der Fehler ging nahe, nahe Null. Aber dann habe ich festgestellt, dass die Ergebnisse immer unterschiedlich sind.
Eine Frage für Kenner: Es scheint, dass diese Aufgabe eine unbegrenzte Anzahl von Lösungen hat, aber darin bin ich eine vollständige Null, ich denke, sie werden es mir in den Kommentaren sagen.
Um die (Un-) Stabilität der Lösung zu überprüfen, habe ich 1000 Mal simuliert, ohne den PRNG-Startwert für die Startwerte der Währungswerte festzulegen.
Und hier kommt das Bild aus der Kata: Der Fehler erreicht immer 0,00001 und weniger (die Optimierung wird auf diese Weise eingestellt), während die Werte der Währungen dem Teufel schweben, weiß wo. Es stellt sich heraus, dass es immer eine andere Entscheidung gibt, meine Herren!
Nochmals dieses Bild, y-Achse in den ursprünglichen Einheiten (nicht log.):

Damit Sie dies wiederholen können, füge ich unten den vollständigen Code hinzu.
Der Code für 1000 Simulationen funktioniert ungefähr eine Minute lang.Fazit
Folgendes bleibt mir unklar:
- Ist es möglich, die Lösung auf knifflige mathematische Weise zu stabilisieren?
- ob es eine Konvergenz mit mehr Währungen und Währungspaaren geben wird;
- Wenn es keine Stabilität geben kann, werden unsere Währungen für jeden neuen Datenschnappschuss so laufen, wie sie möchten, wenn Sie den PRNG-Startwert nicht reparieren, und dies ist ein Fehler.
Die ganze Idee scheint sehr vage zu sein, da keine verständlichen Voraussetzungen und Einschränkungen vorliegen. Aber es war interessant!
Nun, ich wollte auch sagen, dass Sie auf OLS verzichten können, wenn die Daten schwierig sind, die Matrizen singulär sind oder wenn die Theorie wenig bekannt ist (ehh ...).
Danke
eavprog für die erste Nachricht.
Tschüss!