Celup dalam siklus | julibloggers.com

 – Beragampengetahuan
9 mins read

Celup dalam siklus | julibloggers.com – Beragampengetahuan

Oleh: Blog oleh Dean Markwick – Julia

Re -Post dari:

Ditelam dalam siklus (atau enkripsi) adalah konversi mendasar untuk variabel nunmeric siklik. Temukan cara kerjanya.

Saat ini saya menghadiri serangkaian kuliah keuangan yang mendalam (diajarkan oleh Stefan Zohan untuk mempersiapkan buku baru saya). Latihan tanah air mengambil rangkaian waktu dasar dan menerapkan berbagai teknik pembelajaran yang mendalam. Dalam proses melakukan pekerjaan rumah ini, saya menemukan siklus yang dicelupkan dan cara mereka digunakan untuk mengubah transformasi menjadi siklus menjadi sesuatu yang dapat dipahami oleh model.

Pertimbangkan artikel blog ini saya membaca buku catatan kaggle ini: Enkripsi fitur siklus untuk belajar dalam, mengubahnya menjadi Julia dan menggunakan beberapa contoh untuk meyakinkan pekerjaan untuk mencelupkan dalam siklus dan sangat berguna.


Nikmati jenis artikel ini? Setelah itu, Anda harus mendaftar untuk menerima buletin saya.


Variabel siklus sangat cocok di bidang keuangan. Misalnya, minggu dalam seminggu Anda dapat menggunakan koefisien (label langsung) atau angka (MON = 1, TUE = 2, dll.) Dalam model. Menggunakan satu elemen, model Anda saat ini terdiri dari 5 parameter tambahan. Jika Anda menggunakan nomor tersebut, Anda harus menentukan bentuk hubungan (linier atau menggunakan gram). Setiap orang mengalami pasang surut, tetapi ada juga bagian dari kurangnya informasi: Hari -hari minggu ini membentuk siklus di mana 1 berikut dari 5. Bagaimana kita dapat mengubah ini menjadi sesuatu yang akan dipahami oleh model?

Seperti namanya, mencelupkan dalam siklus mengarah ke siklus dan fungsi alami adalah dosa dan cos trigonometri. Kami mengambil satu variabel jalan dan mengubahnya menjadi dua arah

\[\beginalign*
x & = \sin \left( \frac2 \pi t\textmax

Jika kami menerapkan konversi ini ke hari minggu kami, kami akan pergi dari \ (t \ in [0, 4]\) Pergi ke lingkaran di \ (x \) dan \ (y \).

Konspirasi dua arah menunjukkan siklus hari -hari minggu ini, yang ditampilkan setiap hari sebagai titik dalam lingkaran menggunakan perubahan sinus dan cosin. Poin membentuk cincin tertutup, secara visual memvisualisasikan sifat siklus hari.

Saya teringat akan koordinat ekstrem dan sekarang kita dapat melihat bahwa yang kedua adalah jarak yang sama dari Jumat ketiga.
Yang penting, variabel baru ini unik untuk -1 dan 1 selalu berguna saat membangun model.
Semua masuk, ini terlihat seperti transformasi yang masuk akal, sekarang untuk melihat apakah ia memiliki perbedaan luar biasa dalam kinerja pemodelan.

Contents

Celup dalam siklus aktual – volume harian

Silakan memodelkan volume perdagangan harian saham. Perasaan itu masuk akal bahwa hari dalam seminggu (Senin-enam), bulan bulan itu (1-31) dan bulan (1-12) akan mempengaruhi uang yang diperdagangkan. Bulan -bulan musim panas mungkin lebih tenang, pada akhir bulan mungkin lebih sibuk (kembali ke akhir bulan) dan keenam bisa lebih tenang. Ketiga variabel waktu ini adalah siklus sehingga mencelupkan siklus akan membantu.

Kami memiliki 3 opsi terpisah:

  1. Semuanya seperti angka (3 parameter gratis)
  2. Hari minggu dan bulan sebagai faktor (5 + 12 + 1 parameter gratis)
  3. Celup dalam tiga variabel (3 × 2 = 6 parameter)

Oleh karena itu, keseimbangan antara jumlah parameter dan fleksibilitas model.

Kami akan menggunakan model linier sederhana, bukan aneh.

Karena kita akan selalu berada di Julia.

using Dates, AlpacaMarkets, Plots, StatsBase, GLM
using DataFramesMeta, CategoricalArrays, ShiftedArrays

Untuk mengunduh data, kami akan menggunakan API Alpacamarkets saya dan mendapatkan lebih banyak data.

aaplRaw, npt = AlpacaMarkets.stock_bars("AAPL", "1Day"; startTime=Date("2000-01-01"), endTime = today() - Day(2), adjustment = "all", limit = 10000)

Beberapa pembersihan dan format dasar.

aapl = aaplRaw[:, [:t, :v]]
aapl[!, "t"] = DateTime.(chop.(aapl[!, "t"]))

Julia memudahkan untuk menambahkan variabel faktor dan versi digital. Ketika nilai -nilai numerik dimulai pada level 1, kami mengurangi satu sehingga mereka mulai dari 0.

aapl[:, :DayName] = CategoricalArray(dayname.(aapl.t))
aapl[:, :MonthName] = CategoricalArray(monthname.(aapl.t))

aapl[:, :DayOfMonth] = dayofmonth.(aapl.t) .- 1
aapl[:, :DayOfWeek] = dayofweek.(aapl.t) .- 1
aapl[:, :MonthOfYear] = month.(aapl.t) .- 1;

Kami menormalkan massa menjadi jutaan saham dan membuat perbedaan.

aapl = aaplRaw[:, [:t, :v]]
aapl[:, :vNorm] = aapl[:, :v] .* 1e-6;
aapl[:, :delta_vNorm] = aapl[:, :vNorm] .- ShiftedArrays.lag(aapl[:, :vNorm]);

Adalah massa yang biasa (vNorm) Jangan diam, kita bisa melihat tren yang jelas bahwa perubahan, lebih baik daripada pemodelan perbedaan berat per hari.

plot(plot(aapl.t, aapl.vNorm, title = "Volume", label = :none), 
     plot(aapl.t, aapl.delta_vNorm, title = "Volume Difference", label = :none), layout=(2,1))

Dua pengiriman menampilkan volume perdagangan harian untuk AAPL dari waktu ke waktu. Bagan pertama menampilkan fluktuasi dan tren yang signifikan, dengan tahap operasi perdagangan yang lebih tinggi dan lebih rendah. Plot kedua adalah perbedaan dalam volume perdagangan antara hari dan tidak ada kecenderungan.

Untuk menerapkan pengkodean dalam siklus, kita perlu mengambil kolom dan mengubahnya menjadi dua.

function cyclical_encode(df, col, max)
    df[:, Symbol("$(col)_sin")] = sin.(2 .* pi .* df[:, Symbol(col)]/max)
    df[:, Symbol("$(col)_cos")] = cos.(2 .* pi .* df[:, Symbol(col)]/max)
    df
end

for col in ["DayOfWeek", "DayOfMonth", "MonthOfYear"]
    aapl = cyclical_encode(aapl, col, maximum(aapl[:, col]))
end

Jika Anda belum melihatnya dulu $ Seperti python f-string dan memungkinkan Anda menggunakan variabel rantai.

Kami melakukan tes kereta/kereta yang normal.

aaplTrain = aapl[1:2000,:]
aaplTest = aapl[2001:end,:];

Sekarang untuk membangun tiga model.

Model angka langsung dalam angka.

numModel = lm(@formula(delta_vNorm ~ DayOfWeek + MonthOfYear + DayOfMonth), aaplTrain)

Model faktor mewakili hari dalam seminggu dan hari dalam sebulan sebagai kategori sehingga masing -masing jenis memiliki parameter terpisah.

factorModel = lm(@formula(delta_vNorm ~ DayName + MonthName + DayOfMonth + 0), aaplTrain)

Model tertanam membuat konversi sinusue/cos dari masing -masing variabel.

embeddingModel = lm(@formula(delta_vNorm ~ DayOfWeek_sin + DayOfWeek_cos + DayOfMonth_sin + DayOfMonth_cos + MonthOfYear_sin + MonthOfYear_cos), aaplTrain);

Untuk mengevaluasi seberapa baik model melakukannya, kami melihat RMSE (dalam sampel dan keluar dari sampel), AIC (dalam sampel) dan \ (r^2 \) (dalam sampel dan di luar sampel).

Model Numcoefs Rmse Rmseos AIC R2 R2OOS
Nomor 4 31.1041 50.2975 21346.9 0.0336539 0.0396665
Faktor 17 31.2978 50.0453 21352.8 0,0433269 0.0276647
Mencelupkan 7 31.7484 51.1591 21420.8 0,0002655 -0.000531

Menariknya, model tertanam melakukan yang terburuk dalam model dan keluar dari model.

Ketika kita menarik efek hari ini, mudah untuk melihat apa yang telah kita pelajari.

params = Dict(zip(coefnames(embedingExample), coef(embedingExample)))

x = 0:0.1:4
ySin = params["DayOfWeek_sin"] * sin.(2 .* pi .* x ./ maximum(x))
yCos = params["DayOfWeek_cos"] * cos.(2 .* pi .* x ./ maximum(x))


p = plot(x, ySin, label = "Sin")
plot!(p, x, yCos, label = "Cos")
plot!(p, x, yCos .+ ySin, label = "Combined")

Bagan melingkar menggambarkan siklus efek hari minggu ini dari model.

Ini menunjukkan bahwa perubahan volume yang lebih rendah adalah pada hari Selasa dan mengubah volume lebih tinggi pada hari Kamis.

Berdasarkan kinerja model, ini bukan program yang bagus untuk konversi tertanam. Mari kita beralih ke contoh lain di mana sifat siklus bisa lebih jelas.

Celup dalam siklus yang sebenarnya – volume hari ini

Contoh lain adalah aliran transaksi hari itu. Dalam hal ini, sekarang variabel yang akan kita selip dalam siklus. Untuk ini, kami menggunakan transaksi BTCUSD dari alpacamarkets.jl dan mensintesisnya di siang hari.

btcRaw, token = AlpacaMarkets.crypto_bars("BTC/USD", "1H"; startTime=Date("2025-01-01"), limit = 10000)

res = [btcRaw]
while !(isnothing(token) || isempty(token))
    println(token)
    newtrades, token = AlpacaMarkets.crypto_bars("BTC/USD", "1H"; startTime=Date("2025-01-01"), limit = 10000, page_token = token)
    println((minimum(newtrades.t), maximum(newtrades.t)))
    append!(res, [newtrades])
    sleep(AlpacaMarkets.SLEEP_TIME[])
end
res = vcat(res...);

Sidenote, saya perlu menutupi fungsi ini dalam paket.

Kami mendapatkan data mentah ke keadaan yang sesuai.

btc = res[:, [:t, :v]]
btc[!, "t"] = DateTime.(chop.(btc[!, "t"]));

btc = @transform(btc, :Date = Date.(:t), :Time = Time.(:t), :DayOfWeek = dayofweek.(:t), :Hour = hour.(:t))
trainDates = unique(btc.Date)[1:140]
testDates = setdiff(unique(btc.Date), trainDates)

trainDataRaw = btc[findall(in(trainDates), btc.Date), :];
testDataRaw = btc[findall(in(testDates), btc.Date), :];

trainData = @combine(groupby(trainDataRaw, [:Hour]), :v = sum(:v))
trainData = @transform(trainData, :total_v = sum(:v), :frac = :v./sum(:v))

testData = @combine(groupby(testDataRaw, [:Hour]), :v = sum(:v))
testData = @transform(testData, :total_v = sum(:v), :frac = :v./sum(:v))

sort!(trainData, :Hour);
sort!(testData, :Hour);

Sekali lagi, dengan menggunakan model linier, kami cocok untuk variabel yang dicelupkan ke dalam rasio volume yang diperdagangkan setiap jam.

embedModelIntra = lm(@formula(frac ~ Hour_sin + Hour_cos), trainData)

Saat membandingkan hasilnya, kami saat ini hanya meninjau catatan harian transaksi untuk kapal dan kit uji ditutupi dengan model.

Bagan membandingkan fraksi volume transaksi harian dan prediksi per jam. Plot menunjukkan tiga baris: garis yang mewakili volume pengamatan yang diamati untuk setiap jam dari hari dari pelatihan, garis lain dari set uji dan bagian lain yang mewakili nilai -nilai yang dapat diprediksi dari model menggunakan siklik tertanam.

Model itu sangat baik untuk memilih puncak di sore hari tetapi melewatkan puncaknya pagi -pagi sekali. RMSE dari model ini adalah 0,029 dibandingkan dengan 0,026 dari penggunaan langsung fraksi pelatihan, jadi sekali lagi, model terenkripsi lebih buruk.
Ini adalah faktor terbatas untuk tertanam ini, kami memiliki frekuensi sinus/cos padahal sebenarnya masalah ini membutuhkan lebih banyak kebebasan, yaitu, banyak komponen

\[\sum _i c^1_i \sin \left(\frac2 \pi \omega _i x\max (x)\right) + c^2_i \cos \left(\frac2 \pi \omega _i x\max (x)\right).\]

Ini sekarang gram dengan trigomonik spline sehingga kita dapat melihat enkripsi dalam siklus sebagai 1-pspline.

Kesimpulan

Ini adalah transisi variabel yang menarik seperti waktu dan memberi Anda rute untuk menghaluskan kepala dan akhir siklus.

Dalam model mainan ini, tertanam tidak meningkatkan kinerja tetapi mungkin lebih cocok dalam arsitektur pembelajaran yang mendalam, di mana ada lebih banyak parameter dan lebih banyak interaksi. Dalam semua model di atas, ada lebih banyak platform yang harus dilakukan sebelum kita mulai meningkatkan kinerja dari variabel waktu.

Software Terbaru Saat Ini



Aplikasi yang sedang trend saat ini

object oriented programming, programming language, programming adalah, web programming, belajar programming, tournament software, software, software adalah, contoh software, apa itu software, pengertian software, aplikasi, aplikasi penghasil uang, aplikasi bokep, aplikasi video, programming

#Celup #dalam #siklus #julibloggers.com

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *