Halo, Habr!
Publikasi ini sepertinya menarik bagi saya:
Kami mendapatkan
nilai tukar absolut dari nilai tukar lintas mata uang berpasangan dan saya ingin menguji kemampuan untuk menemukan nilai tukar aaaabsolute ini melalui pemodelan numerik, umumnya meninggalkan aljabar linear.

Hasilnya menarik.
Eksperimen akan menjadi kecil: 4 mata uang, 6 pasangan mata uang. Untuk setiap pasangan, satu pengukuran saja.
Jadi mari kita mulai
Hipotesisnya adalah bahwa nilai mata uang apa pun dapat dinyatakan sebagai nilai yang akan memperhitungkan nilai mata uang lain yang dikutipnya, sementara mata uang lain sendiri akan dinyatakan dalam nilai semua mata uang lainnya. Ini adalah tugas rekursif yang menarik.
Ada 4 mata uang:
Bagi mereka, pasangan mata uang dipanggil:
- Eurusd
- gbpusd
- Eurchf
- Eurgbp
- gbpchf
- usdchf
Harap dicatat bahwa jika jumlah mata uang adalah n = 4, maka jumlah pasangan adalah k = (n ^ 2 - n) / 2 = 6. Tidak masuk akal untuk mencari pengguna jika eurusd dikutip ...
Pada waktu t, nilai tukar salah satu penyedia diukur:

Perhitungan akan dilakukan untuk nilai-nilai ini.
Matematika
Saya memecahkan masalah dengan secara analitik mengambil gradien dari fungsi kerugian, yang pada dasarnya adalah sistem persamaan.
Kode percobaan akan berada di R:
R memungkinkan menggunakan stats :: D untuk mengambil turunan dari suatu fungsi. Misalnya, jika kita ingin membedakan dengan mata uang USD, kita mendapatkan ungkapan:
2 * (eur / usd ^ 2 * (eurusd - eur / usd)) + 2 * (gbp / usd ^ 2 * (gbpusd -
gbp / usd)) - 2 * (1 / chf * (usdchf - usd / chf))
Untuk mengurangi nilai fungsi express, kita akan melakukan gradient descent dan segera jelas (kita melihat perbedaan kuadrat) bahwa nilai minimum akan menjadi nol, yang merupakan apa yang kita butuhkan.
-deriv_vals * lr
Langkah gradient descent akan dikontrol oleh parameter lr dan semua ini diambil dengan tanda negatif.
Artinya, dalam kata-kata manusia, kami memilih nilai mata uang 4 sehingga semua pasangan mata uang dalam percobaan menerima nilai yang sama dengan nilai awal dari pasangan ini. Mmm, mari kita pecahkan puzzle - di dahi!
Hasil
Agar tidak meregang, saya akan segera memberi tahu Anda hal berikut: percobaan secara keseluruhan berhasil, kode berfungsi, kesalahannya mendekati, mendekati nol. Tetapi kemudian saya perhatikan bahwa hasilnya selalu berbeda.
Sebuah pertanyaan untuk para pecinta: tampaknya tugas ini memiliki sejumlah solusi yang tidak terbatas, tetapi dalam hal ini saya benar-benar nol, saya pikir mereka akan memberi tahu saya di komentar.
Untuk memverifikasi stabilitas (tidak) solusi, saya mensimulasikan 1000 kali tanpa memperbaiki seed PRNG untuk nilai awal dari nilai mata uang.
Dan inilah gambar dari kata: error mencapai 0,00001 dan kurang (optimasi diatur seperti ini) selalu, sementara nilai mata uang melayang iblis, tahu di mana. Ternyata selalu ada keputusan yang berbeda, tuan-tuan!
Sekali lagi, gambar ini, sumbu-y dalam unit asli (bukan log.):

Agar Anda dapat mengulanginya, di bawah ini saya lampirkan kode lengkap.
Kode untuk 1000 simulasi bekerja sekitar satu menit.Kesimpulan
Inilah yang masih belum jelas bagi saya:
- Apakah mungkin untuk menstabilkan solusi dengan cara matematika yang rumit;
- apakah akan ada konvergensi dengan lebih banyak mata uang dan pasangan mata uang;
- jika tidak ada stabilitas, maka untuk setiap snapshot data baru, mata uang kami akan berjalan sesuka mereka, jika Anda tidak memperbaiki seed PRNG, dan ini adalah kegagalan.
Seluruh gagasan itu tampak sangat kabur dengan tidak adanya prasyarat dan batasan yang dapat dipahami. Tapi itu menarik!
Yah, saya juga ingin mengatakan bahwa Anda dapat melakukannya tanpa OLS ketika datanya rumit, matriksnya tunggal, baik, atau ketika teorinya kurang dikenal (ehh ...).
Terima kasih
eavprog untuk pesan awal.
Sampai jumpa!