<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-11-11T14:05:45+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Backtesting ile Strateji Doğrulama: Algoritmanız Gerçekten İyi mi, Yoksa Geçmişi mi Ezberledi?</title><link href="https://program.sonsuz.us/posts/backtesting-ile-strateji-dogrulama-algoritmaniz-gercekten-iyi-mi-yoksa-gecmisi-mi-ezberledi/" rel="alternate" type="text/html" title="Backtesting ile Strateji Doğrulama: Algoritmanız Gerçekten İyi mi, Yoksa Geçmişi mi Ezberledi?" /><published>2026-11-11T00:00:00+00:00</published><updated>2026-11-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/backtesting-ile-strateji-dogrulama-algoritmaniz-gercekten-iyi-mi-yoksa-gecmisi-mi-ezberledi</id><content type="html" xml:base="https://program.sonsuz.us/posts/backtesting-ile-strateji-dogrulama-algoritmaniz-gercekten-iyi-mi-yoksa-gecmisi-mi-ezberledi/"><![CDATA[<p><img src="/img/backtesting-ile-strateji-31.svg" alt="backtesting-ile-strateji-31" /></p>

<p>Bir ticaret algoritması geçmiş grafikte kusursuz görünüyorsa hemen kutlama yapmayın: Belki de cevap anahtarını gizlice okuyordur! Backtesting, stratejinin geçmiş piyasa verilerinde nasıl davranacağını simüle eder. Ancak amaç yalnızca yüksek getiri bulmak değil; bu getirinin hangi varsayımlarla oluştuğunu ve farklı koşullarda ne kadar dayanıklı olduğunu anlamaktır.</p>

<p>``</p>

<h2 id="backtesting-aslında-neyi-ölçer">Backtesting aslında neyi ölçer?</h2>

<p>Bir strateji; sinyal üretimi, pozisyon büyüklüğü, emir gerçekleştirme ve risk kurallarından oluşur. Test motoru bunları zaman sırasıyla çalıştırır. Temel şart şudur: Her karar, yalnızca o anda bilinebilecek veriyi kullanmalıdır.</p>

<p>Örneğin, 20 günlük hareketli ortalama 60 günlük ortalamanın üzerindeyken piyasada kalan bir strateji düşünelim. Bu yaklaşım, trendlerin bir süre devam edebileceği varsayımına dayanır. Yatay piyasada ise sık işlem yaparak maliyet üretmesi beklenebilir. Dolayısıyla test, sadece sonucu değil, stratejinin ekonomik mantığını da sorgulamalıdır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güzel görünen sonuç</th>
      <th>Güvenilir değerlendirme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İşlem fiyatı</td>
      <td>Sinyalin oluştuğu kapanış</td>
      <td>Sonraki uygulanabilir fiyat</td>
    </tr>
    <tr>
      <td>Maliyet</td>
      <td>Sıfır komisyon</td>
      <td>Komisyon, spread ve kayma</td>
    </tr>
    <tr>
      <td>Veri seçimi</td>
      <td>Bugünün başarılı şirketleri</td>
      <td>Dönemin yatırım evreni</td>
    </tr>
    <tr>
      <td>Parametre</td>
      <td>En yüksek geçmiş getiri</td>
      <td>Farklı dönemlerde tutarlılık</td>
    </tr>
  </tbody>
</table>

<h2 id="verinin-küçük-hileleri-büyük-sonuçları">Verinin küçük hileleri, büyük sonuçları</h2>

<p><strong>İleriye bakma yanlılığı</strong>, henüz açıklanmamış bilginin kararlara sızmasıdır. <strong>Hayatta kalma yanlılığı</strong>, iflas eden veya borsadan çıkan şirketlerin veri setinden kaybolmasıdır. İkisi de stratejiyi olduğundan başarılı gösterebilir.</p>

<p>Zaman damgalarını, eksik kayıtları ve şirket işlemlerini kontrol edin. Açılış ve kapanış fiyatları aynı bölünme düzeltmesini kullanmalıdır. Temettüler ayrıca muhasebeleştirilmelidir. Veriyi temizlerken gelecekteki değerlerle geçmiş boşlukları doldurmak da bilgi sızıntısı yaratabilir.</p>

<p>Test başlamadan önce kuralları, maliyetleri ve başarı ölçütlerini yazın. Böylece sonuç kötü gelince kale direklerini taşıma alışkanlığından uzaklaşırsınız.</p>

<h2 id="python-ile-zamanlaması-açık-bir-simülasyon">Python ile zamanlaması açık bir simülasyon</h2>

<p>Aşağıdaki örnekte <code class="language-plaintext highlighter-rouge">df</code>, günlük <code class="language-plaintext highlighter-rouge">open</code> ve <code class="language-plaintext highlighter-rouge">close</code> sütunlarını içerir. Kapanışta hesaplanan sinyal ertesi açılışta uygulanır; pozisyonun getirisi o açılıştan sonraki açılışa kadar ölçülür. Yalnızca uzun pozisyon veya nakit kullanılır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>

<span class="n">d</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="nf">sort_index</span><span class="p">().</span><span class="nf">copy</span><span class="p">()</span>
<span class="n">d</span><span class="p">[</span><span class="sh">"</span><span class="s">fast</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="sh">"</span><span class="s">close</span><span class="sh">"</span><span class="p">].</span><span class="nf">rolling</span><span class="p">(</span><span class="mi">20</span><span class="p">).</span><span class="nf">mean</span><span class="p">()</span>
<span class="n">d</span><span class="p">[</span><span class="sh">"</span><span class="s">slow</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="sh">"</span><span class="s">close</span><span class="sh">"</span><span class="p">].</span><span class="nf">rolling</span><span class="p">(</span><span class="mi">60</span><span class="p">).</span><span class="nf">mean</span><span class="p">()</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">d</span><span class="p">.</span><span class="nf">dropna</span><span class="p">(</span><span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">fast</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">slow</span><span class="sh">"</span><span class="p">])</span>

<span class="n">signal</span> <span class="o">=</span> <span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="sh">"</span><span class="s">fast</span><span class="sh">"</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">d</span><span class="p">[</span><span class="sh">"</span><span class="s">slow</span><span class="sh">"</span><span class="p">]).</span><span class="nf">astype</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span>
<span class="n">position</span> <span class="o">=</span> <span class="n">signal</span><span class="p">.</span><span class="nf">shift</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="nf">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="n">forward_return</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="sh">"</span><span class="s">open</span><span class="sh">"</span><span class="p">].</span><span class="nf">shift</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="n">d</span><span class="p">[</span><span class="sh">"</span><span class="s">open</span><span class="sh">"</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span>
<span class="n">turnover</span> <span class="o">=</span> <span class="n">position</span><span class="p">.</span><span class="nf">diff</span><span class="p">().</span><span class="nf">abs</span><span class="p">().</span><span class="nf">fillna</span><span class="p">(</span><span class="n">position</span><span class="p">.</span><span class="nf">abs</span><span class="p">())</span>
<span class="n">r</span> <span class="o">=</span> <span class="p">(</span><span class="n">position</span> <span class="o">*</span> <span class="n">forward_return</span> <span class="o">-</span> <span class="n">turnover</span> <span class="o">*</span> <span class="mf">0.001</span><span class="p">).</span><span class="nf">dropna</span><span class="p">()</span>

<span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">r</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
    <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">Değerlendirme için yeterli veri yok.</span><span class="sh">"</span><span class="p">)</span>

<span class="n">equity</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">concat</span><span class="p">([</span>
    <span class="n">pd</span><span class="p">.</span><span class="nc">Series</span><span class="p">([</span><span class="mf">1.0</span><span class="p">]),</span>
    <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">r</span><span class="p">).</span><span class="nf">cumprod</span><span class="p">().</span><span class="nf">reset_index</span><span class="p">(</span><span class="n">drop</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="p">],</span> <span class="n">ignore_index</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">volatility</span> <span class="o">=</span> <span class="n">r</span><span class="p">.</span><span class="nf">std</span><span class="p">(</span><span class="n">ddof</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">metrics</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">cagr</span><span class="sh">"</span><span class="p">:</span> <span class="n">equity</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">**</span> <span class="p">(</span><span class="mi">252</span> <span class="o">/</span> <span class="nf">len</span><span class="p">(</span><span class="n">r</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">sharpe</span><span class="sh">"</span><span class="p">:</span> <span class="n">np</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="mi">252</span><span class="p">)</span> <span class="o">*</span> <span class="n">r</span><span class="p">.</span><span class="nf">mean</span><span class="p">()</span> <span class="o">/</span> <span class="n">volatility</span>
              <span class="k">if</span> <span class="n">volatility</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="n">np</span><span class="p">.</span><span class="n">nan</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">max_drawdown</span><span class="sh">"</span><span class="p">:</span> <span class="p">(</span><span class="n">equity</span> <span class="o">/</span> <span class="n">equity</span><span class="p">.</span><span class="nf">cummax</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span><span class="p">).</span><span class="nf">min</span><span class="p">()</span>
<span class="p">}</span>
<span class="nf">print</span><span class="p">(</span><span class="n">metrics</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">shift(1)</code> karar ile uygulamayı ayırır; <code class="language-plaintext highlighter-rouge">turnover</code> ise pozisyon değiştiğinde maliyet üretir. Burada her giriş veya çıkış için yaklaşık %0,1 maliyet varsayılmıştır. Isınma dönemi değerlendirmeden çıkarılır; başlangıç sermayesi düşüş hesabına eklenir. Örnek temettüyü, nakit faizini ve dönem sonunda zorunlu tasfiye maliyetini içermez. Gerçekçi uygulamada likidite, gerçekleşmeyen emirler ve hacme bağlı kayma da modellenmelidir.</p>

<h2 id="getiri-tek-başına-karne-değildir">Getiri tek başına karne değildir</h2>

<p>CAGR, büyümenin yıllıklaştırılmış hızını verir. Sharpe, ortalama getiriyi oynaklıkla karşılaştırır. Sıfır risksiz getiri ve yılda 252 işlem günü varsayımıyla:</p>

\[S = \frac{\mu_r}{\sigma_r}\sqrt{252}\]

<p>Bu yıllıklaştırma, güçlü seri bağımlılığı varsa yanıltıcı olabilir. Maksimum düşüş ise sermayenin önceki zirvesinden en kötü gerilemesini gösterir:</p>

\[DD_{max}=\min_t\left(\frac{E_t}{\max_{u\le t}E_u}-1\right)\]

<table>
  <thead>
    <tr>
      <th>Ölçüt</th>
      <th>Yanıtladığı soru</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>CAGR</td>
      <td>Sermaye hangi hızla büyüdü?</td>
    </tr>
    <tr>
      <td>Sharpe</td>
      <td>Getiri, oynaklığı karşılıyor mu?</td>
    </tr>
    <tr>
      <td>Maksimum düşüş</td>
      <td>En kötü gerileme ne kadardı?</td>
    </tr>
    <tr>
      <td>İşlem sayısı</td>
      <td>Sonuç birkaç şanslı işleme mi dayanıyor?</td>
    </tr>
  </tbody>
</table>

<h2 id="güvenilirlik-geçmişin-dışına-çıkmak">Güvenilirlik: Geçmişin dışına çıkmak</h2>

<p>Veriyi kronolojik olarak eğitim, doğrulama ve dokunulmamış test dönemlerine ayırın. Parametreleri eğitimde seçin, doğrulamada değerlendirin; son testi tekrar tekrar kullanmayın. Rastgele bölme, zaman serilerinde geleceğin geçmişe karışmasına yol açabilir.</p>

<p><strong>Walk-forward</strong> testte pencereyi ilerleterek yalnızca önceki verilerle yeniden seçim yaparsınız. Çok sayıda strateji denediyseniz, kazananın tesadüfen bulunabileceğini unutmayın. Maliyetleri ikiye katlayın, parametreleri biraz değiştirin, kriz ve yatay dönemleri ayrı inceleyin. Getirilerdeki bağımlılığı koruyan blok bootstrap, belirsizlik aralıklarını değerlendirmeye yardımcı olabilir.</p>

<p>Son olarak al-tut yaklaşımıyla ve benzer risk düzeyiyle karşılaştırın. Backtesting bir gelecek garantisi değil, yanlış fikirleri eleme aracıdır. Sağlam görünen stratejiyi önce sanal işlemlerde, ardından sınırlı sermaye ve açık risk sınırlarıyla izlemek daha sağlıklı bir devam adımıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="backtesting" /><category term="algoritmik ticaret" /><category term="python" /><category term="strateji doğrulama" /><category term="risk yönetimi" /><category term="pandas" /><summary type="html"><![CDATA[Bir ticaret algoritması geçmiş grafikte kusursuz görünüyorsa hemen kutlama yapmayın: Belki de cevap anahtarını gizlice okuyordur! Backtesting, stratejinin geçmiş piyasa verilerinde nasıl davranacağını simüle eder. Ancak amaç yalnızca yüksek getiri bulmak değil; bu getirinin hangi varsayımlarla oluştuğunu ve farklı koşullarda ne kadar dayanıklı olduğunu anlamaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/backtesting-ile-strateji-31.png" /><media:content medium="image" url="https://program.sonsuz.us/img/backtesting-ile-strateji-31.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Blok Zincir Adli Analizi: Kripto Paranın Dijital Ayak İzlerini Sürmek</title><link href="https://program.sonsuz.us/posts/blok-zincir-adli-analizi-kripto-paranin-dijital-ayak-izlerini-surmek/" rel="alternate" type="text/html" title="Blok Zincir Adli Analizi: Kripto Paranın Dijital Ayak İzlerini Sürmek" /><published>2026-11-11T00:00:00+00:00</published><updated>2026-11-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/blok-zincir-adli-analizi-kripto-paranin-dijital-ayak-izlerini-surmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/blok-zincir-adli-analizi-kripto-paranin-dijital-ayak-izlerini-surmek/"><![CDATA[<p><img src="/img/blok-zincir-adli-80.svg" alt="blok-zincir-adli-80" /></p>

<p>Bir kripto para işlemi kaybolmuş gibi görünebilir; ancak açık blok zincirlerde genellikle arkasında kalıcı bir iz bırakır. Blok zincir adli analizi, bu izleri anlamlandırarak şüpheli hareketleri inceleme işidir. Dedektifin büyüteci burada işlem kimliği, adres grafiği ve zaman çizelgesidir. Yalnız önemli bir fark var: Bir adresi bulmak, sahibini teşhis etmek değildir.</p>

<p>``</p>

<h2 id="teorik-temel-şeffaf-kayıt-takma-adlı-kullanıcı">Teorik temel: Şeffaf kayıt, takma adlı kullanıcı</h2>

<p>Bitcoin ve Ethereum gibi açık ağlarda işlemler herkes tarafından incelenebilir. Kriptografik bağlantılar ve ağın uzlaşma mekanizması, geçmiş kayıtların değiştirilmesini zorlaştırır. Bununla birlikte zincir, çoğunlukla kişinin adını değil adresini gösterir. Bu nedenle sistem anonim olmaktan çok <strong>takma adlıdır</strong>.</p>

<p>Bitcoin’de UTXO modeli kullanılır: İşlemler önceki harcanmamış çıktıları tüketir ve yeni çıktılar oluşturur. Normal bir işlemde değer dengesi şöyledir:</p>

\[\sum V_{girdi}=\sum V_{çıktı}+F_{işlem}\]

<p>Ethereum’da ise hesap bakiyeleri ve akıllı sözleşme etkileşimleri öne çıkar. Token hareketleri için yalnızca işlemin ana değer alanına bakmak yetmez; olay günlükleri de incelenmelidir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Bitcoin</th>
      <th>Ethereum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel model</td>
      <td>UTXO</td>
      <td>Hesap tabanlı</td>
    </tr>
    <tr>
      <td>İncelenen kayıt</td>
      <td>Girdiler ve çıktılar</td>
      <td>İşlemler, günlükler, yürütme izleri</td>
    </tr>
    <tr>
      <td>Yaygın belirsizlik</td>
      <td>Para üstü çıktısı</td>
      <td>Sözleşme üzerinden dolaylı hareket</td>
    </tr>
  </tbody>
</table>

<h2 id="şüpheli-işlem-nasıl-takip-edilir">Şüpheli işlem nasıl takip edilir?</h2>

<p>İyi bir inceleme, rastgele adres aratmakla değil, kapsamı belirlemekle başlar:</p>

<ol>
  <li><strong>Başlangıcı doğrula:</strong> İşlem kimliğini, ağı, blok yüksekliğini ve varlığı kaydet. Aynı adres biçimi farklı ağlarda görülebilir.</li>
  <li><strong>Veriyi topla:</strong> Blok gezgini, düğüm veya indeksleyici kullan. Kaynağı ve erişim zamanını belgeleyerek veriyi sakla.</li>
  <li><strong>Grafik oluştur:</strong> Adresleri düğüm, değer hareketlerini yönlü kenar olarak temsil et. Tutar, varlık ve işlem sırasını koru.</li>
  <li><strong>Örüntüleri araştır:</strong> Hızlı bölünme, tekrar birleşme ve aracı hizmetlere aktarım gibi hareketleri incele. Bunlar tek başına suç göstergesi değildir.</li>
  <li><strong>Bağlamla karşılaştır:</strong> Etiketleri bağımsız kaynaklarla doğrula. Bir borsa adresine ulaşılması, müşteri kimliğinin zincirde bulunduğu anlamına gelmez.</li>
</ol>

<h2 id="python-ile-küçük-bir-izleme-motoru">Python ile küçük bir izleme motoru</h2>

<p>Aşağıdaki örnek, normalize edilmiş transfer kayıtlarında aynı varlığın zaman sırasına uygun yollarını arar. <code class="language-plaintext highlighter-rouge">order</code>, blok, işlem ve olay sırasından türetilmiş artan bir sayı; <code class="language-plaintext highlighter-rouge">amount</code> ise temel birimden dönüştürülmüş ondalık metindir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">collections</span> <span class="kn">import</span> <span class="n">defaultdict</span><span class="p">,</span> <span class="n">deque</span>
<span class="kn">from</span> <span class="n">decimal</span> <span class="kn">import</span> <span class="n">Decimal</span>


<span class="k">def</span> <span class="nf">izle</span><span class="p">(</span><span class="n">kayitlar</span><span class="p">,</span> <span class="n">baslangic</span><span class="p">,</span> <span class="n">varlik</span><span class="p">,</span> <span class="n">derinlik</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span>
    <span class="n">komsular</span> <span class="o">=</span> <span class="nf">defaultdict</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">kayitlar</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">r</span><span class="p">[</span><span class="sh">"</span><span class="s">asset</span><span class="sh">"</span><span class="p">]</span> <span class="o">!=</span> <span class="n">varlik</span><span class="p">:</span>
            <span class="k">continue</span>
        <span class="n">tutar</span> <span class="o">=</span> <span class="nc">Decimal</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="sh">"</span><span class="s">amount</span><span class="sh">"</span><span class="p">])</span>
        <span class="k">if</span> <span class="n">tutar</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">komsular</span><span class="p">[</span><span class="n">r</span><span class="p">[</span><span class="sh">"</span><span class="s">from</span><span class="sh">"</span><span class="p">]].</span><span class="nf">append</span><span class="p">(</span>
                <span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="sh">"</span><span class="s">to</span><span class="sh">"</span><span class="p">],</span> <span class="n">tutar</span><span class="p">,</span> <span class="nf">int</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="sh">"</span><span class="s">order</span><span class="sh">"</span><span class="p">]),</span> <span class="n">r</span><span class="p">[</span><span class="sh">"</span><span class="s">tx</span><span class="sh">"</span><span class="p">])</span>
            <span class="p">)</span>

    <span class="n">kuyruk</span> <span class="o">=</span> <span class="nf">deque</span><span class="p">([(</span><span class="n">baslangic</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">[</span><span class="n">baslangic</span><span class="p">])])</span>
    <span class="n">bulgular</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">while</span> <span class="n">kuyruk</span><span class="p">:</span>
        <span class="n">adres</span><span class="p">,</span> <span class="n">son_sira</span><span class="p">,</span> <span class="n">yol</span> <span class="o">=</span> <span class="n">kuyruk</span><span class="p">.</span><span class="nf">popleft</span><span class="p">()</span>
        <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">yol</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&gt;=</span> <span class="n">derinlik</span><span class="p">:</span>
            <span class="k">continue</span>
        <span class="k">for</span> <span class="n">hedef</span><span class="p">,</span> <span class="n">tutar</span><span class="p">,</span> <span class="n">sira</span><span class="p">,</span> <span class="n">tx</span> <span class="ow">in</span> <span class="n">komsular</span><span class="p">[</span><span class="n">adres</span><span class="p">]:</span>
            <span class="k">if</span> <span class="n">sira</span> <span class="o">&lt;=</span> <span class="n">son_sira</span> <span class="ow">or</span> <span class="n">hedef</span> <span class="ow">in</span> <span class="n">yol</span><span class="p">:</span>
                <span class="k">continue</span>
            <span class="n">yeni_yol</span> <span class="o">=</span> <span class="n">yol</span> <span class="o">+</span> <span class="p">[</span><span class="n">hedef</span><span class="p">]</span>
            <span class="n">bulgular</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                <span class="sh">"</span><span class="s">yol</span><span class="sh">"</span><span class="p">:</span> <span class="n">yeni_yol</span><span class="p">,</span> <span class="sh">"</span><span class="s">tx</span><span class="sh">"</span><span class="p">:</span> <span class="n">tx</span><span class="p">,</span>
                <span class="sh">"</span><span class="s">son_transfer</span><span class="sh">"</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">tutar</span><span class="p">)</span>
            <span class="p">})</span>
            <span class="n">kuyruk</span><span class="p">.</span><span class="nf">append</span><span class="p">((</span><span class="n">hedef</span><span class="p">,</span> <span class="n">sira</span><span class="p">,</span> <span class="n">yeni_yol</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">bulgular</span>
</code></pre></div></div>

<p>Kuyruk, yolları adım adım genişletir; derinlik sınırı aramayı kısıtlar. <code class="language-plaintext highlighter-rouge">Decimal</code>, kayan nokta yuvarlama hatalarını azaltır. Varlık kimliği ağ bilgisini de içermelidir. Çıktıdaki tutar son transferin değeridir; başlangıçtaki paranın aynı miktarda ilerlediğini kanıtlamaz. Özellikle hesap bakiyelerinde fonlar karışabileceğinden bu kod bir ilişki keşif aracıdır, kesin kaynak atama motoru değildir.</p>

<h2 id="dedektifin-tuzakları">Dedektifin tuzakları</h2>

<table>
  <thead>
    <tr>
      <th>Gözlem</th>
      <th>Olası yorum</th>
      <th>Neden kesin değil?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ortak işlem girdileri</td>
      <td>Ortak kontrol</td>
      <td>CoinJoin bunu bozabilir</td>
    </tr>
    <tr>
      <td>Yeni çıktı adresi</td>
      <td>Para üstü</td>
      <td>Ödeme alıcısı da olabilir</td>
    </tr>
    <tr>
      <td>Borsa etiketi</td>
      <td>Hizmete aktarım</td>
      <td>Etiket eski veya hatalı olabilir</td>
    </tr>
    <tr>
      <td>Köprü kullanımı</td>
      <td>Başka ağa geçiş</td>
      <td>Hedef ağda ayrıca eşleştirme gerekir</td>
    </tr>
  </tbody>
</table>

<p>Karıştırıcılar, gizlilik odaklı protokoller ve zincirler arası geçişler takibi zorlaştırabilir. Zaman ve tutar benzerliği yalnızca destekleyici işarettir. FIFO veya oransal dağıtım gibi kaynak atama yöntemleri de varsayımdır; doğrudan zincir gerçeği değildir. Aynı veriye farklı yöntemler uygulandığında farklı sonuçlar çıkabilir.</p>

<h2 id="bulguyu-kanıta-dönüştürmek">Bulguyu kanıta dönüştürmek</h2>

<p>Rapor; kullanılan sorguları, ham kayıtları, dosya özetlerini, zaman çizelgesini ve belirsizlikleri içermelidir. Yeniden üretilebilirlik önemlidir: Başka bir uzman aynı adımlarla aynı gözlemleri elde edebilmelidir. Zincir yeniden düzenlenmeleri nedeniyle kesinleşme durumu da kaydedilmelidir. Kişiyle bağlantı kurmak için hizmet sağlayıcı kayıtları ve uygun hukuki süreçler gerekebilir.</p>

<p>Sonuçta zincir analizi sihirli bir kimlik bulucu değildir. Gücü, doğrulanabilir hareketleri görünür kılmasındadır. İyi analist, yalnızca okun yönünü değil, o okun neyi <strong>kanıtlamadığını</strong> da anlatır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="blok zincir" /><category term="adli analiz" /><category term="kripto para" /><category term="işlem takibi" /><category term="python" /><category term="siber güvenlik" /><summary type="html"><![CDATA[Bir kripto para işlemi kaybolmuş gibi görünebilir; ancak açık blok zincirlerde genellikle arkasında kalıcı bir iz bırakır. Blok zincir adli analizi, bu izleri anlamlandırarak şüpheli hareketleri inceleme işidir. Dedektifin büyüteci burada işlem kimliği, adres grafiği ve zaman çizelgesidir. Yalnız önemli bir fark var: Bir adresi bulmak, sahibini teşhis etmek değildir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/blok-zincir-adli-80.png" /><media:content medium="image" url="https://program.sonsuz.us/img/blok-zincir-adli-80.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Depoda Robot Trafiği: Eşzamanlı Sipariş Toplamanın Algoritmik Sırları</title><link href="https://program.sonsuz.us/posts/depoda-robot-trafigi-eszamanli-siparis-toplamanin-algoritmik-sirlari/" rel="alternate" type="text/html" title="Depoda Robot Trafiği: Eşzamanlı Sipariş Toplamanın Algoritmik Sırları" /><published>2026-11-11T00:00:00+00:00</published><updated>2026-11-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/depoda-robot-trafigi-eszamanli-siparis-toplamanin-algoritmik-sirlari</id><content type="html" xml:base="https://program.sonsuz.us/posts/depoda-robot-trafigi-eszamanli-siparis-toplamanin-algoritmik-sirlari/"><![CDATA[<p><img src="/img/depoda-robot-trafigi-43.svg" alt="depoda-robot-trafigi-43" /></p>

<p>Bir depoda yüzlerce robotun aynı anda hareket ettiğini düşünün: Biri raf taşıyor, diğeri şarja gidiyor, üçüncüsü kavşakta bekliyor. Üstelik müşteriler sipariş vermeyi durdurmuyor! Amazon tarzı robotik depolarda bu koreografinin sırrı, tek bir süper algoritma değil; görev atama, zamanlama ve çakışmasız yol planlamasının birlikte çalışmasıdır. Depodaki görünmez trafik müdürünü biraz yakından tanıyalım.</p>

<p>``</p>

<h2 id="önce-iş-modelini-anlayalım">Önce iş modelini anlayalım</h2>

<p>Yaygın yaklaşım <strong>ürünün insana gelmesi</strong>, yani <em>goods-to-person</em> modelidir. Mobil robotlar taşınabilir rafları toplama istasyonlarına getirir; ürünleri raftan alma işlemini insanlar veya ayrı robotik sistemler gerçekleştirebilir. Dolayısıyla mobil robotun görevi çoğunlukla ürünü doğrudan kavramak değil, doğru rafı doğru istasyona ulaştırmaktır.</p>

<p>Bir sipariş birden fazla raftaki ürünleri gerektirebilir. Tersine, aynı raftaki ürünler birkaç siparişe hizmet edebilir. Bu yüzden sistem önce siparişleri raf ziyaretlerine dönüştürür, uygun ziyaretleri gruplar ve ardından robotlara dağıtır. Böylece üç sipariş için aynı rafı üç kez dolaştırmak yerine tek ziyaret yeterli olabilir.</p>

<h2 id="matematik-en-yakın-robot-her-zaman-doğru-robot-değildir">Matematik: En yakın robot her zaman doğru robot değildir</h2>

<p>Bu problem, çok robotlu görev atama ve çizelgeleme ailesine girer. Robotları $R$, görevleri $G$ ile gösterelim. $x_{ij}=1$, robot $i$ için görev $j$ seçildiği anlamına gelsin. Basitleştirilmiş hedef, toplam atama maliyetini azaltmaktır:</p>

\[\min_x \sum_{i,j} c_{ij}x_{ij}\]

<p>Örnek maliyet fonksiyonumuz şöyle olabilir:</p>

\[c_{ij}=\alpha d_{ij}+\beta q_j+\gamma\max(0,t+d_{ij}+q_j+s_j-D_j)\]

<p>Burada $d_{ij}$ tahmini seyahat süresi, $q_j$ istasyon kuyruğu, $s_j$ hizmet süresi, $D_j$ teslim hedefi, $t$ ise mevcut zamandır. Ağırlıklar işletmenin önceliklerini belirler. Büyük $\gamma$, gecikmeyi daha pahalı hale getirir.</p>

<p>Tek karar turunda her robot en fazla bir görev alır; seçilen her görev de bir robota atanır. Batarya, taşıma kapasitesi ve rafın müsaitliği ayrıca uygunluk kısıtlarıdır. Bunları yalnızca maliyet artırarak değil, gerektiğinde atamayı yasaklayarak modellemek gerekir.</p>

<h2 id="hangi-algoritma-hangi-katmanda">Hangi algoritma hangi katmanda?</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Kullanıldığı katman</th>
      <th>Gücü</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Açgözlü seçim</td>
      <td>Görev atama</td>
      <td>Çok hızlı karar</td>
      <td>Yerel tercihler toplam maliyeti büyütebilir</td>
    </tr>
    <tr>
      <td>Macar algoritması</td>
      <td>Bire bir atama</td>
      <td>Verilen matriste optimum eşleşme</td>
      <td>Trafiği kendiliğinden çözmez</td>
    </tr>
    <tr>
      <td>Öncelikli planlama</td>
      <td>Çok robotlu yol bulma</td>
      <td>Pratik ve hızlı</td>
      <td>Öncelik sırası sonucu etkiler</td>
    </tr>
    <tr>
      <td>CBS</td>
      <td>Çok robotlu yol bulma</td>
      <td>Uygun koşullarda optimal çözüm</td>
      <td>Yoğun senaryolarda hesaplama pahalılaşabilir</td>
    </tr>
  </tbody>
</table>

<p>Gerçek zamanlı sistemlerde <strong>kayan ufuk</strong> yaklaşımı kullanışlıdır: Yakın geleceği planla, küçük bir kısmını uygula, yeni bilgi gelince yeniden hesapla. Bu bir atama algoritmasından çok, kararları sürekli yenileme stratejisidir.</p>

<h2 id="python-ile-küçük-bir-atama-motoru">Python ile küçük bir atama motoru</h2>

<p>Aşağıdaki örnekte üç robotu üç raf ziyaretine eşleştiriyoruz. Sürelerin birimi dakika; teslim hedefleri şu andan itibaren ölçülüyor. SciPy kurulmuş olmalıdır. Seyahat matrisi, rafı alma ve istasyona götürme süresinin tahminini temsil eder.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="n">scipy.optimize</span> <span class="kn">import</span> <span class="n">linear_sum_assignment</span>

<span class="c1"># Satırlar robotlar, sütunlar raf ziyaretleridir.
</span><span class="n">travel</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span>
    <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span>
    <span class="p">[</span><span class="mi">6</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">],</span>
    <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">8</span><span class="p">],</span>
<span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
<span class="n">queue</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
<span class="n">deadline</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">6</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
<span class="n">service</span> <span class="o">=</span> <span class="mf">2.0</span>

<span class="n">completion</span> <span class="o">=</span> <span class="n">travel</span> <span class="o">+</span> <span class="n">queue</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="p">:]</span> <span class="o">+</span> <span class="n">service</span>
<span class="n">lateness</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">maximum</span><span class="p">(</span><span class="n">completion</span> <span class="o">-</span> <span class="n">deadline</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="p">:],</span> <span class="mi">0</span><span class="p">)</span>
<span class="n">cost</span> <span class="o">=</span> <span class="n">travel</span> <span class="o">+</span> <span class="n">queue</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="p">:]</span> <span class="o">+</span> <span class="mi">4</span> <span class="o">*</span> <span class="n">lateness</span>

<span class="n">robots</span><span class="p">,</span> <span class="n">tasks</span> <span class="o">=</span> <span class="nf">linear_sum_assignment</span><span class="p">(</span><span class="n">cost</span><span class="p">)</span>
<span class="k">for</span> <span class="n">robot</span><span class="p">,</span> <span class="n">task</span> <span class="ow">in</span> <span class="nf">zip</span><span class="p">(</span><span class="n">robots</span><span class="p">,</span> <span class="n">tasks</span><span class="p">):</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Robot </span><span class="si">{</span><span class="n">robot</span><span class="si">}</span><span class="s"> -&gt; Görev </span><span class="si">{</span><span class="n">task</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">[None, :]</code>, kuyruk ve teslim hedeflerini bütün robot satırlarına yayar. <code class="language-plaintext highlighter-rouge">lateness</code>, erken tamamlanan işlere sıfır gecikme cezası verir. Eşleştirme, bu sabit maliyet matrisi için optimumdur; tüm deponun geleceği için değil! Örnek, her robotun her rafı taşıyabildiğini varsayar ve güzergâh çatışmalarını henüz hesaba katmaz.</p>

<h2 id="aynı-koridora-iki-robot-girerse">Aynı koridora iki robot girerse?</h2>

<p>Atamadan sonra <strong>çok ajanlı yol bulma</strong>, yani MAPF katmanı devreye girer. Depo bir grafik olarak modellenir: Düğümler konumları, kenarlar geçişleri temsil eder. Zaman da modele eklenince robotların aynı anda aynı düğümü kullanması veya bir kenarda karşılıklı yer değiştirmesi engellenebilir.</p>

<p>Rezervasyon tablosu, belirli konumları belirli zaman aralıklarında robotlara ayırır. Beklemek de geçerli bir harekettir. Ancak gerçek robotların boyutları, dönüş süreleri ve fren mesafeleri bulunduğundan, yalnızca kareli haritadaki çakışmaları önlemek yeterli değildir; güvenlik payları ve hareket kısıtları gerekir.</p>

<h2 id="küçük-senaryo-büyük-ders">Küçük senaryo, büyük ders</h2>

<p>İki sipariş aynı raftan ürün istiyor; üçüncü sipariş farklı rafta ve daha acil. Planlayıcı ortak raf ziyaretini birleştirir, acil işi uygun robota verir ve istasyon yoğunluğunu değerlendirir. Yol planlayıcı kavşak geçişlerini zamanlar. Bir koridor kapanırsa sistem yeni güzergâh üretir; gecikme büyürse görev atamasını da günceller.</p>

<p>Başarıyı yalnızca robotların hızında aramayın. Saatlik tamamlanan sipariş, teslim gecikmesi, istasyon beklemesi ve enerji tüketimini birlikte ölçün. İyi planlama, bütün robotları sürekli koşturmak değil; doğru robotu doğru anda doğru işe göndermektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik" /><category term="depo otomasyonu" /><category term="görev planlama" /><category term="çok ajanlı sistemler" /><category term="python" /><summary type="html"><![CDATA[Bir depoda yüzlerce robotun aynı anda hareket ettiğini düşünün: Biri raf taşıyor, diğeri şarja gidiyor, üçüncüsü kavşakta bekliyor. Üstelik müşteriler sipariş vermeyi durdurmuyor! Amazon tarzı robotik depolarda bu koreografinin sırrı, tek bir süper algoritma değil; görev atama, zamanlama ve çakışmasız yol planlamasının birlikte çalışmasıdır. Depodaki görünmez trafik müdürünü biraz yakından tanıyalım.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/depoda-robot-trafigi-43.png" /><media:content medium="image" url="https://program.sonsuz.us/img/depoda-robot-trafigi-43.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dijital Çömlek Dedektifleri: Binlerce Seramik Parçası Nasıl Eşleştirilir?</title><link href="https://program.sonsuz.us/posts/dijital-comlek-dedektifleri-binlerce-seramik-parcasi-nasil-eslestirilir/" rel="alternate" type="text/html" title="Dijital Çömlek Dedektifleri: Binlerce Seramik Parçası Nasıl Eşleştirilir?" /><published>2026-11-11T00:00:00+00:00</published><updated>2026-11-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dijital-comlek-dedektifleri-binlerce-seramik-parcasi-nasil-eslestirilir</id><content type="html" xml:base="https://program.sonsuz.us/posts/dijital-comlek-dedektifleri-binlerce-seramik-parcasi-nasil-eslestirilir/"><![CDATA[<p><img src="/img/dijital-comlek-dedektifleri-91.svg" alt="dijital-comlek-dedektifleri-91" /></p>

<p>Bir kazı alanından çıkan binlerce seramik parçasını düşünün: Kutunun üzerinde örnek resim yok, parçaların bir bölümü kayıp ve bazı kenarlar yüzyıllardır aşınıyor. Bildiğimiz yapbozun oldukça huysuz kuzeni! Görüntü işleme, bu karmaşayı ölçülebilir bir eşleştirme problemine dönüştürür. Amaç, parçaları rastgele denemek değil; geometriden, renkten ve fiziksel kısıtlardan yararlanarak olası komşuları bulmaktır.</p>

<p>``</p>

<h2 id="önce-parçaları-bilgisayarın-diline-çevirmek">Önce parçaları bilgisayarın diline çevirmek</h2>

<p>İlk adım, her parçayı kimlik numarasıyla kaydetmek ve kontrollü ışık altında görüntülemektir. Fotoğraflardaki ölçek referansı, piksel mesafelerini milimetreye çevirmeyi sağlar. Farklı büyütmelerle çekilmiş iki parçayı doğrudan karşılaştırmak, biri santimetreyle diğeri inçle konuşan iki ustayı aynı tezgâha göndermeye benzer.</p>

<p>Arka plan ayrıştırılır, gölgeler azaltılır ve parça sınırları çıkarılır. OpenCV ile eşikleme, morfolojik işlemler ve kontur bulma kullanılabilir. Ancak dış konturun tamamı kırık kenar değildir: Özgün ağız veya taban çizgileri ayrıca sınıflandırılmalıdır. Eğri ve kalın parçalar için çok açılı fotoğraflar ya da üç boyutlu taramalar daha güvenilir bilgi sunar.</p>

<h2 id="eşleşmenin-matematiği-yakınlık-yetmez">Eşleşmenin matematiği: Yakınlık yetmez</h2>

<p>İki kırık kenarın uyuşması için uygun konuma taşınmaları gerekir. Rijit dönüşüm, noktaları $T(p)=Rp+t$ biçiminde döndürür ve öteleyerek yerleştirir. Burada $R$ dönme matrisi, $t$ ise öteleme vektörüdür. Ölçek kalibre edilmişse parçaları keyfî biçimde büyütmek doğru değildir.</p>

<p>Hizalanmış kenar kümeleri arasındaki uzaklık, simetrik Chamfer ölçüsüyle hesaplanabilir:</p>

\[d(A,B)=\frac{1}{2\vert A\vert }\sum_{a\in A}\min_{b\in B}\\vert a-b\\vert +\frac{1}{2\vert B\vert }\sum_{b\in B}\min_{a\in A}\\vert b-a\\vert\]

<p>Küçük değer, geometrik yakınlığa işaret eder; kesin eşleşmeye değil. Benzer eğriler farklı kaplara ait olabilir. Bu yüzden birden fazla kanıt birlikte değerlendirilir.</p>

<table>
  <thead>
    <tr>
      <th>Kanıt</th>
      <th>Sağladığı ipucu</th>
      <th>Temel sınırı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kenar geometrisi</td>
      <td>Kırık çizgilerinin uyumu</td>
      <td>Aşınma şekli değiştirir</td>
    </tr>
    <tr>
      <td>Renk ve bezeme</td>
      <td>Yüzey deseninin devamlılığı</td>
      <td>Işık ve kir yanıltabilir</td>
    </tr>
    <tr>
      <td>Kalınlık</td>
      <td>Komşuluk için fiziksel tutarlılık</td>
      <td>Aynı kapta değişebilir</td>
    </tr>
    <tr>
      <td>Üç boyutlu yüzey</td>
      <td>Kırık yüzeylerin tamamlayıcılığı</td>
      <td>Tarama maliyeti yüksektir</td>
    </tr>
  </tbody>
</table>

<h2 id="binlerce-aday-arasında-akıllı-eleme">Binlerce aday arasında akıllı eleme</h2>

<p>$n$ parçanın bütün çiftlerini denemek yaklaşık $n(n-1)/2$ karşılaştırma gerektirir. On bin parçada bu sayı yaklaşık elli milyondur. Bilgisayar hızlıdır, fakat gereksiz karşılaştırmaları sevmez.</p>

<p>Önce kalınlık, malzeme, renk dağılımı ve kenar eğriliği gibi özniteliklerle aday havuzu daraltılır. Yaklaşık en yakın komşu indeksleri, benzer özniteliklere sahip parçaları hızla getirir. Ardından pahalı geometrik hizalama uygulanır. Bu sıralama önemlidir: Hızlı filtreler fazla katıysa gerçek komşular daha baştan kaybolabilir.</p>

<h2 id="küçük-bir-kenar-puanlayıcısı">Küçük bir kenar puanlayıcısı</h2>

<p>Aşağıdaki Python kodu, önceden hizalanmış iki kenarın simetrik uzaklığını hesaplar. Diziler, aynı koordinat sisteminde ve milimetre cinsinden örneklenmiş kırık kenar noktalarını içermelidir; parçaların bütün dış konturlarını değil.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="n">scipy.spatial</span> <span class="kn">import</span> <span class="n">cKDTree</span>


<span class="k">def</span> <span class="nf">kenar_puani</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
    <span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">asarray</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
    <span class="n">b</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">asarray</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
    <span class="nf">if </span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">ndim</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="n">b</span><span class="p">.</span><span class="n">ndim</span> <span class="o">!=</span> <span class="mi">2</span>
            <span class="ow">or</span> <span class="n">a</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">2</span> <span class="ow">or</span> <span class="n">b</span><span class="p">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">2</span>
            <span class="ow">or</span> <span class="nf">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span> <span class="ow">or</span> <span class="nf">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">):</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">En az iki noktalı Nx2 diziler gerekli.</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">agac_a</span> <span class="o">=</span> <span class="nf">cKDTree</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
    <span class="n">agac_b</span> <span class="o">=</span> <span class="nf">cKDTree</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
    <span class="n">uzaklik_ab</span> <span class="o">=</span> <span class="n">agac_b</span><span class="p">.</span><span class="nf">query</span><span class="p">(</span><span class="n">a</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
    <span class="n">uzaklik_ba</span> <span class="o">=</span> <span class="n">agac_a</span><span class="p">.</span><span class="nf">query</span><span class="p">(</span><span class="n">b</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
    <span class="k">return</span> <span class="nf">float</span><span class="p">((</span><span class="n">uzaklik_ab</span><span class="p">.</span><span class="nf">mean</span><span class="p">()</span> <span class="o">+</span> <span class="n">uzaklik_ba</span><span class="p">.</span><span class="nf">mean</span><span class="p">())</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
</code></pre></div></div>

<p>KD-tree, her noktanın karşı kenardaki en yakın komşusunu bulmayı hızlandırır. İki yönlü ortalama, yalnızca tek tarafın iyi örtüşmesini ödüllendirme riskini azaltır. Kenarlar benzer aralıklarla örneklenmelidir; aksi hâlde yoğun örneklenen bölgeler puanı fazla etkiler. Bu fonksiyon hizalama yapmaz. Öncesinde dönüşüm aranmalı, sonrasında örtüşme uzunluğu ve parça çakışması kontrol edilmelidir.</p>

<h2 id="i̇yi-çiftlerden-tutarlı-bir-kaba">İyi çiftlerden tutarlı bir kaba</h2>

<p>En düşük puanlı çiftleri sırayla birleştirmek caziptir, ama erken bir hata bütün rekonstrüksiyonu bozabilir. Bunun yerine parçalar düğüm, olası eşleşmeler bağlantı olacak şekilde bir grafik kurulabilir.</p>

<p>Sistem yalnızca yerel uyumu değil, küresel tutarlılığı da denetler: Aynı kenar iki farklı komşuya bağlanmamalı, parçaların iç bölgeleri çakışmamalı ve bağlantı döngüleri çelişkili konumlar üretmemelidir. Üç boyutlu çalışmada kırık yüzey normalleri uygun biçimde karşıt yönlere bakmalıdır. Işın araması gibi yöntemler, tek bir karara kilitlenmeden birkaç olası düzenlemeyi birlikte değerlendirebilir.</p>

<h2 id="başarıyı-nasıl-ölçeriz">Başarıyı nasıl ölçeriz?</h2>

<p>Güzel görünen bir dijital kap tek başına başarı ölçütü değildir. Gerçek komşulukları bilinen örneklerde eşleşme kesinliği, bulunan doğru bağlantıların oranı ve geometrik yerleştirme hatası ölçülmelidir. Farklı aşınma düzeyleri, eksik parçalar ve birbirine benzeyen kaplar ayrıca denenmelidir.</p>

<p>Pratikte bu sistemler çoğunlukla arkeoloğa güven puanlı öneriler sunar; her parçayı kusursuzca birleştiren sihirli makineler değildir. İnsan uzman, bezeme üslubu ve üretim tekniği gibi bağlamsal bilgileri ekler. Sonuç, algoritmanın sabrıyla arkeoloğun sezgisinin ortak çalışmasıdır: Çömlek konuşmaz, ama kırık kenarları epey ipucu verir!</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="görüntü işleme" /><category term="arkeoloji" /><category term="seramik" /><category term="bilgisayarlı görü" /><category term="nokta bulutu" /><category term="algoritmalar" /><summary type="html"><![CDATA[Bir kazı alanından çıkan binlerce seramik parçasını düşünün: Kutunun üzerinde örnek resim yok, parçaların bir bölümü kayıp ve bazı kenarlar yüzyıllardır aşınıyor. Bildiğimiz yapbozun oldukça huysuz kuzeni! Görüntü işleme, bu karmaşayı ölçülebilir bir eşleştirme problemine dönüştürür. Amaç, parçaları rastgele denemek değil; geometriden, renkten ve fiziksel kısıtlardan yararlanarak olası komşuları bulmaktır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dijital-comlek-dedektifleri-91.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dijital-comlek-dedektifleri-91.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Elektriğin Etiketi Neden Değişir? Dinamik Fiyatlandırmanın Matematiği ve Kodlanması</title><link href="https://program.sonsuz.us/posts/elektrigin-etiketi-neden-degisir-dinamik-fiyatlandirmanin-matematigi-ve-kodlanmasi/" rel="alternate" type="text/html" title="Elektriğin Etiketi Neden Değişir? Dinamik Fiyatlandırmanın Matematiği ve Kodlanması" /><published>2026-11-11T00:00:00+00:00</published><updated>2026-11-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/elektrigin-etiketi-neden-degisir-dinamik-fiyatlandirmanin-matematigi-ve-kodlanmasi</id><content type="html" xml:base="https://program.sonsuz.us/posts/elektrigin-etiketi-neden-degisir-dinamik-fiyatlandirmanin-matematigi-ve-kodlanmasi/"><![CDATA[<p><img src="/img/elektrigin-etiketi-neden-80.svg" alt="elektrigin-etiketi-neden-80" /></p>

<p>Elektrik fiyatının gün boyunca değişmesi, marketteki indirim etiketlerinin saat başı yenilenmesine benzer. Ancak burada amaç yalnızca satış yapmak değildir: üretim ile tüketimi dengede tutmak gerekir. Herkes klimasını aynı anda açtığında sistem zorlanabilir; tüketimin bir kısmını daha sakin saatlere taşımak ise maliyetleri azaltabilir. Peki, bu fiyat sinyali nasıl hesaplanır ve tüketicinin kararına nasıl dönüşür?</p>

<p>``</p>

<h2 id="önce-fizik-sonra-fiyat-etiketi">Önce fizik, sonra fiyat etiketi</h2>

<p>Elektrik şebekesinde üretim ve tüketim sürekli dengelenmelidir. Depolama ve bağlantılar esneklik sağlasa da sınırsız değildir. Talep yükseldiğinde daha pahalı üretim kaynakları devreye girebilir; iletim darboğazları ve rezerv ihtiyacı da maliyeti etkileyebilir.</p>

<p>Bu nedenle dinamik fiyatlandırmanın temelinde <strong>marjinal maliyet</strong> bulunur: sisteme ilave bir birim elektrik sağlamanın maliyeti. Ancak tüketicinin ödediği fiyat; sözleşme, vergiler, şebeke bedelleri ve düzenlemeler nedeniyle bu maliyetle birebir aynı olmayabilir.</p>

<p>Başlıca yaklaşımlar şöyle ayrılır:</p>

<table>
  <thead>
    <tr>
      <th>Model</th>
      <th>Fiyat nasıl belirlenir?</th>
      <th>Tüketici açısından</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sabit tarife</td>
      <td>Dönem boyunca değişmez</td>
      <td>Öngörülebilir, zamanlama teşviki zayıf</td>
    </tr>
    <tr>
      <td>Zaman dilimli tarife</td>
      <td>Önceden tanımlanan saatlere göre değişir</td>
      <td>Planlama kolaydır</td>
    </tr>
    <tr>
      <td>Gerçek zamanlı tarife</td>
      <td>Güncel piyasa veya sistem koşullarını izler</td>
      <td>Esneklik değerlidir, belirsizlik artar</td>
    </tr>
  </tbody>
</table>

<h2 id="basitleştirilmiş-bir-hesaplama-modeli">Basitleştirilmiş bir hesaplama modeli</h2>

<p>Öğretici bir modelde enerji maliyetine, kapasite kullanımından doğan bir sıkışıklık bileşeni ekleyebiliriz:</p>

\[p_t = \operatorname{clip}\left(c_t + \alpha \left[\max\left(0,\frac{D_t}{K_t}-\theta\right)\right]^2,\ p_{min},\ p_{max}\right)\]

<p>Burada $c_t$ temel enerji maliyeti, $D_t$ talep, $K_t$ kullanılabilir kapasitedir. Talep ve kapasite aynı güç biriminde ölçülür. $\theta$ sıkışıklık eşiğini, $\alpha$ ise fiyat tepkisinin şiddetini belirler. Fiyatın birimi TL/kWh olduğundan $\alpha$ da aynı birimi taşır.</p>

<p>Kare terimi, eşik aşıldıkça baskının hızlanmasını sağlar. <code class="language-plaintext highlighter-rouge">clip</code> işlemi ise fiyatı belirlenen alt ve üst sınırlar arasında tutar. Bu formül gerçek bir piyasanın eksiksiz modeli değil, anlaşılır bir tasarım örneğidir.</p>

<p>$K_t=1000$, $\theta=0{,}75$ ve $\alpha=8$ seçildiğinde, sınırlar devreye girmiyorsa:</p>

<table>
  <thead>
    <tr>
      <th>Talep</th>
      <th style="text-align: right">Temel maliyet</th>
      <th style="text-align: right">Hesaplanan fiyat</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>600 MW</td>
      <td style="text-align: right">1,60 TL/kWh</td>
      <td style="text-align: right">1,60 TL/kWh</td>
    </tr>
    <tr>
      <td>900 MW</td>
      <td style="text-align: right">2,00 TL/kWh</td>
      <td style="text-align: right">2,18 TL/kWh</td>
    </tr>
    <tr>
      <td>1000 MW</td>
      <td style="text-align: right">2,50 TL/kWh</td>
      <td style="text-align: right">3,00 TL/kWh</td>
    </tr>
  </tbody>
</table>

<h2 id="tüketici-neden-davranış-değiştirir">Tüketici neden davranış değiştirir?</h2>

<p>Bu ilişkinin anahtarı <strong>talebin fiyat esnekliğidir</strong>:</p>

\[\frac{\Delta Q}{Q}\approx\varepsilon\frac{\Delta p}{p}\]

<p>Örneğin $\varepsilon=-0{,}2$ ise yüzde 10 fiyat artışı, diğer koşullar sabitken yaklaşık yüzde 2 tüketim azalmasıyla ilişkilendirilebilir. Bu küçük değişimler için kullanılan bir yaklaşımdır; herkesin davranışını kesin biçimde tahmin etmez.</p>

<p>Üstelik azalan tüketim tamamen kaybolmayabilir. Elektrikli aracın şarjını geceye taşımak, günlük ihtiyacı azaltmadan yoğun saatteki yükü düşürür. Buzdolabı ise fiyat bildirimini okuyup tatile çıkamaz! Cihazın esnekliği, konfor ihtiyacı ve otomasyon burada belirleyicidir.</p>

<h2 id="python-ile-ucuz-çalışma-aralığını-bulalım">Python ile ucuz çalışma aralığını bulalım</h2>

<p>Aşağıdaki kod fiyatları hesaplar ve her saat 1 kWh tüketen, iki saat kesintisiz çalışan bir cihaz için en ucuz başlangıcı seçer. Örnekte saatler ardışıktır; bedellere vergi ve diğer ücretler dahil değildir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span>

<span class="nd">@dataclass</span>
<span class="k">class</span> <span class="nc">Hour</span><span class="p">:</span>
    <span class="n">hour</span><span class="p">:</span> <span class="nb">int</span>
    <span class="n">demand</span><span class="p">:</span> <span class="nb">float</span>
    <span class="n">capacity</span><span class="p">:</span> <span class="nb">float</span>
    <span class="n">cost</span><span class="p">:</span> <span class="nb">float</span>

<span class="k">def</span> <span class="nf">price</span><span class="p">(</span><span class="n">slot</span><span class="p">:</span> <span class="n">Hour</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">8.0</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="mf">0.75</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">slot</span><span class="p">.</span><span class="n">capacity</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">Kapasite pozitif olmalıdır</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">stress</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">slot</span><span class="p">.</span><span class="n">demand</span> <span class="o">/</span> <span class="n">slot</span><span class="p">.</span><span class="n">capacity</span> <span class="o">-</span> <span class="n">threshold</span><span class="p">)</span>
    <span class="n">raw</span> <span class="o">=</span> <span class="n">slot</span><span class="p">.</span><span class="n">cost</span> <span class="o">+</span> <span class="n">alpha</span> <span class="o">*</span> <span class="n">stress</span> <span class="o">**</span> <span class="mi">2</span>
    <span class="k">return</span> <span class="nf">min</span><span class="p">(</span><span class="mf">6.0</span><span class="p">,</span> <span class="nf">max</span><span class="p">(</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">raw</span><span class="p">))</span>

<span class="n">slots</span> <span class="o">=</span> <span class="p">[</span>
    <span class="nc">Hour</span><span class="p">(</span><span class="mi">18</span><span class="p">,</span> <span class="mi">900</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mf">2.0</span><span class="p">),</span>
    <span class="nc">Hour</span><span class="p">(</span><span class="mi">19</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">),</span>
    <span class="nc">Hour</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">800</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mf">1.9</span><span class="p">),</span>
    <span class="nc">Hour</span><span class="p">(</span><span class="mi">21</span><span class="p">,</span> <span class="mi">600</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="mf">1.6</span><span class="p">),</span>
<span class="p">]</span>
<span class="n">prices</span> <span class="o">=</span> <span class="p">[</span><span class="nf">price</span><span class="p">(</span><span class="n">slot</span><span class="p">)</span> <span class="k">for</span> <span class="n">slot</span> <span class="ow">in</span> <span class="n">slots</span><span class="p">]</span>
<span class="n">start</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span>
    <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">prices</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span>
    <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">i</span><span class="p">:</span> <span class="nf">sum</span><span class="p">(</span><span class="n">prices</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">])</span>
<span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">slots</span><span class="p">[</span><span class="n">start</span><span class="p">].</span><span class="n">hour</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="nf">sum</span><span class="p">(</span><span class="n">prices</span><span class="p">[</span><span class="n">start</span><span class="p">:</span><span class="n">start</span> <span class="o">+</span> <span class="mi">2</span><span class="p">]),</span> <span class="mi">2</span><span class="p">))</span>
</code></pre></div></div>

<p>Çıktı <code class="language-plaintext highlighter-rouge">20 3.52</code> olur: cihazın 20.00’de başlaması toplam 3,52 TL enerji maliyeti oluşturur. 18.00’de başlatılması ise 5,18 TL tutar. Buradaki tasarruf, tüketimin miktarını değil zamanını değiştirerek elde edilir.</p>

<h2 id="i̇yi-model-yalnızca-ucuzluğu-hedeflemez">İyi model yalnızca ucuzluğu hedeflemez</h2>

<p>Gerçek uygulamalarda talep tahmini, hava durumu, yenilenebilir üretim ve tüketici tepkisi birlikte değerlendirilir. Herkes aynı ucuz saate yönelirse yeni bir talep zirvesi oluşabilir; bu yüzden tahmin ve optimizasyon tekrarlanmalıdır.</p>

<p>Şeffaf bildirimler, fiyat sınırları ve hassas tüketicilere uygun seçenekler de önemlidir. Her hane tüketimini kaydıramaz. Başarılı dinamik fiyatlandırma, faturayı bir bulmacaya çevirmek yerine anlaşılır sinyallerle esnekliği ödüllendirir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="dinamik fiyatlandırma" /><category term="enerji" /><category term="python" /><category term="talep yönetimi" /><category term="akıllı şebekeler" /><summary type="html"><![CDATA[Elektrik fiyatının gün boyunca değişmesi, marketteki indirim etiketlerinin saat başı yenilenmesine benzer. Ancak burada amaç yalnızca satış yapmak değildir: üretim ile tüketimi dengede tutmak gerekir. Herkes klimasını aynı anda açtığında sistem zorlanabilir; tüketimin bir kısmını daha sakin saatlere taşımak ise maliyetleri azaltabilir. Peki, bu fiyat sinyali nasıl hesaplanır ve tüketicinin kararına nasıl dönüşür?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/elektrigin-etiketi-neden-80.png" /><media:content medium="image" url="https://program.sonsuz.us/img/elektrigin-etiketi-neden-80.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Piyasa Yapıcılık Algoritmaları: Emir Defterinde Spread Peşinde</title><link href="https://program.sonsuz.us/posts/piyasa-yapicilik-algoritmalari-emir-defterinde-spread-pesinde/" rel="alternate" type="text/html" title="Piyasa Yapıcılık Algoritmaları: Emir Defterinde Spread Peşinde" /><published>2026-11-11T00:00:00+00:00</published><updated>2026-11-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/piyasa-yapicilik-algoritmalari-emir-defterinde-spread-pesinde</id><content type="html" xml:base="https://program.sonsuz.us/posts/piyasa-yapicilik-algoritmalari-emir-defterinde-spread-pesinde/"><![CDATA[<p>Bir pazarcının aynı ürünü farklı alış ve satış fiyatlarıyla değerlendirdiğini düşünün. Piyasa yapıcı botlar da benzer biçimde çalışır; ancak tezgâhları emir defteri, müşterileri diğer yatırımcılar, mesai arkadaşları ise milisaniyelerdir. İşin sırrı yalnızca fiyat farkını yakalamak değil, elde kalan pozisyonu ve gerçekleşmeyen emirleri yönetmektir.
``</p>

<h2 id="spread-neden-bedava-para-değildir">Spread neden bedava para değildir?</h2>

<p>Emir defteri, farklı fiyat seviyelerindeki limit emirlerini tutar. En yüksek alış fiyatına <strong>bid</strong>, en düşük satış fiyatına <strong>ask</strong> denir. Aralarındaki fark spread, bu iki fiyatın ortalaması ise orta fiyattır:</p>

\[m=(bid+ask)/2\]

<p>Piyasa yapıcı, alış ve satış limit emirleri göndererek likidite sağlar. İki emir uygun sırayla gerçekleşirse fiyat farkından brüt gelir oluşabilir. Ancak yalnızca alış gerçekleşir ve piyasa düşerse, bot spread kazanmak yerine değer kaybeden envanter taşır. Kasa bazen dolar, bazen de istenmeyen ürünlerle dolar!</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>İşleyiş</th>
      <th>Başlıca risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Piyasa yapıcı</td>
      <td>Bekleyen emirlerle likidite sunar</td>
      <td>Envanter ve ters seçim</td>
    </tr>
    <tr>
      <td>Piyasa alıcı</td>
      <td>Mevcut emirlerle hemen eşleşir</td>
      <td>Kayma ve işlem maliyeti</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/piyasa-yapicilik-algoritmalari-40.svg" alt="piyasa-yapicilik-algoritmalari-40" /></p>

<p><strong>Ters seçim</strong>, botun fiyatı güncelliğini yitirmişken daha hızlı veya bilgili katılımcıların onunla işlem yapmasıdır. Özellikle ani haberlerde, cazip görünen spread aslında yaklaşan zararın ambalajı olabilir.</p>

<h2 id="envanter-fiyatları-nasıl-değiştirir">Envanter fiyatları nasıl değiştirir?</h2>

<p>Basit bir modelde bot, orta fiyatın çevresine simetrik emirler yerleştirir. Daha gerçekçi yaklaşım, envantere göre bir referans fiyat hesaplar:</p>

\[r=m-\kappa\frac{q}{q_{\max}}\]

<p>Burada $q$ net pozisyon, $q_{\max}$ pozisyon sınırı, $\kappa$ ise fiyat biriminde kaydırma katsayısıdır. Pozitif envanter referans fiyatı düşürür: bot daha düşük alış fiyatıyla yeni alımları yavaşlatır, daha cazip satış fiyatıyla envanteri azaltmaya çalışır. Bu, garanti değil, işlem olasılıklarını değiştiren bir teşviktir.</p>

<p>Yarı spread $h$ seçilirken maliyetler de düşünülmelidir:</p>

\[h\gtrsim mf+a+b\]

<p>Burada $f$ işlem başına oransal maker ücreti, $a$ beklenen ters seçim maliyeti, $b$ hedeflenen ek marjdır. Bu yaklaşık ilişki, kârlılık garantisi değildir; ücret indirimleri, oynaklık ve gerçekleşme ihtimali sonucu değiştirir.</p>

<h2 id="python-ile-fiyat-üretmek">Python ile fiyat üretmek</h2>

<p>Aşağıdaki eğitim örneği, tutarlı bir defter görüntüsünden aday fiyatlar üretir. Ondalık hesaplama fiyat adımına uyumu kolaylaştırır; alış aşağıya, satış yukarıya yuvarlanır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">decimal</span> <span class="kn">import</span> <span class="n">Decimal</span> <span class="k">as</span> <span class="n">D</span><span class="p">,</span> <span class="n">ROUND_FLOOR</span><span class="p">,</span> <span class="n">ROUND_CEILING</span>


<span class="k">def</span> <span class="nf">quote_prices</span><span class="p">(</span><span class="n">bid</span><span class="p">,</span> <span class="n">ask</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">limit</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">tick</span><span class="p">,</span> <span class="n">half</span><span class="p">,</span> <span class="n">skew</span><span class="p">):</span>
    <span class="c1"># Sayısal girdiler Decimal olmalıdır.
</span>    <span class="k">if</span> <span class="n">bid</span> <span class="o">&gt;=</span> <span class="n">ask</span> <span class="ow">or</span> <span class="nf">min</span><span class="p">(</span><span class="n">limit</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">tick</span><span class="p">,</span> <span class="n">half</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">Geçersiz piyasa veya parametre</span><span class="sh">"</span><span class="p">)</span>

    <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">bid</span> <span class="o">+</span> <span class="n">ask</span><span class="p">)</span> <span class="o">/</span> <span class="nc">D</span><span class="p">(</span><span class="sh">"</span><span class="s">2</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">reference</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">-</span> <span class="n">skew</span> <span class="o">*</span> <span class="n">q</span> <span class="o">/</span> <span class="n">limit</span>

    <span class="k">def</span> <span class="nf">align</span><span class="p">(</span><span class="n">price</span><span class="p">,</span> <span class="n">rounding</span><span class="p">):</span>
        <span class="n">steps</span> <span class="o">=</span> <span class="p">(</span><span class="n">price</span> <span class="o">/</span> <span class="n">tick</span><span class="p">).</span><span class="nf">to_integral_value</span><span class="p">(</span><span class="n">rounding</span><span class="o">=</span><span class="n">rounding</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">steps</span> <span class="o">*</span> <span class="n">tick</span>

    <span class="n">buy</span> <span class="o">=</span> <span class="nf">align</span><span class="p">(</span><span class="n">reference</span> <span class="o">-</span> <span class="n">half</span><span class="p">,</span> <span class="n">ROUND_FLOOR</span><span class="p">)</span>
    <span class="n">sell</span> <span class="o">=</span> <span class="nf">align</span><span class="p">(</span><span class="n">reference</span> <span class="o">+</span> <span class="n">half</span><span class="p">,</span> <span class="n">ROUND_CEILING</span><span class="p">)</span>
    <span class="n">orders</span> <span class="o">=</span> <span class="p">{}</span>

    <span class="k">if</span> <span class="n">q</span> <span class="o">+</span> <span class="n">size</span> <span class="o">&lt;=</span> <span class="n">limit</span> <span class="ow">and</span> <span class="nc">D</span><span class="p">(</span><span class="sh">"</span><span class="s">0</span><span class="sh">"</span><span class="p">)</span> <span class="o">&lt;</span> <span class="n">buy</span> <span class="o">&lt;</span> <span class="n">ask</span><span class="p">:</span>
        <span class="n">orders</span><span class="p">[</span><span class="sh">"</span><span class="s">buy</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">buy</span>
    <span class="k">if</span> <span class="n">q</span> <span class="o">-</span> <span class="n">size</span> <span class="o">&gt;=</span> <span class="o">-</span><span class="n">limit</span> <span class="ow">and</span> <span class="n">sell</span> <span class="o">&gt;</span> <span class="n">bid</span><span class="p">:</span>
        <span class="n">orders</span><span class="p">[</span><span class="sh">"</span><span class="s">sell</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">sell</span>
    <span class="k">return</span> <span class="n">orders</span>
</code></pre></div></div>

<p>Fonksiyon emir göndermez; yalnızca fiyat önerir. Karşı tarafla hemen eşleşecek adayları eler ve mevcut pozisyona göre sınır kontrolü yapar. Negatif pozisyona izin vermesi, açığa satışın mümkün olduğu bir ortam varsayar; spot işlemlerde satış miktarı kullanılabilir varlıkla sınırlandırılmalıdır.</p>

<h2 id="asıl-mühendislik-emir-yaşam-döngüsü">Asıl mühendislik: Emir yaşam döngüsü</h2>

<ul>
  <li><strong>Defteri senkronize et:</strong> Önce snapshot al, ardından sıra numaralı güncellemeleri uygula. Mesaj kaybında yeni görüntü almadan fiyat üretmeye devam etme.</li>
  <li><strong>Emir durumunu izle:</strong> Gönderildi, kabul edildi, kısmen gerçekleşti ve iptal edildi durumlarını ayır. İptal isteği, iptalin tamamlandığı anlamına gelmez.</li>
  <li><strong>Gereksiz yenilemeyi azalt:</strong> Fiyat değişimi belirli bir eşiği geçmeden emirleri değiştirme. Fiyat-zaman öncelikli piyasalarda sürekli iptal, kuyruk avantajını kaybettirebilir.</li>
  <li><strong>Riski birlikte hesapla:</strong> Pozisyona ek olarak açık ve iptal bekleyen emirleri hesaba kat. Bakiye, teminat, minimum emir tutarı ve hız sınırlarını ayrıca denetle.</li>
</ul>

<p>Üretimde emirler, borsanın davranışı doğrulanarak <strong>post-only</strong> gönderilmelidir. Kodun yerel kontrolü yeterli değildir; ağ gecikmesi sırasında defter değişebilir. Bağlantı kopması, eski veri veya aşırı pozisyon için işlemleri durduran bir güvenlik mekanizması gerekir.</p>

<h2 id="performansı-doğru-ölçmek">Performansı doğru ölçmek</h2>

<p>Başarıyı yalnızca kazanılan spread ile ölçmeyin. Ücret sonrası kâr, gerçekleşme oranı, envanter oynaklığı ve işlemlerden sonraki fiyat hareketini birlikte izleyin. Geriye dönük testte kuyruk sırası, kısmi gerçekleşme ve gecikme modellenmezse sonuçlar gereğinden parlak görünür. Piyasa yapıcılık, iki fiyat yazmaktan çok belirsizliği disiplinle yönetme işidir. Bu örnek eğitim amaçlıdır, yatırım tavsiyesi değildir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="piyasa yapıcılık" /><category term="algoritmik ticaret" /><category term="emir defteri" /><category term="python" /><category term="risk yönetimi" /><summary type="html"><![CDATA[Bir pazarcının aynı ürünü farklı alış ve satış fiyatlarıyla değerlendirdiğini düşünün. Piyasa yapıcı botlar da benzer biçimde çalışır; ancak tezgâhları emir defteri, müşterileri diğer yatırımcılar, mesai arkadaşları ise milisaniyelerdir. İşin sırrı yalnızca fiyat farkını yakalamak değil, elde kalan pozisyonu ve gerçekleşmeyen emirleri yönetmektir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/piyasa-yapicilik-algoritmalari-40.png" /><media:content medium="image" url="https://program.sonsuz.us/img/piyasa-yapicilik-algoritmalari-40.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Radarın Matematiksel Gözleri: Ham Yansımalardan Konum ve Hız Hesaplamak</title><link href="https://program.sonsuz.us/posts/radarin-matematiksel-gozleri-ham-yansimalardan-konum-ve-hiz-hesaplamak/" rel="alternate" type="text/html" title="Radarın Matematiksel Gözleri: Ham Yansımalardan Konum ve Hız Hesaplamak" /><published>2026-11-11T00:00:00+00:00</published><updated>2026-11-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/radarin-matematiksel-gozleri-ham-yansimalardan-konum-ve-hiz-hesaplamak</id><content type="html" xml:base="https://program.sonsuz.us/posts/radarin-matematiksel-gozleri-ham-yansimalardan-konum-ve-hiz-hesaplamak/"><![CDATA[<p>Radar, karanlıkta çevresine seslenen bir yarasaya benzer; yalnız ses yerine elektromanyetik dalga kullanır. Gönderdiği sinyalin yankısını dinleyerek hedefin uzaklığını ve hareketini çıkarır. Ancak ekrandaki parlak noktanın arkasında sihir değil; zaman gecikmesi, faz değişimi, Fourier dönüşümü ve biraz da gürültüyle mücadele vardır. Gelin ham örneklerden ölçüme uzanan yolu inceleyelim.</p>

<p>``</p>

<h2 id="1-uzaklık-gidiş-dönüş-süresinde-saklıdır">1. Uzaklık, gidiş-dönüş süresinde saklıdır</h2>

<p>Bir sinyal hedefe gider, yansır ve geri döner. Ölçülen gecikme $t_d$ ise menzil:</p>

\[R=\frac{ct_d}{2}\]

<p>Burada $c$, ışık hızıdır. İkiye bölmemizin nedeni sinyalin yolu iki kez katetmesidir. Örneğin 200 nanosaniyelik gecikme yaklaşık 30 metreye karşılık gelir. Darbeli radarda gecikme, gönderilen dalga biçimiyle alınan sinyalin korelasyonu üzerinden bulunabilir; eşleşmiş filtre, yankıyı gürültü içinde belirginleştirir.</p>

<h2 id="2-fmcw-zaman-farkını-frekansa-çevirmek">2. FMCW: Zaman farkını frekansa çevirmek</h2>

<p>Otomotiv radarlarında yaygın olan FMCW, frekansı zamanla doğrusal değişen bir <strong>chirp</strong> gönderir. Chirp eğimi $S=B/T$ ile tanımlanır; $B$ bant genişliği, $T$ tarama süresidir.</p>

<p>Alınan yankı gönderilen sinyalle karıştırılır. Alçak geçiren filtre sonrasında ortaya çıkan fark, yani beat frekansı, durağan hedef için yaklaşık olarak şöyledir:</p>

\[f_b=St_d,\qquad R=\frac{cf_b}{2S}\]

<p>Analog-sayısal dönüştürücü bu sinyali örnekler. Karmaşık I/Q örnekleri, hem genliği hem fazı korur: genlik yankının gücünü, faz ise ince zaman ve hareket bilgisini taşır.</p>

<h2 id="3-hız-chirpler-arasındaki-faz-değişimidir">3. Hız, chirpler arasındaki faz değişimidir</h2>

<p>Hedef hareket ediyorsa Doppler frekansı oluşur:</p>

\[f_D=\frac{2v_r}{\lambda},\qquad v_r=\frac{\lambda f_D}{2}\]

<p>Buradaki $v_r$, radar doğrultusundaki <strong>radyal hızdır</strong>; cismin toplam hız büyüklüğü değildir. Art arda gönderilen chirplerde aynı menzil hücresinin fazı düzenli değişir. Bu değişime uygulanan Fourier dönüşümü, Doppler frekansını verir. Hızın işareti kullanılan I/Q ve faz konvansiyonuna bağlıdır.</p>

<table>
  <thead>
    <tr>
      <th>İşlenen boyut</th>
      <th>Karşılaştırılan veri</th>
      <th>Elde edilen bilgi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hızlı zaman</td>
      <td>Bir chirp içindeki örnekler</td>
      <td>Beat frekansı ve menzil</td>
    </tr>
    <tr>
      <td>Yavaş zaman</td>
      <td>Ardışık chirpler</td>
      <td>Doppler ve radyal hız</td>
    </tr>
    <tr>
      <td>Anten boyutu</td>
      <td>Farklı alıcıların fazları</td>
      <td>Geliş açısı</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/radarin-matematiksel-gozleri-33.svg" alt="radarin-matematiksel-gozleri-33" /></p>

<h2 id="4-python-ile-küçük-bir-menzildoppler-deneyi">4. Python ile küçük bir menzil–Doppler deneyi</h2>

<p>Aşağıdaki örnek, tek hedefin karmaşık yankısını üretir. Menzil–Doppler bağlaşımı ihmal edilmiştir: gerçek hareketli hedefte, uygun işaret konvansiyonuyla $f_b\simeq 2SR/c+f_D$ olur. Bu sadeleştirme iki boyutlu FFT mantığını görünür kılar.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="n">c</span><span class="p">,</span> <span class="n">fc</span> <span class="o">=</span> <span class="mf">3e8</span><span class="p">,</span> <span class="mf">77e9</span>
<span class="n">lam</span> <span class="o">=</span> <span class="n">c</span> <span class="o">/</span> <span class="n">fc</span>
<span class="n">N</span><span class="p">,</span> <span class="n">M</span> <span class="o">=</span> <span class="mi">256</span><span class="p">,</span> <span class="mi">64</span>
<span class="n">fs</span><span class="p">,</span> <span class="n">Tr</span><span class="p">,</span> <span class="n">B</span> <span class="o">=</span> <span class="mf">4e6</span><span class="p">,</span> <span class="mf">80e-6</span><span class="p">,</span> <span class="mf">1e9</span>
<span class="n">S</span> <span class="o">=</span> <span class="n">B</span> <span class="o">/</span> <span class="p">(</span><span class="n">N</span> <span class="o">/</span> <span class="n">fs</span><span class="p">)</span>
<span class="n">R0</span><span class="p">,</span> <span class="n">v0</span> <span class="o">=</span> <span class="mf">12.0</span><span class="p">,</span> <span class="mf">3.0</span>

<span class="n">fast</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">arange</span><span class="p">(</span><span class="n">N</span><span class="p">)</span> <span class="o">/</span> <span class="n">fs</span>
<span class="n">slow</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">arange</span><span class="p">(</span><span class="n">M</span><span class="p">)</span> <span class="o">*</span> <span class="n">Tr</span>
<span class="n">fb</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">S</span> <span class="o">*</span> <span class="n">R0</span> <span class="o">/</span> <span class="n">c</span>
<span class="n">fd</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">v0</span> <span class="o">/</span> <span class="n">lam</span>
<span class="n">phase</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">pi</span> <span class="o">*</span> <span class="p">(</span>
    <span class="n">fb</span> <span class="o">*</span> <span class="n">fast</span><span class="p">[</span><span class="bp">None</span><span class="p">,</span> <span class="p">:]</span> <span class="o">+</span> <span class="n">fd</span> <span class="o">*</span> <span class="n">slow</span><span class="p">[:,</span> <span class="bp">None</span><span class="p">]</span>
<span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">exp</span><span class="p">(</span><span class="mf">1j</span> <span class="o">*</span> <span class="n">phase</span><span class="p">)</span>
<span class="n">rng</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">default_rng</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="n">x</span> <span class="o">+=</span> <span class="mf">0.2</span> <span class="o">*</span> <span class="p">(</span><span class="n">rng</span><span class="p">.</span><span class="nf">normal</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="n">x</span><span class="p">.</span><span class="n">shape</span><span class="p">)</span>
            <span class="o">+</span> <span class="mf">1j</span> <span class="o">*</span> <span class="n">rng</span><span class="p">.</span><span class="nf">normal</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="n">x</span><span class="p">.</span><span class="n">shape</span><span class="p">))</span>

<span class="n">window</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">hanning</span><span class="p">(</span><span class="n">M</span><span class="p">)[:,</span> <span class="bp">None</span><span class="p">]</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">hanning</span><span class="p">(</span><span class="n">N</span><span class="p">)[</span><span class="bp">None</span><span class="p">,</span> <span class="p">:]</span>
<span class="n">range_fft</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">fft</span><span class="p">.</span><span class="nf">fft</span><span class="p">(</span><span class="n">x</span> <span class="o">*</span> <span class="n">window</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">rd</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">fft</span><span class="p">.</span><span class="nf">fftshift</span><span class="p">(</span>
    <span class="n">np</span><span class="p">.</span><span class="n">fft</span><span class="p">.</span><span class="nf">fft</span><span class="p">(</span><span class="n">range_fft</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">),</span> <span class="n">axes</span><span class="o">=</span><span class="mi">0</span>
<span class="p">)</span>
<span class="n">power</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">abs</span><span class="p">(</span><span class="n">rd</span><span class="p">[:,</span> <span class="p">:</span><span class="n">N</span> <span class="o">//</span> <span class="mi">2</span><span class="p">])</span> <span class="o">**</span> <span class="mi">2</span>
<span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">unravel_index</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">argmax</span><span class="p">(</span><span class="n">power</span><span class="p">),</span> <span class="n">power</span><span class="p">.</span><span class="n">shape</span><span class="p">)</span>
<span class="n">f_range</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">fft</span><span class="p">.</span><span class="nf">fftfreq</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="mi">1</span> <span class="o">/</span> <span class="n">fs</span><span class="p">)[</span><span class="n">j</span><span class="p">]</span>
<span class="n">f_doppler</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">fft</span><span class="p">.</span><span class="nf">fftshift</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">fft</span><span class="p">.</span><span class="nf">fftfreq</span><span class="p">(</span><span class="n">M</span><span class="p">,</span> <span class="n">Tr</span><span class="p">))[</span><span class="n">i</span><span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Menzil:</span><span class="sh">'</span><span class="p">,</span> <span class="n">c</span> <span class="o">*</span> <span class="n">f_range</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">S</span><span class="p">))</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s">Radyal hız:</span><span class="sh">'</span><span class="p">,</span> <span class="n">lam</span> <span class="o">*</span> <span class="n">f_doppler</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span>
</code></pre></div></div>

<p>İlk FFT menzil hücrelerini, ikinci FFT Doppler hücrelerini oluşturur. Hann pencereleri güçlü hedeflerin komşu hücrelere sızmasını azaltır; bunun bedeli ana lobun genişlemesidir. Sonuç yaklaşık 12 metre ve 3 m/s çıkar. Küçük farklar, frekansların ayrık FFT hücrelerine yuvarlanmasından kaynaklanır.</p>

<h2 id="5-en-parlak-hücre-her-zaman-hedef-değildir">5. En parlak hücre her zaman hedef değildir</h2>

<p>Örnekte en güçlü hücreyi seçtik; gerçek sistemlerde bu yaklaşım yetersizdir. Zemin yansımaları, çoklu yollar ve parazitler sahte zirveler üretir. CFAR, çevredeki hücrelerden yerel gürültü seviyesini tahmin ederek uyarlanabilir eşik kurar. Koruma hücreleri, hedef enerjisinin gürültü tahminini şişirmesini önler. Tespitler zaman içinde izlenerek yanlış alarmlar azaltılabilir.</p>

<h2 id="6-menzilden-konuma-ölçümden-sınırlara">6. Menzilden konuma, ölçümden sınırlara</h2>

<p>Menzil tek başına konum değildir: hedef aynı uzaklıktaki birçok noktada bulunabilir. Anten dizisinin faz farklarından azimut açısı $\theta$ kestirilirse, iki boyutta $x=R\cos\theta$ ve $y=R\sin\theta$ hesaplanır. Üç boyutlu konum için yükseliş açısı da gerekir.</p>

<p>Menzil çözünürlüğü yaklaşık $\Delta R=c/(2B)$, hız çözünürlüğü ise $\Delta v=\lambda/(2MT_r)$ olur. Daha geniş bant yakın hedefleri ayırır; daha uzun gözlem küçük hız farklarını seçer. Ancak örnekleme hızı ve chirp aralığı belirsizlik sınırlarını belirler. Radarın marifeti yalnız yankıyı duymak değil, ölçümün nerede güvenilir olduğunu bilmektir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="radar" /><category term="sinyal işleme" /><category term="fmcw" /><category term="fft" /><category term="hedef tespiti" /><category term="python" /><summary type="html"><![CDATA[Radar, karanlıkta çevresine seslenen bir yarasaya benzer; yalnız ses yerine elektromanyetik dalga kullanır. Gönderdiği sinyalin yankısını dinleyerek hedefin uzaklığını ve hareketini çıkarır. Ancak ekrandaki parlak noktanın arkasında sihir değil; zaman gecikmesi, faz değişimi, Fourier dönüşümü ve biraz da gürültüyle mücadele vardır. Gelin ham örneklerden ölçüme uzanan yolu inceleyelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/radarin-matematiksel-gozleri-33.png" /><media:content medium="image" url="https://program.sonsuz.us/img/radarin-matematiksel-gozleri-33.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Robo-Danışmanlar Nasıl Düşünür? Risk Profilinden Otomatik Portföye</title><link href="https://program.sonsuz.us/posts/robo-danismanlar-nasil-dusunur-risk-profilinden-otomatik-portfoye/" rel="alternate" type="text/html" title="Robo-Danışmanlar Nasıl Düşünür? Risk Profilinden Otomatik Portföye" /><published>2026-11-11T00:00:00+00:00</published><updated>2026-11-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/robo-danismanlar-nasil-dusunur-risk-profilinden-otomatik-portfoye</id><content type="html" xml:base="https://program.sonsuz.us/posts/robo-danismanlar-nasil-dusunur-risk-profilinden-otomatik-portfoye/"><![CDATA[<p><img src="/img/robo-danismanlar-nasil-44.svg" alt="robo-danismanlar-nasil-44" /></p>

<p>Bir robo-danışman, paranızı sihirli bir algoritmaya teslim eden dijital kahin değildir. Daha çok, hedeflerinizi ve sınırlarınızı matematiksel bir yatırım problemine çeviren otomatik bir yardımcıdır. Kullanıcı anketiyle başlayan süreç; risk ölçümü, varlık seçimi, optimizasyon ve düzenli kontrol adımlarından geçer. Gelin bu dijital portföy mutfağının tarifini inceleyelim.</p>

<p>``</p>

<h2 id="1-risk-profili-cesaret-tek-başına-yetmez">1. Risk profili: Cesaret tek başına yetmez</h2>

<p>İlk adım, kullanıcının <strong>risk isteğini</strong> ve <strong>risk taşıma kapasitesini</strong> ayrı ayrı değerlendirmektir. Piyasa düşüşünde sakin kalabileceğini söylemek başka, altı ay sonra ihtiyaç duyulacak parayı kayba maruz bırakabilmek başkadır.</p>

<p>Anketler genellikle yatırım süresini, gelir istikrarını, likidite ihtiyacını, finansal deneyimi ve kabul edilebilir kaybı sorgular. Sistem, cevapları bir puana dönüştürür; fakat tutarsız cevapları da kontrol etmelidir. “Kayıp istemiyorum” ile “en yüksek getiriyi istiyorum” aynı sepete sessizce atılamaz!</p>

<table>
  <thead>
    <tr>
      <th>Profil</th>
      <th>Öncelik</th>
      <th>Portföy tasarımına etkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temkinli</td>
      <td>Sermaye dalgalanmasını sınırlamak</td>
      <td>Daha düşük risk hedefi</td>
    </tr>
    <tr>
      <td>Dengeli</td>
      <td>Büyüme ve istikrar</td>
      <td>Çeşitli risk kaynakları</td>
    </tr>
    <tr>
      <td>Atak</td>
      <td>Uzun vadeli büyüme</td>
      <td>Daha yüksek dalgalanma toleransı</td>
    </tr>
  </tbody>
</table>

<p>Bu sınıflar kesin yatırım reçeteleri değildir; kısa vade veya zorunlu nakit ihtiyacı öneriyi değiştirebilir.</p>

<h2 id="2-matematik-getiri-kadar-birlikte-hareket-etmek-de-önemli">2. Matematik: Getiri kadar birlikte hareket etmek de önemli</h2>

<p>Portföy ağırlıklarını $w$, beklenen getirileri $\mu$, kovaryans matrisini $\Sigma$ ile gösterelim. Beklenen portföy getirisi $E[R_p]=w^T\mu$, oynaklığı ise $\sigma_p=\sqrt{w^T\Sigma w}$ olur.</p>

<p>Kovaryans, varlıkların birlikte nasıl hareket ettiğini anlatır. İki varlık aynı anda düşüyorsa, isimlerinin farklı olması güçlü çeşitlendirme sağladıkları anlamına gelmez. Orkestra benzetmesiyle: Her enstrüman aynı notayı çalıyorsa ses artar, çeşitlilik değil.</p>

<p>Ortalama-varyans yaklaşımında yaygın hedef şudur:</p>

\[\max_w\left(w^T\mu-\frac{\lambda}{2}w^T\Sigma w\right)\]

<p>Burada $\lambda$ riskten kaçınma katsayısıdır. Büyük değerler, aynı varsayımlar altında riski daha fazla cezalandırır. Ayrıca $\sum_i w_i=1$ ve $w_i\geq0$ gibi kısıtlar eklenebilir. Böylece bütçe tamamen dağıtılır ve açığa satış yapılmaz.</p>

<h2 id="3-python-ile-küçük-bir-optimizasyon-motoru">3. Python ile küçük bir optimizasyon motoru</h2>

<p>Aşağıdaki örnek, <code class="language-plaintext highlighter-rouge">numpy</code> ve <code class="language-plaintext highlighter-rouge">cvxpy</code> paketlerini kullanır. Hisse, tahvil ve altın için <strong>tamamen örnek amaçlı</strong> yıllık getiri ve kovaryans varsayımları içerir; güncel piyasa tahmini değildir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="n">cvxpy</span> <span class="k">as</span> <span class="n">cp</span>

<span class="n">risk_score</span> <span class="o">=</span> <span class="mi">40</span>
<span class="k">if</span> <span class="ow">not</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">risk_score</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="p">:</span>
    <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">Risk puanı 0–100 arasında olmalı.</span><span class="sh">"</span><span class="p">)</span>

<span class="n">assets</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">hisse</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">tahvil</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">altın</span><span class="sh">"</span><span class="p">]</span>
<span class="n">mu</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">0.07</span><span class="p">,</span> <span class="mf">0.035</span><span class="p">,</span> <span class="mf">0.04</span><span class="p">])</span>
<span class="n">cov</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span>
    <span class="p">[</span><span class="mf">0.0324</span><span class="p">,</span> <span class="mf">0.0018</span><span class="p">,</span> <span class="mf">0.0018</span><span class="p">],</span>
    <span class="p">[</span><span class="mf">0.0018</span><span class="p">,</span> <span class="mf">0.0036</span><span class="p">,</span> <span class="mf">0.0006</span><span class="p">],</span>
    <span class="p">[</span><span class="mf">0.0018</span><span class="p">,</span> <span class="mf">0.0006</span><span class="p">,</span> <span class="mf">0.0225</span><span class="p">]</span>
<span class="p">])</span>
<span class="n">risk_aversion</span> <span class="o">=</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">18</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">risk_score</span> <span class="o">/</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">cp</span><span class="p">.</span><span class="nc">Variable</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>

<span class="n">objective</span> <span class="o">=</span> <span class="n">cp</span><span class="p">.</span><span class="nc">Maximize</span><span class="p">(</span>
    <span class="n">mu</span> <span class="o">@</span> <span class="n">w</span> <span class="o">-</span> <span class="n">risk_aversion</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">cp</span><span class="p">.</span><span class="nf">quad_form</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">cov</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">constraints</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">cp</span><span class="p">.</span><span class="nf">sum</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">,</span>
    <span class="n">w</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">,</span>
    <span class="n">w</span> <span class="o">&lt;=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">0.65</span><span class="p">,</span> <span class="mf">0.80</span><span class="p">,</span> <span class="mf">0.20</span><span class="p">])</span>
<span class="p">]</span>
<span class="n">problem</span> <span class="o">=</span> <span class="n">cp</span><span class="p">.</span><span class="nc">Problem</span><span class="p">(</span><span class="n">objective</span><span class="p">,</span> <span class="n">constraints</span><span class="p">)</span>
<span class="n">problem</span><span class="p">.</span><span class="nf">solve</span><span class="p">()</span>

<span class="k">if</span> <span class="n">problem</span><span class="p">.</span><span class="n">status</span> <span class="o">!=</span> <span class="n">cp</span><span class="p">.</span><span class="n">OPTIMAL</span><span class="p">:</span>
    <span class="k">raise</span> <span class="nc">RuntimeError</span><span class="p">(</span><span class="sh">"</span><span class="s">Güvenilir optimum elde edilemedi.</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">dict</span><span class="p">(</span><span class="nf">zip</span><span class="p">(</span><span class="n">assets</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="nf">round</span><span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">value</span><span class="p">,</span> <span class="mi">4</span><span class="p">))))</span>
</code></pre></div></div>

<p>Kod, risk puanını örnek bir katsayıya çevirir; ardından ağırlıkları üst sınırlar içinde optimize eder. Bu eşleme evrensel değildir: Gerçek platformlarda uygunluk politikasıyla kalibre edilir. Getiri ve kovaryansın aynı zaman ölçeğinde olması da kritiktir. Yıllık getiriyi günlük kovaryansla eşleştirmek, tarifte gram yerine kilogram kullanmaya benzer.</p>

<h2 id="4-optimum-sonuç-neden-son-söz-değildir">4. Optimum sonuç neden son söz değildir?</h2>

<p>Beklenen getiriler gözlemlenmiş gerçekler değil, tahminlerdir. Küçük tahmin değişiklikleri büyük ağırlık değişimleri üretebilir. Bu nedenle platformlar pozisyon sınırları, daha sağlam kovaryans tahminleri, senaryo testleri ve işlem maliyetleri kullanabilir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü tarafı</th>
      <th>Sınırı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sabit dağılım</td>
      <td>Basit ve açıklanabilir</td>
      <td>Koşullara uyumu sınırlı</td>
    </tr>
    <tr>
      <td>Ortalama-varyans</td>
      <td>Getiri-risk dengesini modeller</td>
      <td>Tahmin hatalarına duyarlı</td>
    </tr>
    <tr>
      <td>Senaryo tabanlı model</td>
      <td>Olumsuz durumları sınar</td>
      <td>Senaryo kalitesine bağımlı</td>
    </tr>
  </tbody>
</table>

<p>Oynaklık bütün riskleri kapsamaz. Likidite, kredi, enflasyon ve kur riski ayrıca değerlendirilmelidir. Tarihsel korelasyonların kriz sırasında değişebileceği de unutulmamalıdır.</p>

<h2 id="5-yeniden-dengeleme-otomatik-pilotun-bakımı">5. Yeniden dengeleme: Otomatik pilotun bakımı</h2>

<p>Piyasalar hareket ettikçe ağırlıklar hedeflerden uzaklaşır. Sistem takvimle veya sapma eşiğiyle yeniden dengeleme önerebilir. Ancak her küçük sapmada işlem yapmak; komisyon, alış-satış farkı ve vergi etkileri yüzünden gereksiz maliyet yaratabilir.</p>

<p>Kullanıcının hedefleri değiştiğinde yalnızca portföy değil, risk profili de yenilenmelidir. İyi bir robo-danışman, önerisinin gerekçesini ve belirsizliklerini anlaşılır biçimde gösterir. Algoritmik disiplin faydalıdır; fakat getiri garantisi değildir. Bu örnek eğitim amaçlıdır, kişisel yatırım tavsiyesi değildir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robo-danışmanlık" /><category term="algoritmik-yatırım" /><category term="portföy-optimizasyonu" /><category term="python" /><category term="risk-yönetimi" /><summary type="html"><![CDATA[Bir robo-danışman, paranızı sihirli bir algoritmaya teslim eden dijital kahin değildir. Daha çok, hedeflerinizi ve sınırlarınızı matematiksel bir yatırım problemine çeviren otomatik bir yardımcıdır. Kullanıcı anketiyle başlayan süreç; risk ölçümü, varlık seçimi, optimizasyon ve düzenli kontrol adımlarından geçer. Gelin bu dijital portföy mutfağının tarifini inceleyelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/robo-danismanlar-nasil-44.png" /><media:content medium="image" url="https://program.sonsuz.us/img/robo-danismanlar-nasil-44.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Sanal Sınıfın Görünmez Orkestrası: Video, Sohbet ve Ekran Paylaşımı Nasıl Senkronize Edilir?</title><link href="https://program.sonsuz.us/posts/sanal-sinifin-gorunmez-orkestrasi-video-sohbet-ve-ekran-paylasimi-nasil-senkronize-edilir/" rel="alternate" type="text/html" title="Sanal Sınıfın Görünmez Orkestrası: Video, Sohbet ve Ekran Paylaşımı Nasıl Senkronize Edilir?" /><published>2026-11-11T00:00:00+00:00</published><updated>2026-11-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/sanal-sinifin-gorunmez-orkestrasi-video-sohbet-ve-ekran-paylasimi-nasil-senkronize-edilir</id><content type="html" xml:base="https://program.sonsuz.us/posts/sanal-sinifin-gorunmez-orkestrasi-video-sohbet-ve-ekran-paylasimi-nasil-senkronize-edilir/"><![CDATA[<p>Öğretmen bir problemi anlatırken öğrenciler görüntüyü izler, sohbetten soru sorar ve paylaşılan ekrandaki çözümü takip eder. Her şey tek bir uygulamada gerçekleşse de arka planda farklı iletişim kanalları çalışır. İşin sırrı, bütün verileri aynı borudan geçirmek değil; farklı hızlarda akan bu kanalları ortak bir zaman ve oturum mantığı etrafında buluşturmaktır. Kısacası, sanal sınıf küçük bir dijital orkestradır.</p>

<p>``</p>

<h2 id="aynı-sınıf-farklı-iletişim-yolları">Aynı sınıf, farklı iletişim yolları</h2>

<p>Video ve ses genellikle <strong>WebRTC</strong>, sohbet ve kontrol olayları ise <strong>WebSocket</strong> üzerinden taşınır. WebRTC bağlantısını kurmak için gereken SDP teklifleri, yanıtları ve ICE adayları da bir sinyalleşme kanalıyla paylaşılır. WebRTC bu kanalın protokolünü zorunlu olarak belirlemez.</p>

<p>Buradaki temel ayrım, verinin gecikmeye ve kayba karşı hassasiyetidir. Eski bir video karesini beklemek görüntüyü dondurabilir; sohbet mesajını kaybetmek ise konuşmanın anlamını bozabilir.</p>

<table>
  <thead>
    <tr>
      <th>Veri türü</th>
      <th>Yaygın taşıma yöntemi</th>
      <th>Öncelik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ses ve kamera</td>
      <td>WebRTC medya akışları</td>
      <td>Düşük gecikme, akıcı oynatma</td>
    </tr>
    <tr>
      <td>Ekran paylaşımı</td>
      <td>Ayrı WebRTC video izi</td>
      <td>Okunabilirlik, uygun kare hızı</td>
    </tr>
    <tr>
      <td>Sohbet</td>
      <td>WebSocket</td>
      <td>Güvenilir teslimat, mesaj sırası</td>
    </tr>
    <tr>
      <td>Katılım ve paylaşım olayları</td>
      <td>WebSocket</td>
      <td>Tutarlı oturum durumu</td>
    </tr>
  </tbody>
</table>

<p>WebRTC veri kanalları da sohbet taşıyabilir. Ancak sunucuda geçmiş saklama, moderasyon ve yeniden bağlanma yönetimi için WebSocket sık tercih edilir.</p>

<h2 id="senkronizasyon-neden-yalnızca-zaman-damgası-değildir">Senkronizasyon neden yalnızca zaman damgası değildir?</h2>

<p>Bir medya parçasının kullanıcıya ulaşma süresini yaklaşık şöyle düşünebiliriz:</p>

\[T_{sunum}=T_{yakalama}+d_{ag}+d_{tampon}+d_{cozum}\]

<p>Burada ağ gecikmesi, tamponda bekleme ve çözümleme süresi birlikte etkilidir. Üstelik ağ gecikmesi sabit değildir. Paketlerin geliş aralığındaki değişkenliğe <strong>jitter</strong> denir. Tarayıcıdaki jitter tamponu, biraz bekleyerek bu düzensizliği yumuşatır. Fazla beklemek akıcılığı artırabilir, fakat öğretmenin cevabını geciktirir: mühendisliğin klasik battaniye çekiştirmesi!</p>

<p>Ses ve görüntü, RTP zaman damgalarıyla izlenir. RTCP Sender Report mesajları, RTP saatlerini NTP tabanlı zamanla ilişkilendirerek akışların ortak zaman çizelgesinde eşleştirilmesine yardımcı olur. Dudak senkronizasyonunu uygulamanın JavaScript döngüsü değil, büyük ölçüde tarayıcının medya altyapısı yönetir.</p>

<p>Ekran paylaşımı ayrı bir video izidir. Kamerayla aynı kare hızında çalışması gerekmez. Bir slayt için düşük kare hızı yeterliyken, animasyonlu bir simülasyon daha fazla güncelleme isteyebilir.</p>

<h2 id="sohbeti-medya-zamanına-nasıl-bağlarız">Sohbeti medya zamanına nasıl bağlarız?</h2>

<p>Sohbet mesajına yalnızca istemcinin yerel saatini eklemek yeterli değildir; cihaz saatleri farklı olabilir. İstemci, sunucuyla zaman ölçümleri yaparak saat farkını tahmin edebilir. Dört zaman damgalı bir alışverişte yaklaşık fark:</p>

\[o=((t_2-t_1)+(t_3-t_4))/2\]

<p>Burada $t_1,t_4$ istemciye, $t_2,t_3$ sunucuya aittir. Tahmin, gidiş ve dönüş gecikmelerinin benzer olduğu varsayımına dayanır; kesinlik garantisi değildir.</p>

<p>Sunucu ayrıca mesajlara artan sıra numarası ve benzersiz kimlik verir. Böylece yeniden bağlanmada eksikler tamamlanır, tekrarlar ayıklanır. Medyaya bağlı bir açıklama için oturum zamanı kullanılabilir; ancak farklı izleyicilerin oynatma gecikmeleri değiştiğinden herkesin aynı anda aynı kareyi görmesi garanti edilmez.</p>

<h2 id="ekran-paylaşımını-olaylarla-eşleştirmek">Ekran paylaşımını olaylarla eşleştirmek</h2>

<p>Aşağıdaki örnekte <code class="language-plaintext highlighter-rouge">sender</code>, önceden müzakere edilmiş ayrı ekran paylaşımı göndericisidir. <code class="language-plaintext highlighter-rouge">ws</code> açık bir WebSocket bağlantısıdır; <code class="language-plaintext highlighter-rouge">clock.now()</code> ise tahmini sunucu zamanını döndürür.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="kd">function</span> <span class="nf">ekranPaylas</span><span class="p">(</span><span class="nx">sender</span><span class="p">,</span> <span class="nx">ws</span><span class="p">,</span> <span class="nx">clock</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">stream</span> <span class="o">=</span> <span class="k">await</span> <span class="nb">navigator</span><span class="p">.</span><span class="nx">mediaDevices</span><span class="p">.</span><span class="nf">getDisplayMedia</span><span class="p">({</span>
    <span class="na">video</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
    <span class="na">audio</span><span class="p">:</span> <span class="kc">false</span>
  <span class="p">});</span>
  <span class="kd">const</span> <span class="nx">track</span> <span class="o">=</span> <span class="nx">stream</span><span class="p">.</span><span class="nf">getVideoTracks</span><span class="p">()[</span><span class="mi">0</span><span class="p">];</span>
  <span class="kd">const</span> <span class="nx">shareId</span> <span class="o">=</span> <span class="nx">crypto</span><span class="p">.</span><span class="nf">randomUUID</span><span class="p">();</span>
  <span class="kd">const</span> <span class="nx">bildir</span> <span class="o">=</span> <span class="p">(</span><span class="nx">type</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">ws</span><span class="p">.</span><span class="nf">send</span><span class="p">(</span><span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">({</span>
    <span class="nx">type</span><span class="p">,</span> <span class="nx">shareId</span><span class="p">,</span> <span class="na">timestamp</span><span class="p">:</span> <span class="nx">clock</span><span class="p">.</span><span class="nf">now</span><span class="p">()</span>
  <span class="p">}));</span>

  <span class="k">await</span> <span class="nx">sender</span><span class="p">.</span><span class="nf">replaceTrack</span><span class="p">(</span><span class="nx">track</span><span class="p">);</span>
  <span class="nf">bildir</span><span class="p">(</span><span class="dl">"</span><span class="s2">screen-start</span><span class="dl">"</span><span class="p">);</span>
  <span class="nx">track</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">ended</span><span class="dl">"</span><span class="p">,</span> <span class="k">async </span><span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="k">await</span> <span class="nx">sender</span><span class="p">.</span><span class="nf">replaceTrack</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
    <span class="nf">bildir</span><span class="p">(</span><span class="dl">"</span><span class="s2">screen-stop</span><span class="dl">"</span><span class="p">);</span>
  <span class="p">},</span> <span class="p">{</span> <span class="na">once</span><span class="p">:</span> <span class="kc">true</span> <span class="p">});</span>
  <span class="k">return</span> <span class="nx">stream</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">replaceTrack</code>, kamerayı kaldırmadan ayrılmış göndericiye ekran görüntüsünü bağlar. Paylaşım kimliği, başlangıç ve bitiş olaylarını eşleştirir. Kontrol olayı ilk görüntüden önce ulaşabileceği için alıcı, video hazır olana kadar “Paylaşım yükleniyor” gösterebilir. Üretimde izin reddi, gönderim hataları ve uygulama içindeki durdurma düğmesi de ele alınmalıdır.</p>

<h2 id="kalabalık-sınıfta-orkestrayı-büyütmek">Kalabalık sınıfta orkestrayı büyütmek</h2>

<p>Çok katılımcılı derslerde <strong>SFU</strong>, medya akışlarını alıp uygun alıcılara yönlendirir. Böylece herkesin herkese ayrı yayın göndermesi gerekmez. Simulcast, farklı kalite katmanları sunar; zayıf bağlantıdaki öğrenci daha düşük çözünürlük alabilir. TURN ise doğrudan bağlantının kurulamadığı ağlarda aktarma sağlar.</p>

<p>Başarıyı paket kaybı, RTT, donma süresi ve sohbet teslim süresiyle ölçün. Taşıma şifrelemesini uçtan uca şifrelemeyle karıştırmayın; SFU mimarisinde ek uçtan uca koruma ayrıca tasarlanmalıdır. Son olarak ekran paylaşımı iznini açıkça isteyin. En iyi altyapı, öğrencinin protokolleri değil, dersi fark ettiği altyapıdır.</p>

<p><img src="/img/sanal-sinifin-gorunmez-43.svg" alt="sanal-sinifin-gorunmez-43" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="webrtc" /><category term="websocket" /><category term="gerçek zamanlı iletişim" /><category term="sanal sınıf" /><category term="ekran paylaşımı" /><category term="senkronizasyon" /><summary type="html"><![CDATA[Öğretmen bir problemi anlatırken öğrenciler görüntüyü izler, sohbetten soru sorar ve paylaşılan ekrandaki çözümü takip eder. Her şey tek bir uygulamada gerçekleşse de arka planda farklı iletişim kanalları çalışır. İşin sırrı, bütün verileri aynı borudan geçirmek değil; farklı hızlarda akan bu kanalları ortak bir zaman ve oturum mantığı etrafında buluşturmaktır. Kısacası, sanal sınıf küçük bir dijital orkestradır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/sanal-sinifin-gorunmez-43.png" /><media:content medium="image" url="https://program.sonsuz.us/img/sanal-sinifin-gorunmez-43.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Soluk Mürekkebin Peşinde: Tarihi Metinleri Görüntü İşlemeyle Yeniden Okumak</title><link href="https://program.sonsuz.us/posts/soluk-murekkebin-pesinde-tarihi-metinleri-goruntu-islemeyle-yeniden-okumak/" rel="alternate" type="text/html" title="Soluk Mürekkebin Peşinde: Tarihi Metinleri Görüntü İşlemeyle Yeniden Okumak" /><published>2026-11-11T00:00:00+00:00</published><updated>2026-11-11T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/soluk-murekkebin-pesinde-tarihi-metinleri-goruntu-islemeyle-yeniden-okumak</id><content type="html" xml:base="https://program.sonsuz.us/posts/soluk-murekkebin-pesinde-tarihi-metinleri-goruntu-islemeyle-yeniden-okumak/"><![CDATA[<p>Bir Osmanlı mektubunda kaybolan kelimeler veya eski bir defterde silikleşen hesaplar… Zaman, mürekkebe pek nazik davranmıyor. Neyse ki görüntü işleme, kâğıda dokunmadan bazı izleri görünür kılabiliyor. Buradaki amaç geçmişi yeniden yazmak değil; görüntüde hâlâ bulunan zayıf bilgiyi dikkatle ortaya çıkarmak. Dijital büyüteç hazırsa, arşivin sessiz dedektifliğine başlayalım.</p>

<p>``</p>

<h2 id="önce-fizik-yazı-neden-kaybolur">Önce fizik: Yazı neden kaybolur?</h2>

<p>Mürekkep zamanla kimyasal değişime uğrayabilir; kâğıt sararabilir, lekelenebilir veya arka yüzdeki yazıyı gösterebilir. Böylece harflerle zemin arasındaki fark küçülür. Ancak düşük kontrast, mutlaka bilginin tamamen yok olduğu anlamına gelmez.</p>

<p>Basitleştirilmiş bir görüntü modeli şöyledir:</p>

\[I(x,y)=L(x,y)R(x,y)+n(x,y)\]

<p>Burada $I$ kaydedilen görüntü, $L$ aydınlatma, $R$ yüzeyin yansıtma özelliği, $n$ ise gürültüdür. Restorasyon sırasında düzensiz aydınlatmayı azaltıp mürekkebin oluşturduğu farkı belirginleştirmeye çalışırız. Fakat sinyal bütünüyle kaybolmuşsa, kontrast artırmak gerçek harfleri geri getiremez.</p>

<table>
  <thead>
    <tr>
      <th>Sorun</th>
      <th>Görüntüdeki belirti</th>
      <th>Uygun başlangıç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Soluk mürekkep</td>
      <td>Zayıf yerel kontrast</td>
      <td>Yerel kontrast artırma</td>
    </tr>
    <tr>
      <td>Düzensiz ışık</td>
      <td>Gölgeli bölgeler</td>
      <td>Aydınlatma düzeltme</td>
    </tr>
    <tr>
      <td>Kâğıt lekeleri</td>
      <td>Yazıyla karışan desenler</td>
      <td>Renk ve doku analizi</td>
    </tr>
    <tr>
      <td>Arkadan geçen yazı</td>
      <td>Üst üste çizgiler</td>
      <td>Ön-arka yüz karşılaştırması</td>
    </tr>
  </tbody>
</table>

<h2 id="i̇yi-restorasyon-iyi-çekimle-başlar">İyi restorasyon, iyi çekimle başlar</h2>

<p>Yüksek çözünürlük, dengeli ışık ve doğru odak çoğu filtreden değerlidir. Ölçek ve renk hedefi kullanmak, çekimleri karşılaştırmayı kolaylaştırır. Ana dosyayı mümkünse kayıpsız ve yüksek bit derinlikli saklayın; işlemleri kopyalarda yürütün. Belgeyi düzleştirmek veya daha güçlü ışıkla aydınlatmak gibi fiziksel müdahaleler ise konservasyon uzmanının değerlendirmesini gerektirir.</p>

<h2 id="opencv-ile-kontrollü-bir-başlangıç">OpenCV ile kontrollü bir başlangıç</h2>

<p>Aşağıdaki Python örneği, koyu mürekkebin açık zeminde bulunduğu bir çalışma kopyasına yöneliktir. Büyük ölçekli arka planı tahmin eder, aydınlatmayı dengeler ve iki çıktı üretir: tonlu görüntü ile okuma maskesi.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">cv2</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="n">gray</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">imread</span><span class="p">(</span><span class="sh">"</span><span class="s">belge.png</span><span class="sh">"</span><span class="p">,</span> <span class="n">cv2</span><span class="p">.</span><span class="n">IMREAD_GRAYSCALE</span><span class="p">)</span>
<span class="k">if</span> <span class="n">gray</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
    <span class="k">raise</span> <span class="nc">FileNotFoundError</span><span class="p">(</span><span class="sh">"</span><span class="s">belge.png okunamadi</span><span class="sh">"</span><span class="p">)</span>

<span class="n">background</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nc">GaussianBlur</span><span class="p">(</span><span class="n">gray</span><span class="p">,</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">sigmaX</span><span class="o">=</span><span class="mi">25</span><span class="p">)</span>
<span class="n">ratio</span> <span class="o">=</span> <span class="n">gray</span><span class="p">.</span><span class="nf">astype</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">float32</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span>
    <span class="n">background</span><span class="p">.</span><span class="nf">astype</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">float32</span><span class="p">)</span> <span class="o">+</span> <span class="mf">1.0</span>
<span class="p">)</span>
<span class="n">normalized</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">clip</span><span class="p">(</span><span class="mi">255</span> <span class="o">*</span> <span class="n">ratio</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">).</span><span class="nf">astype</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">uint8</span><span class="p">)</span>

<span class="n">clahe</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">createCLAHE</span><span class="p">(</span>
    <span class="n">clipLimit</span><span class="o">=</span><span class="mf">2.0</span><span class="p">,</span> <span class="n">tileGridSize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span><span class="p">)</span>
<span class="p">)</span>
<span class="n">enhanced</span> <span class="o">=</span> <span class="n">clahe</span><span class="p">.</span><span class="nf">apply</span><span class="p">(</span><span class="n">normalized</span><span class="p">)</span>
<span class="n">mask</span> <span class="o">=</span> <span class="n">cv2</span><span class="p">.</span><span class="nf">adaptiveThreshold</span><span class="p">(</span>
    <span class="n">enhanced</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="n">cv2</span><span class="p">.</span><span class="n">ADAPTIVE_THRESH_GAUSSIAN_C</span><span class="p">,</span>
    <span class="n">cv2</span><span class="p">.</span><span class="n">THRESH_BINARY</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">10</span>
<span class="p">)</span>

<span class="n">cv2</span><span class="p">.</span><span class="nf">imwrite</span><span class="p">(</span><span class="sh">"</span><span class="s">ton_restorasyonu.png</span><span class="sh">"</span><span class="p">,</span> <span class="n">enhanced</span><span class="p">)</span>
<span class="n">cv2</span><span class="p">.</span><span class="nf">imwrite</span><span class="p">(</span><span class="sh">"</span><span class="s">okuma_maskesi.png</span><span class="sh">"</span><span class="p">,</span> <span class="n">mask</span><span class="p">)</span>
</code></pre></div></div>

<p>Arka plana bölme işlemi yaklaşık olarak $I_{duz}=255I/(B+\varepsilon)$ yaklaşımını kullanır. $B$ yumuşatılmış arka plan, $\varepsilon$ sıfıra bölünmeyi önleyen küçük terimdir. Bulanıklaştırma ölçeği, harf çizgilerinden belirgin biçimde büyük olmalıdır; aksi hâlde yazıyı da arka plan sanabiliriz.</p>

<p>CLAHE, kontrastı küçük bölgelerde düzenler; sınırlama parametresi aşırı yükseltmeyi frenler. Yine de gürültü ve lekeler belirginleşebilir. Uyarlamalı eşikleme ise her bölge için ayrı karar vererek siyah-beyaz maske üretir. Bu maske ince çizgileri kaybedebilir; bu yüzden tonlu çıktının yerine değil, yanında değerlendirilmelidir.</p>

<p>Buradaki sayılar evrensel reçete değildir. Çözünürlük, harf kalınlığı ve leke boyutu değiştikçe bulanıklaştırma, eşik penceresi ve kontrast sınırı yeniden ayarlanmalıdır. Tek tıklamalı mucize filtresi, ne yazık ki henüz arşive uğramadı.</p>

<h2 id="tek-fotoğraf-yetmezse-çok-bantlı-görüntüleme">Tek fotoğraf yetmezse: Çok bantlı görüntüleme</h2>

<p>Görünür ışıkta benzer duran mürekkep ve kâğıt, farklı dalga boylarında farklı tepkiler verebilir. Çok bantlı çekim, bu ayrımı araştırır. Yakın kızılötesi bazı belgelerde yazıyı ayırırken, başka mürekkeplerde kontrastı azaltabilir. Ultraviyole kaynaklı floresans da uygun koşullarda farklılıkları gösterebilir; sonuç malzemeye bağlıdır.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Kazandırdığı bilgi</th>
      <th>Temel sınır</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>RGB fotoğraf</td>
      <td>Renk ve parlaklık</td>
      <td>Sınırlı spektral ayrım</td>
    </tr>
    <tr>
      <td>Çok bantlı çekim</td>
      <td>Dalga boyuna bağlı farklar</td>
      <td>Ekipman ve kalibrasyon</td>
    </tr>
    <tr>
      <td>OCR</td>
      <td>Makinece okunabilir metin</td>
      <td>Silik yazıda hata riski</td>
    </tr>
  </tbody>
</table>

<p>Bantlar önce geometrik olarak hizalanmalıdır. Ardından bant oranları veya temel bileşen analizi denenebilir. Yanlış hizalama, gerçekte olmayan kenarlar üretir; daha renkli görüntü her zaman daha doğru görüntü değildir.</p>

<h2 id="son-kontrol-görünürlük-mü-uydurma-mı">Son kontrol: Görünürlük mü, uydurma mı?</h2>

<p>Başarıyı yalnızca görüntünün güzelliğiyle ölçmeyin. Aynı bölgeleri orijinalle karşılaştırın; ince çizgilerin korunup korunmadığını ve lekelerin harfe dönüşüp dönüşmediğini inceleyin. Okuma doğruluğunu uzman değerlendirmesiyle sınayın. OCR sonuçlarını doğrulanmış metin kabul etmeyin.</p>

<p>Üretken yapay zekâ eksik harfleri inandırıcı biçimde tamamlayabilir; fakat bu, tarihsel kanıt değildir. Tahminleri açıkça işaretleyin, kullanılan parametreleri kaydedin ve özgün dosyayı koruyun. İyi dijital restorasyon geçmiş adına konuşmaz; geçmişin kalan sesini daha anlaşılır hâle getirir.</p>

<p><img src="/img/soluk-murekkebin-pesinde-75.svg" alt="soluk-murekkebin-pesinde-75" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="görüntü işleme" /><category term="dijital restorasyon" /><category term="opencv" /><category term="tarihi belgeler" /><category term="çok bantlı görüntüleme" /><summary type="html"><![CDATA[Bir Osmanlı mektubunda kaybolan kelimeler veya eski bir defterde silikleşen hesaplar… Zaman, mürekkebe pek nazik davranmıyor. Neyse ki görüntü işleme, kâğıda dokunmadan bazı izleri görünür kılabiliyor. Buradaki amaç geçmişi yeniden yazmak değil; görüntüde hâlâ bulunan zayıf bilgiyi dikkatle ortaya çıkarmak. Dijital büyüteç hazırsa, arşivin sessiz dedektifliğine başlayalım.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/soluk-murekkebin-pesinde-75.png" /><media:content medium="image" url="https://program.sonsuz.us/img/soluk-murekkebin-pesinde-75.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>