Ticarette makine öğrenimi: teori, pratik, ticaret ve daha fazlası - sayfa 20

 
ilginç makale https://geektimes.ru/post/144405/ , belki biri simülasyonla R'de nasıl olduğunu anlayacaktır
Прогнозирование финансовых временных рядов
Прогнозирование финансовых временных рядов
  • geektimes.ru
Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста. Пометьте топик понятными вам метками, если хотите или закрыть
 

Daha önce dile getirdiği güdülere dayalı olarak kümelerle deneyler yapmaya başladı. Bir sorunla karşılaştım - bir kümeye karşılık gelen parçalardan fiyatı yapıştırmaya çalıştığımda, yapıştırma yerlerinde fiyatlarda boşluklar vardı (ve bu mantıklı, ama bana gelmedi))) soru, bu boşlukların nasıl ortadan kaldırılacağıdır.

 # типа какая то цена
dat <- cumsum(rnorm( 1000 ))+ 1000
plot(dat,t= "l" )


# фун. матрицы хенкеля для имитации скользящего окна
hankel<- function(data, r= 10 ) {
   do .call(cbind,
          lapply( 0 :(r- 1 ),function(i) { data[(i+ 1 ):(length(data)-(r- 1 -i))]}))}
# делаем аналог скользящего окна глубиной в 50
glubina <- 50
D <- hankel(dat,r = glubina)


# скалирую и центрирую дату, проще сказать нормализирую
DC <- t(  apply(D, 1 ,    function(x) {  scale(x,T,T)  }    ))


library (SOMbrero)
# тренирую сеть кохонена на данных чтоб получить кластера
TS <- trainSOM(DC,  dimension=c( 3 , 3 ))

# край матрицы будет вектор нашей цены без первых значений
dt <- D[,glubina] 
# полученые кластера
cl <- TS$clustering

# график цены , график кластеров этой цены
par(mfrow=c( 2 , 1 ))
plot(dt,t= "l" )
plot(cl,t= "l" )
par(mfrow=c( 1 , 1 ))


# пробую посмотреть склееный график только одного кластера 
one_clust <- dt[cl== 3 ]
# график с разрывами в местах склейки
plot(one_clust,t= "l" )
 
Dr.Tüccar :

Bende de bu tür sorunlar var. Genellikle, kullanılabilir değişkenlerin listesini bulmak için öznitelikleri (KZP) yürütmek ve sonra bunlar arasında gezinmek, örneğin KZP$pencere, vb. ve ihtiyacınız olan sayıları bulmak yeterlidir. Ancak burada bu sayılar Özet işlevinin kendisinde oluşturulur ve hiçbir yerde saklanmaz.

İşte kaynak: https://cran.r-project.org/web/packages/kza/index.html, şöyle bir şey yapmanız gerekiyor:

Bu arada bu sizin için de faydalı olabilir, göstergeleri kullanırsınız, bu fonksiyon çok gürültülü verilerde dönemsel bileşenleri ortaya çıkarır, dönem kısacası bu dönem piyasada sürekli değişmektedir.

Sonuç olarak, bu baskın dönemi sürekli olarak belirlemek ve herkesin yaptığı gibi sadece sabit parametrelerle değil, göstergeleri buna göre ayarlamaktır. Bu yaklaşımı çok yüzeysel ve rastgele bir tarihte test ettim, sonuç normal yaklaşıma kıyasla olumluydu. RSI göstergesini aldım, sabit parametrelerle birleştirildi ve uyarlanabilir olanlarla kazanıldı... Yani bununla ilgileniyorsanız, uygulayabilirsiniz ve araştırmanızın sonucunu okumak benim için çok ilginç olacak.

 
mytarmailS :

Daha önce dile getirdiği güdülere dayalı olarak kümelerle deneyler yapmaya başladı. Bir sorunla karşılaştım - bir kümeye karşılık gelen parçalardan fiyatı yapıştırmaya çalıştığımda, yapıştırma yerlerinde fiyatlarda boşluklar vardı (ve bu mantıklı, ama bana gelmedi))) soru, bu boşlukların nasıl ortadan kaldırılacağıdır.

Fiyat serisinin logaritmasını alın, ardından bir dizi farka dönüştürün. Ortaya çıkan seriyi yapıştırmak için, yalnızca bulunan duruma karşılık gelen aralıkları bırakın. Ardından, bu diziden toplama yoluyla yeni bir dizi yapın. Ve dilerseniz daha sonra ifşa edin.
 
Anton Zverev'in fotoğrafı.
Fiyat serisinin logaritmasını alın, ardından bir dizi farka dönüştürün. Ortaya çıkan seriyi yapıştırmak için, yalnızca bulunan duruma karşılık gelen aralıkları bırakın. Ardından, bu diziden toplama yoluyla yeni bir dizi yapın. Ve dilerseniz daha sonra ifşa edin.
Teşekkürler bende öyle hayal etmiştim deneyelim
 

Birkaç ilginç şey daha öğrendim:

Önceden yayınlanan tahmin edici eleme işlevi (designTreatmentsN$scoreFrame), son tahmin edici kümesini açıkça sağlamaz. %100 ilişkili tahmin edicileri bile kaldırmaz, ayrıca ihtiyacınız olan bir şeyi kaldırabilir ve çöp bırakabilir. Onları bırakma yöntemini biraz karmaşıklaştırdım - önce tahmin edicileri designTreatmentsN$scoreFrame aracılığıyla eski şekilde seçiyorum (eşik iki katına çıkar - 2/N, böylece daha az potansiyel olarak iyi tahmin ediciler elimine edilir). Sonra > 0.99'dan daha büyük korelasyona sahip tüm tahmin edicileri kaldırırım (rastgele deltalar ve toplamlar ürettikten sonra birçoğuna sahibim. Ve tahmin edicilerin hedef değişkenle değil, birbirleriyle korelasyonuna bakarım). Ardından , bir genetik algoritma kullanarak , kalan tahmin edicilerin en iyi kümesini ararım.

Ana bileşenlerle ilgili makaleden başka bir şey kullanmaya çalışıyorum. Aşağıdaki işlev bir temel bileşen modeli oluşturur ve bulunan tüm temel bileşenlerin kullanıldığı durumda R^2 değerini döndürür. Makaleden başka bir örnekte olduğu gibi "Y ölçeği" yoktur, ancak bu yöntem daha hızlıdır. Şimdi bir dizi tahmin ediciyi değerlendirmek için kullanıyorum (belki boşuna, henüz bilmiyorum :)). srcTable parametresinin son sütunu hedef değişkendir. Tahmin edicinin çok az değeri varsa hatalar olabilir, fonksiyon bazı verilere uymayabilir.

library( 'caret' )
GetPCrsquared <- function(srcTable){
        targetName <- tail(colnames(srcTable), 1 )
        origVars <- setdiff(colnames(srcTable), targetName)
        # can try variations such adding/removing non-linear steps such as "YeoJohnson"
        prep <- preProcess(srcTable[,origVars], method = c( "zv" , "nzv" , "center" , "scale" , "pca" ))
        prepared <- predict(prep,newdata=srcTable[,origVars])
        newVars <- colnames(prepared)
        prepared$target <- srcTable$target
        modelB <- lm(paste(targetName, paste(newVars,collapse= ' + ' ),sep= ' ~ ' ),data=prepared)
         return (summary(modelB)$r.squared)
}

Daha önce R^2'm yaklaşık 0.1 olsaydı, şimdi 0.3'e ulaştım. Bu hala yeterli değil, en az 0,95 önerilir. Ayrıca R^2=0.1 ile ön testte %37'lik bir hata yaptığım ve R^2=0.3 ile bu hatanın %45'e yükseldiği garip bir an var. Belki de sorun, tahmin ediciler grubuna daha fazla çubuk ve daha fazla gösterge eklemiş olmamdır. Bir adım ileri ve iki adım geri, şimdi tüm gösterge setini bir şekilde analiz etmeniz ve gereksiz olanları atmanız gerekiyor. Veya temel bileşen modeli Forex için geçerli değildir (kontrol edilmesi zordur, önce R^2 > 0.95 elde etmeniz ve ön testte sonucun ne olacağını görmeniz gerekir, bir sonuç hakkında sonuç çıkarmak için henüz çok erken). eğitimsiz model).

Ayrıca GA paketini (genetik) ve GenSA'yı (Alexey örneğinden gradyan tavlama) karşılaştırdım. Her iki paket de aynı sonucu elde etti. Genetik, zamanla kazandığı için çok iş parçacıklı çalışabilir. Ancak bir akışta GenSA kazanıyor gibi görünüyor. Önbelleğe alma sonuçlarıyla ilgili böyle bir numara da var, Alexey'nin bunu takdir edeceğini düşünüyorum:

fitness_GenSA_bin <- function(selectionForInputs){
        testPredictorNames <- predictorNames[ which(selectionForInputs == TRUE ) ]
         #do the fitness calculation
}

library (memoise)
fitness_GenSA_bin_Memoise <- memoise(fitness_GenSA_bin)

fitness_GenSA <- function(selectionForInputs){
        selectionForInputs[selectionForInputs>= 0.5 ] <- TRUE
        selectionForInputs[selectionForInputs< 0.5 ] <- FALSE
         return (fitness_GenSA_bin_Memoise(selectionForInputs))
}

library (GenSA, quietly= TRUE )
GENSA <- GenSA(fn = fitness_GenSA,
                                lower = rep( 0 , length(predictorNames)),
                                upper = rep( 1 , length(predictorNames)),
                                control=list(smooth= FALSE , verbose= TRUE )
                                ) 

Sonuç olarak, fitness_GenSA_bin_Memoise ara işlevi, bu tür bir tahminci kümesiyle en az bir kez karşılaşılmışsa, önbellekten veri alır. fitness_GenSA_bin, uygunluk işlevi hesaplamalarını içermelidir ve her benzersiz küme için yalnızca bir kez çağrılması gerekir.

mytarmailS :

Bu arada bu sizin için de faydalı olabilir, göstergeleri kullanırsınız, bu fonksiyon çok gürültülü verilerde dönemsel bileşenleri ortaya çıkarır, dönem kısacası bu dönem piyasada sürekli değişmektedir.

Sonuç olarak, bu baskın dönemi sürekli olarak belirlemek ve herkesin yaptığı gibi sadece sabit parametrelerle değil, göstergeleri buna göre ayarlamaktır. Bu yaklaşımı çok yüzeysel ve rastgele bir tarihte test ettim, sonuç normal yaklaşıma kıyasla olumluydu. RSI göstergesini aldım, sabit parametrelerle birleştirildi ve uyarlanabilir olanlarla kazanıldı... Yani bununla ilgileniyorsanız, uygulayabilirsiniz ve araştırmanızın sonucunu okumak benim için çok ilginç olacak.

Şimdilik, göstergeler için sadece standart parametreleri kullanıyorum. Ancak seçilmeleri gerekiyor, katılıyorum, genel olarak bana öyle geliyor ki göstergeler esas olarak D1'de hisse ticareti için geliştirildiğinden, o zaman sadece bu zaman diliminde standart parametrelerle faydalı olacaklar. Genelde artık D1'den H1'e sonuçları aktaramıyorum. Göstergelerin parametrelerinin zaman dilimine ve zamana bağlı olarak değiştirilmesi gerektiği ortaya çıktı, evet.

 
Dr.Tüccar :

Birkaç ilginç şey daha öğrendim:

Önceden yayınlanan tahmin edici eleme işlevi (designTreatmentsN$scoreFrame), son tahmin edici kümesini açıkça sağlamaz. %100 ilişkili tahmin edicileri bile kaldırmaz, ayrıca ihtiyacınız olan bir şeyi kaldırabilir ve çöp bırakabilir. Onları bırakma yöntemini biraz karmaşıklaştırdım - önce tahmin edicileri designTreatmentsN$scoreFrame aracılığıyla eski şekilde seçiyorum (eşik iki katına çıkar - 2/N, böylece daha az potansiyel olarak iyi tahmin ediciler elimine edilir). Sonra > 0.99'dan daha büyük korelasyona sahip tüm tahmin edicileri kaldırırım (rastgele deltalar ve toplamlar ürettikten sonra birçoğuna sahibim. Ve tahmin edicilerin hedef değişkenle değil, birbirleriyle korelasyonuna bakarım). Ardından , bir genetik algoritma kullanarak , kalan tahmin edicilerin en iyi kümesini ararım.

Ana bileşenlerle ilgili makaleden başka bir şey kullanmaya çalışıyorum. Aşağıdaki işlev bir temel bileşen modeli oluşturur ve bulunan tüm temel bileşenlerin kullanıldığı durumda R^2 değerini döndürür. Makaleden başka bir örnekte olduğu gibi "Y ölçeği" yoktur, ancak bu yöntem daha hızlıdır. Şimdi bir dizi tahmin ediciyi değerlendirmek için kullanıyorum (belki boşuna, henüz bilmiyorum :)). srcTable parametresinin son sütunu hedef değişkendir. Tahmin edicinin çok az değeri varsa hatalar olabilir, fonksiyon bazı verilere uymayabilir.

Daha önce R^2'm yaklaşık 0.1 olsaydı, şimdi 0.3'e ulaştım. Bu hala yeterli değil, en az 0,95 önerilir. Ayrıca R^2=0.1 ile ön testte %37'lik bir hata yaptığım ve R^2=0.3 ile bu hatanın %45'e yükseldiği garip bir an var. Belki de sorun, tahmin ediciler grubuna daha fazla çubuk ve daha fazla gösterge eklemiş olmamdır. Bir adım ileri ve iki adım geri, şimdi tüm gösterge setini bir şekilde analiz etmeniz ve gereksiz olanları atmanız gerekiyor. Veya temel bileşen modeli Forex için geçerli değildir (kontrol edilmesi zordur, önce R^2 > 0.95 elde etmeniz ve ön testte sonucun ne olacağını görmeniz gerekir, bir sonuç hakkında sonuç çıkarmak için henüz çok erken). eğitimsiz model).

Ayrıca GA paketini (genetik) ve GenSA'yı (Alexey örneğinden gradyan tavlama) karşılaştırdım. Her iki paket de aynı sonucu elde etti. Genetik, zamanla kazandığı için çok iş parçacıklı çalışabilir. Ancak bir akışta GenSA kazanıyor gibi görünüyor. Önbelleğe alma sonuçlarıyla ilgili böyle bir numara da var, Alexey'nin bunu takdir edeceğini düşünüyorum:

Sonuç olarak, fitness_GenSA_bin_Memoise ara işlevi, bu tür bir tahminci kümesiyle en az bir kez karşılaşılmışsa, önbellekten veri alır. fitness_GenSA_bin, uygunluk işlevi hesaplamalarını içermelidir ve her benzersiz küme için yalnızca bir kez çağrılması gerekir.

Şimdilik, göstergeler için sadece standart parametreleri kullanıyorum. Ancak seçilmeleri gerekiyor, katılıyorum, genel olarak bana öyle geliyor ki göstergeler esas olarak D1'de hisse ticareti için geliştirildiğinden, o zaman sadece bu zaman diliminde standart parametrelerle faydalı olacaklar. Genelde artık D1'den H1'e sonuçları aktaramıyorum. Göstergelerin parametrelerinin zaman dilimine ve zamana bağlı olarak değiştirilmesi gerektiği ortaya çıktı, evet.

Önbelleğe alma konusunda harika. Bunu kendim yazmaya çalıştım. Ve hazır bir çözüm var. Querut. Teşekkür ederim.

Ve yinelerken hangi uygunluk işlevini kullanıyorsunuz? özledim. Doğrusal bağımlılık mı yoksa bir tür istatistik mi?
 
Dr.Tüccar :

Makaleden başka bir örnekte olduğu gibi "Y ölçeği" yoktur,

Makalenin tüm tsimus'unun tam olarak bu olduğunu düşünüyorum. Tekrar okudum, orada yazıyor.

Bir tahmin listesi hazırlamak için genel şemaya dönersek.

Gürültü filtreleme, sorunun yalnızca bir kısmıdır ve bu alandaki sorunların ve önerilerin geri kalanını çözmez.

Bütün bunlar yapılırsa, döngüdeki bir sonraki çalışma algoritması, yani.

1. Seçilen ve işlenmiş tahmin edicileri alıyoruz. Bu liste kalıcıdır.

2. Mevcut pencere için tahmin edicilerin seçimini algoritmalardan biri haline getiriyoruz. Örneğin, şapkada iki tane var.

3. Modeli özelleştirin.

4. Ticaret

5. Pencereyi hareket ettirin ve 2. adıma gidin

Elime aldığım ilk tahmin edici setlerinden, gürültü tahmincilerinin sayısı 80'in üzerindeydi!

Ayrıca, algoritmanın gürültü olarak sınıflandırmadığı kalan tahmin edicilerden standart algoritma yaklaşık yarısını seçer. Pencere hareket ettikçe, bu yarının bileşimi sürekli değişiyor. Ancak her zaman eğitim setindeki hata ile örneklemdeki hata yaklaşık olarak eşittir. Buradan, modelimin fazla takılmadığı sonucuna varıyorum ve bu, yukarıda açıklanan öngörücü seçim algoritmalarının bir sonucu.

 

Ve yinelerken hangi uygunluk işlevini kullanıyorsunuz?

Daha önce ormanı eğitti ve doğrulama kümesinde bir hata döndürdü. Prensip olarak işe yaradı - orman en azından biraz yeniden eğitilmişse, hata hemen% 50'ye düşer.

Şimdi yukarıdaki kod olan GetPCrsquared() kullanıyorum. Ayrıca feature_selector_modeller.txt adresinden bir örneğiniz var, ancak bunu çözmeniz ve doğru kod parçasını almanız gerekiyor, bu yüzden henüz verilerim üzerinde test etmedim.

 
San Sanych Fomenko :

Makalenin tüm tsimus'unun burada olduğunu düşünüyorum. Tekrar okudum, orada yazıyor.

Y ölçeğini de denedim, her iki durumda da (Y ölçeği olan ve olmayan) R^2 aynı çıktı (bu durumlarda farklı paketler kullanılmasına rağmen!).

Y ölçeğinin daha az temel bileşenle aynı iyi sonucu verebileceğini anlıyorum. Ancak, tüm bileşenleri kullansanız bile sonuç hala tatmin edici değilse (şimdiki gibi), o zaman hiçbir fark olmayacaktır. Ayrıca daha hızlı çalışıyor, bu benim için artık daha önemli. Doğru, bu yöntemin genel olarak yordayıcıları seçmek için uygun olup olmadığını teoriyle veya pratikle henüz kendime kanıtlayamadım ... İlk başta, tüm yordayıcılarda bir temel bileşen modeli yapma ve yordayıcıları katsayılara bakarak seçme fikri vardı. bileşenler. Ama sonra çöp ilavesiyle - R ^ 2 modellerinin düştüğünü fark ettim. Farklı öngörücü kümelerini denemek ve daha yüksek R^2'ye sahip olanları aramak mantıklıdır, ancak bu yine de sadece bir teoridir.