Zaman Serilerinde Dinamik Zaman Bükmesi (dynamic time warping) ve Önemli Noktaların Tespiti

Bu yazımızda R-Shiny platformunda geliştirdiğim iki farklı uygulamayı sizlerle paylaşmak istedim. Uygulamada her iki konu da ilgi çeken fakat birçok araştırmacının üzerinde vakit ayıramadığı konulardır. Dinamik zaman bükmesi aslında verilen bir aralıktaki zaman serisi davranışına tüm seride başka nerelerde benzer bir davranış olup olmadığının bulunmasıdır. Aslında bir türlü arama motoru. Yani zaman serisinde seçilen bir motif geçmişte başka nerelerde görüldü sorusunun cevabı.

İkinci nokta ise önemli noktaların belirlenmesi. Aslında bu biraz istatistiksel süreç kontrolü ile alakalı. Fakat biraz farklı. Şöyleki ISK uygulandığında alt ve üst limitlerin dışında kalan her nokta bizim için önem arz ediyor. İncelenmesi ve özellikle neden-kök analizi yapılması gereken gözlemler olabilir. Sürecin durdurulması ve önlemler alınması gereken durumlar olabilir. Ya limit içinde kalan noktalar? Bunların hangileri bizim için önemli olabilir? Hepsi aynı mı? Elbette limit dışında kalanlar anomali. Ya limit içindeki gözlemlerden bir anomali alt kümesi çıkarmamız gerekirse ne yapmalıyız?

Bu iki konu biraz farklı olsa da aynı uygulamada geliştirmeyi istedim. Öncelikle zaman serilerinde önemli noktaların belirlenmesi konusuna değinmek istiyorum. Doğal olarak uç (extreme) noktalar bizim için ilginç ve önemli olacak. Konuyla ilgili makale araştırması yaptığımda Eugene Fink’in “Important Extrema of Time Series” adlı makalesi ile karşılaştım. Bu makalede geliştirilen algoritmayı R’da uygulamaya çalıştım. Makalede bahsedilen “R” (sadece bir tesadüf 🙂 ) parametresinin kolayca değiştirilmesine imkan sağlamanın Shiny’de kolay olacağı açıktır.

Zaman serisi kavramları anlatılırken en yaygın veri kaynağı hisse senedi fiyatları oluyor. Kavramların kolay anlaşılabilmesi için 4 hisse senedi seçeneği (Apple, Google, THY ve Meta) 48 ay geriye gidecek şekilde örnek veri erişimi sağlanmıştır. Farklı hisse senetlerine daha uzun dönem ilginiz varsa paylaşacağım kodu kolaylıkla değiştirebilirsiniz. Çok fazla sözü uzatmadan ilgili koda Github sayfamdan kolayca ulaşabilirsiniz.

Kodu çalıştırmadan önce derleme dışı bırakılan ilk 8 satırdaki kod parçasını terminal ekranında çalıştırmanızı öneriririm. Dinamik Zaman Bükmesi için gereken STI kütüphanesinin doğru bir şekilde kurulduğundan emin olmalıyız. Diğer ilgili kütüphanelerin daha önce yüklendiğini var sayıyorum. Her Shiny uygulamasında olduğu gibi tüm kodu RStudio’da seçip çalıştırdığımızda Şekil 1’deki arayüz karşınıza çıkacaktır.

Şekil 1

Default olarak THY hisse senedi fiyatları geçmiş 12 ay için gelmiştir. İsteğe göre 48 aya kadar etkileşimli olarak geri götürülebilir. Veri tablosu ekranı bilgi ve debugging amaçlı kullanılmıştır. THY yerine Apple, Google veya Meta hisseleri kullanılabilir. Farzedelim ki 24 ay veri kullanmak istedik ve İmportant Point sekmesine bastık. Bu durumda Şekil 2’deki ekranı elde edeceğiz.

Şekil 2.

Bu ekranda hisse senedi OHLC verileri aynı plotta kolaylıkla incelenebilir. Aşağıda zaman ekseninde filtreleme dinamik olarak yapılabilir. Bu ekranda uygun bir zaman serisilerinden (Açılış, En Yüksek, En Düşük ve Kapanış fiyatları) biri seçilerek etkileşimli analizimize başlayabiliriz. Farzedelim “close” serisi seçilmiş olsun. “Update Data” butonuna tıklayarak analize başlayabiliriz. Zaman ekseninde de filtreleme yaptığımızı düşünelim. Şekil 3’teki ekran elde edilir. Başlangıç ve son tarihler sol panelde gösterilmiştir.

Şekil 3

Bu ekranda tek bir seri seçilip “Update Data” butonuna basıldığında şartlı olarak gözüken “R Parametresi” belirlenmektedir. Birden fazla seri seçilmesi durumunda sadece o seriler plot edilecektir. R parametresi tek seri durumunda aktif olacak ve analizimizi yapabileceğiz. R değeri istenen şekilde değiştirilebilir. Küçültüldüğünde daha fazla, büyütüldüğünde daha az “önemli nokta” keşfedilecektir. Parametre değeri 1.15 alınıp “ImportantPoints” butonu tıklandığında Şekil 4’teki sonuç ekrana gelecektir.

Şekil 4

Hem R değeri hem de zaman ekseninde yapılan filtreleme sonucunda analizimize devam edip önemli noktaları Şekill 5’teki gibi bulabiliriz.

Şekil 5.

Aslında önemli uç noktalar kullanılarak anomali tespiti kolayca yapılabilir. Çünki bulunan uç noktalar bu tür noktaların dağılımı için ipuçu verebilir. Diğer bir değişle basit bir tespit uç noktaların dağılımına bakılarak yapılabilir.

Şekil 6 ise dinamik zaman bükme ile bir nevi örüntü arama işlemi gerçekleştirilmiştir. Default en son 20 günün (noktanın) davranışı bir zaman serisi seçilerek yapılabilir. Bu amaçla “Select Series” butonuna basılır. Gün sayısı bu ekranda 5 ila 45 arasında değiştirilebilir.

Şekil 6.

Şekil 7’de mavi renkte görünen en son 20 gözlemde karşılaşılan örüntüye geçmişte farklı zaman aralıklarında rastlanmıştır. Benzer yerler kırmızı ile işaretlenmiştir.

Şekil 7.

Bu yazımızda Shiny ile zaman serisi araştırmalarında karşımıza çıkan iki konuya cevap bulmuş olduk. Kodun geliştirilmesi için isterlerin belirlenmesi aşamasında gösterdiği destekten ötürü Burak Polat’a teşekkür ederim.