
Python Kullanarak Excel’de Gerçek Zamanlı Hisse Senedi Fiyatları
Giriş
Güncel bilgilere erişmek, finansal piyasalarda işlem yaparken ihtiyacınız olan en önemli şeylerden biridir. Someka’nın Excel Hisse Senedi Fiyat Hesaplama Şablonu ile işlem yaptığınız gerçek zamanlı hisse senedi fiyatlarını takip edebilir ve portföyünüzün performansını izleyebilirsiniz.
Ya daha ileri gitmek isterseniz?
Tüccarlar, alım ve satım için doğru zamanı seçmek için gerçek zamanlı hisse senedi fiyatlarını kullanır ve bu gerçek zamanlı verilere doğrudan Excel’den erişilebilir.
Hisse senedi fiyatlarını yenilemek için bir düğmeye tıklamak zorunda kalmak yerine, bu blog size biraz Python kodu ile gerçek zamanlı verileri doğrudan Excel’e nasıl aktarabileceğinizi gösterecek.
Python, finans sektöründe büyük bir takipçi kitlesi edinmiş bir programlama dilidir. Kendi alım satım kararlarınızı daha veri odaklı veya algoritmik hale getirmenin bir yolunu arıyorsanız, Excel’e ek olarak biraz Python öğrenmek için zaman ayırmaya değer olacaktır.
Python mu Excel mi? İkisini birlikte kullanın!
Pek çok insan Excel yerine Python kullanmaktan bahsediyor. Python harika bir programlama dilidir, ama bir elektronik tablonun yerini tutmaz! Excel hemen hemen her sektörde son derece güçlü bir araçtır ve bunun iyi bir nedeni vardır.
Bazı görevler için, özellikle de basit hesaplamalardan daha fazlasını gerektirenler için Python daha iyi bir seçim olabilir. Python, aklınıza gelebilecek hemen hemen her tür hesaplama için muazzam bir paket ekosistemine sahiptir. Her şeyi Excel’de yapmak mümkün olsa da, biraz Python öğrendikten sonra bazı şeylerin Python’da daha kolay olduğunu göreceksiniz!
Neyse ki, biri ya da diğeri arasında seçim yapmanıza gerek yok. Python fonksiyonları PyXLL, Python Excel Add-In kullanılarak Excel’den çağrılabilir. Excel’i ön uç (veya kullanıcı arayüzü) olarak kullanarak Excel ve Python’u birleştirmek ve Python’un daha karmaşık görevleri yerine getirmesini sağlamak mükemmel bir eşleşmedir.
Gerçek Zamanlı Hisse Senedi Fiyatlarını Almak için Python Kullanımı
Aşağıda Python hakkında biraz bilgi sahibi olduğunuz varsayılmaktadır. Python’a henüz aşina değilseniz, şu anda hepsini tam olarak anlamadıysanız endişelenmeyin. Yine de takip edebilirsiniz, ancak Python ile başlamanıza yardımcı olacak bazı sayfalar için kaynaklar bölümüne bir göz atmak isteyebilirsiniz.
Hisse senedi fiyat verisi kaynağımız için iextrading.com adresini kullanacağız. IEX’in gerçek zamanlı güncellemeleri almak için kullanacağımız bir Socket.IO API’si var. Socket.IO, gerçek zamanlı web uygulamaları için bir kütüphanedir ve Python kullanarak IEX’in Socket.IO API’sine erişebiliriz.
Yapılacak ilk şey, IEX ile konuşabilmemiz için Python Socket.IO paketini yüklemektir. Python paket yöneticisi Pip’i kullanarak bir komut isteminden yüklüyoruz:
pip install python-socketio
Şimdi bir Python dosyasında socketio‘yu içe aktarabilir ve IEX sunucusuna bağlanabiliriz.
Hisse senedi fiyat güncellemelerini almak için, istemcinin belirli olaylara yanıt olarak çağıracağı bazı geri arama işlevleri eklememiz gerekir.
import socketio endpoint = "https://ws-api.iextrading.com/1.0/tops" symbols = [ "AAPL", "MSFT", "SNAP" ] @client.on("connect", namespace=namespace) async def on_connect(): for symbol in symbols: await client.emit("subscribe", symbol, namespace=namespace) print(f "Subscribed to '{symbol}'")
İlk olarak, istemci sunucuya bağlandığında, bazı hisse senedi sembollerine (genellikle ticker olarak adlandırılır) abone olmak için bazı komutlar göndeririz.
on_connect geri çağrısı, istemci bağlandıktan sonra çağrılacaktır. Her sembole abone olundukça Python’un çıktısına bir mesaj yazdırılır.
Bir hisse senedi fiyatı güncellendiğinde başka bir callback’in verileri alması gerekecektir. Bazı veriler hazır olduğunda, IEX socket.io API, JSON dizesi olarak kodlanmış verilerle bir mesaj geri çağrısı çağırır. Bu JSON dizesini bir Python sözlük nesnesine okumak ve yazdırmak için json Python paketini kullanırız.
import json
@client.on #0000b2;">@client.on("mesaj", namespace=namespace)
def on_message(message):
veri = json.loads(mesaj)
print(data)
Yukarıdaki kodun Python’un async ve await anahtar kelimelerini kullandığını fark etmiş olabilirsiniz. Python 3.5 bunları içerir ve genellikle asenkron programlama için kullanabilirsiniz. Bu, uzak bir web sunucusuna yapılan bir isteğin geri dönmesini beklemek gibi, tüm programın bir işlemin tamamlanmasını beklemek zorunda kalmasını istemediğimiz yerdir. Bunun yerine, Python her bir işlevi zamanlamak için bir olay döngüsü kullanır ve bir işlevin beklemesi gerektiğinde, Python bu işlevi askıya alır ve devam etmeye hazır olan başka herhangi bir şeyle devam eder.
Bu kodu tamamlamak için Python asyncio olay döngüsünü almalı, daha önce oluşturulan istemciyi oluşturmak için görevi zamanlamalı ve olay döngüsünü başlatmalıyız.
import asyncio
loop = asyncio.get_event_loop()
loop.create_task(task)
loop.run_forever()
Bu kodu çalıştırdığımızda, üretilen çıktı aşağıdaki gibi görünür. Hisse senedi fiyatları gerçek zamanlı olarak değiştikçe güncellenmeye devam eder.
'AAPL' abonesi oldum
'MSFT' abonesi
'SNAP' abonesi
{'symbol': 'AAPL', 'sector': 'technologyhardwareequipment', 'securityType': 'commonstock', 'bidPrice': 181.1, 'bidSize': 100, 'askPrice': 182.03, 'askSize': 100, 'lastUpdated': 1552491513626, 'lastSalePrice': 182.04, 'lastSaleSize': 100, 'lastSaleTime': 1552491513046, 'volume': 355975, 'marketPercent': 0.02927, 'seq': 84605}
Python’dan Excel’e Veri Akışı
Bir önceki bölümde Socket.IO API kullanarak IEX’ten gerçek zamanlı hisse senedi fiyatlarını nasıl alacağımızı öğrendik. Bu bölümde, bunu gerçek zamanlı olarak güncellenen bir elektronik tablo yapmak için nasıl kullanacağımızı göreceğiz.
Python kodumuzu Excel’den çağırmak için PyXLL eklentisini kullanıyoruz. PyXLL eklentisinin ücretsiz deneme sürümünü https://www.pyxll.com/download.html adresinden indirebilirsiniz.
- PyXLL eklentisini indirdikten sonra, yüklemek için talimatları izleyin. Yapılandırma dosyasında, pyxll.cfg, pythonpath ve modules yazan bir seçenek olduğunu göreceksiniz. Pythonpath, Python’un listelenen Python modüllerini yüklerken bakacağı klasörlerin bir listesidir. Bir Python modülü, dosya adı “.py” ile biten Python kodu içeren bir metin dosyasıdır.
- Yeni bir Python modülü (“.py” ile biten bir metin dosyası) oluşturarak başlayın ve bunu bir yere kaydedin (örneğin C:/Projects/ExcelStockPrices/iex.py). Dosyayı kaydettiğiniz klasörü pyxll.cfg dosyasındaki pythonpath listesine ekleyin (örn. C:/Projects/ExcelStockPrices) ve modül adını modüller listesine ekleyin (örn. iex). Modül adının “.py” dosya uzantısını içermediğine dikkat edin.
- Excel başlatıldığında veya PyXLL eklentisi yeniden yüklendiğinde, bu yeni modül “iex” yüklenecektir.
- Sonra, Excel’den çağırabileceğiniz Python’da bir işlev yazacağız. Bu, PyXLL’den @xl_func dekoratörü kullanılarak yapılır. Fonksiyonumuz sadece tek bir değer değil, gerçek zamanlı veri döndüreceğinden, RTD nesnesi adı verilen özel bir nesne türü döndürüyoruz. Python’da, PyXLL RTD sınıfından türeyen yeni bir sınıf oluşturacağız.
from pyxll import xl_func, RTD class IEXClient(RTD): def: #000080;">def __init__(self, symbols): super(): #000080;">super().__init__(self, value=Yok) self.symbols = symbols @xl_func #0000b2;">@xl_func("str[] symbols: rtd<object>") def iex(symbols): return IEXClient(symbols)
iex işlevi bir dizeler listesi alır ve bir RTD nesnesi döndürür. Yukarıda @xl_func öğesine aktarılan dize, işlev imzasıdır. PyXLL, Excel’den Python’a aktarılan değerlerin nasıl dönüştürüleceğini ve Python dönüş değerinin Excel’e nasıl dönüştürüleceğini belirlemek için bunu kullanır. Bu imza, sembollerin bir karakter dizisi listesi olduğunu ve fonksiyonun değeri bir Python nesnesi olan bir RTD nesnesi döndüreceğini söylüyor. RTD nesnesinin değeri Excel’de görünecek olan değerdir.
iex fonksiyonu bir sembol listesi ile çağrıldığında, Excel’deki sonuç Python nesnesi “None” için bir tanıtıcıdır. Fonksiyonun dönüş tipi için başka bir tip belirtmiş olsaydık (örneğin “rtd”), Excel’e Python nesnesine bir tanıtıcı yerine başka tipler döndürebilirdik.
RTD nesnelerinin iki yöntemi vardır: connect ve disconnect. Bunlar, sırasıyla Excel değerleri almaya hazır olduğunda ve Excel artık bunlara ihtiyaç duymadığında çağrılır. Örneğin, kullanıcı formülü girdiğinde connect çağrılır ve kullanıcı formülü temizlediğinde disconnect çağrılır.
RTD nesnesinden Excel’e yeni bir değer göndermek için tek yapmanız gereken RTD nesnesindeki value özelliğini ayarlamaktır.
Önceki bölümde yazılan kodu alıp IEXClient sınıfına ekleyebiliriz. Bunu connect metoduna ekleyeceğiz, böylece Excel RTD nesnemize bağlandığında bir Socket.IO istemcisi kullanarak IEX sunucusuna bağlanacağız.
Verileri basitçe yazdırmak yerine, daha sonra geri alabilmek için bir Python sözlüğünde saklayacağız.
class IEXClient(RTD): endpoint = "https://ws-api.iextrading.com/1.0/tops" namespace = "/1.0/tops" #000080;"> def __init__(self, symbols): super().__init__(value={}) self.symbols = symbols self.client = socketio.AsyncClient() self.data = {} async def connect(self): """AsyncClient'a bağlanın ve güncellemelere abone olun.""" @self.client.on("connect", namespace=self.namespace) async def on_connect(): için sembolü #000080;">for symbol in #000080;">in self.symbols: await self.client.emit("subscribe", sembolü, namespace=self.namespace) @self.client.on("mesaj", namespace=self.namespace) def on_message(message): en son = json.loads(mesaj) symbol = latest["sembol"] previous = self.data.setdefault(symbol, {}) previous.update(latest) # Excel'e bir güncelleme olduğunu bildir self.value = self.data #000080;"> await self.client.connect(self.endpoint, namespaces=[self.namespace]) async #000080;">async def disconnect(self): bekle: #000080;">await self.client.disconnect()
Connect ve disconnect yöntemlerinin async olarak işaretlendiğine dikkat edin. PyXLL async metotlarını anlar ve bizim için Python olay döngüsünde zamanlayacaktır.
Şimdi PyXLL eklentisini yeniden yüklediğimizde ve işlev tekrar çağrıldığında sonuç bir Python sözlüğüne giden bir tanıtıcıdır. Fiyatlar girildikçe sözlük güncellenir ve Excel’de gösterilen değer güncellenir.
Tek başına bu çok kullanışlı değil! Python sözlüğünden değerleri sayfamıza almak için bir yola ihtiyacımız var. Bu, sözlüğü, sembolü ve anahtarı alan ve değeri döndüren başka bir fonksiyon yazmak kadar basittir. Fonksiyonun imzası, ilk parametrenin bir Python nesnesi olduğunu, ardından sembol ve anahtarın dizeler olarak geldiğini ve değişken türünde bir değer döndürdüğünü söyler (yani, bir dize, sayı veya başka bir tür olabilir).
@xl_func("object data, str symbols, str key: var") def iex_unpack(data, symbol, key): # sembol için değerleri al values = data.get(symbol, Yok) if not değerleri: dönüş #000080;">return : #008080;">"#NoData" # belirtilen anahtar için değeri döndür return values.get(key, "#NoData")
Bu fonksiyon iex_unpack ilk argüman olarak sözlük tanıtıcısı, sembol ve anahtarla çağrılır ve sözlükteki değeri döndürür. Yeni değerler girildikçe ve sözlük güncellendikçe, bu değerler de güncellenir.
Gerçek Zamanlı Hisse Senedi Fiyatlarıyla Portföy Hesaplamaları
Artık Someka Hisse Senedi Takibi Şablonu‘na gerçek zamanlı fiyatlandırma eklemek için ihtiyacımız olan her şeye sahibiz! Şablonu kullanarak kendi sayfanızı oluşturmak isteyebilirsiniz. Sayfayı aşağıda yaptığım gibi güncellerseniz, “Verileri Güncelle” düğmesine bastığınızda değiştirilen hücrelerin üzerine yazılacaktır.
IEX’in REST API’sinden gerçek zamanlı hisse senedi fiyat teklifine dahil olmayan diğer verileri getirebilirsiniz. Aşağıdaki kod, Python paketi aiohttp kullanılarak tek bir değerin nasıl getirileceğini göstermektedir.
from pyxll import xl_func import aiohttp endpoint = "https://api.iextrading.com/1.0/" @xl_func async def iex_fetch(symbol, key): """iextrading.com"""dan bir sembol için bir değer döndürür url = endpoint + f "stock/{symbol}/batch?types=quote" async #000080;">async with aiohttp.ClientSession() as session: async with session.get(url) as response: assert response.status == 200: #0000ff;">200 data = bekle response.read() veri = json.loads(veri)["quote"] return #000080;"> return data.get(key, "#NoData": #008080;">"#NoData")
Yukarıdaki fonksiyon asenkron bir fonksiyondur. Bu, onu birden çok kez çağırabileceğiniz ve IEX REST uç noktasına yapılan her isteğin eşzamanlı olarak çalışabileceği ve çalışma sayfasının yanıt verme hızını büyük ölçüde artırabileceği anlamına gelir.
Bir hisse senedinin açık fiyatını almak için, yukarıdaki işlevi Excel’de aşağıdaki gibi çağırırsınız.
=iex_fetch("AAPL", "open")
IEX API hakkında daha fazla bilgi web sitelerinde bulunabilir https://iextrading.com/developer/docs/.