Python ve Finans – Elektronik Tablolarınızı Güçlendirin
Yayınlanan: 2022-03-11Yönetici Özeti
Python neden finans profesyonellerinin öğrenmesi için harika bir programlama dilidir?
- Python, yüksek seviyeli bir programlama dilidir, yani diğer dillerde açıkça ele alınması gereken bellek yönetimi gibi programlamanın birçok teknik yönünü soyutlar ve ele alır. Bu, Python'un teknik geçmişi olmayanlar için kullanımını kolaylaştırır.
- Dil, okunabilirlik ve kullanım kolaylığı göz önünde bulundurularak tasarlandığından, öğrenilmesi en kolay dillerden biridir. Python kodu özlüdür ve sade İngilizceye yakındır.
- Python, prototip oluşturma ve hızlı, yinelemeli geliştirme için idealdir. Etkileşimli yorumlayıcı araçları, her bir kod satırını ayrı ayrı yazıp yürütebileceğiniz ve sonuçları anında görebileceğiniz ortamlar sağlar.
- Aynı zamanda, Python sağlam ve performanslıdır, bu da onu çekirdek sistemler ve daha büyük uygulamalar için uygun bir seçim haline getirir.
- Python, kullanışlı araçlardan oluşan geniş standart kitaplığına ek olarak, bu öğreticide kullanılan Pandalar ve NumPy kitaplıkları gibi finansal analiz ve bilgi işlem için harika üçüncü taraf kitaplıklarına sahiptir.
Python ve finansı birlikte uygulamak için bazı kullanım durumları nelerdir?
- Python komut dosyaları, tekrarlayan görevleri ve iş akışlarını otomatikleştirmek, zamandan tasarruf etmek ve manuel hata riskini azaltmak için kullanılabilir.
- Komut dosyaları, kullanıcıların elektronik tablolardan, veritabanlarından ve API'lerden kolayca veri çekmesine ve hatta daha sonra güçlü istatistiksel ve analitik araçlar kullanılarak işlenip analiz edilebilecek web verilerini sıyırmasına olanak tanır.
- Excel için çeşitli eklentiler, kullanıcıların elektronik tablolarınız ve Python kodunuz arasında gerçek zamanlı iki yönlü bağlantılar oluşturmasına olanak tanır.
- Python, standart elektronik tablolarda kolayca bulunmayan Monte Carlo simülasyonları gibi yeni analiz türlerini mümkün kılar.
- Algoritmik ticaret, artık hedge fonlarının ve büyük yatırım bankalarının münhasır alanı değildir. Python ile kısa sürede ve düşük maliyetle kendi ticaret stratejilerinizi geliştirebilir, geriye dönük test edebilir ve devreye alabilirsiniz.
Uzun süredir elektronik tablolar üzerinden trol yapmaya dayanan meslekler için Python özellikle değerlidir. Bir Amerikan bankası olan Citigroup, stajyer analistleri için Python'da bir hızlandırılmış kurs başlattı. - Ekonomist
Finans uzmanları, özel işlevler oluşturmak ve iş akışlarını otomatikleştirmek için Excel'de VBA'ya (Uygulamalar için Visual Basic) uzun süredir erişebiliyor. Google E-Tablolar'ın son yıllarda elektronik tablo alanında ciddi bir rakip olarak ortaya çıkmasıyla birlikte, Google Apps Komut Dosyası artık ek bir seçenek sunuyor.
Ancak, üçüncü bir seçeneğe, birçok alanda son derece popüler hale gelen Python programlama diline dikkat çekmek istiyorum.
Bu yazıda, dilin kendisine genel bir bakışla başlayarak Python ile neler başarabileceğinize ve web geliştirme, makine öğrenimi, finans gibi çok çeşitli alanlarda neden bu kadar popüler hale geldiğine dair bazı örnekler sunacağım. bilim ve eğitim, sadece birkaç isim. İkinci yarı daha sonra adım adım bir eğitimden oluşacaktır.
Bunu yazmamın amacı, Python'un finansal araç kutunuza eklemeyi düşünmeniz için yeterince ilgi çekici görünüp görünmediğine karar vermenize yardımcı olmaktır. Sıçrayış yaparsanız, dili öğrenmek için birçok uygulama, kurs, video, makale, kitap ve blog yazısı vardır. Parçanın sonunda, yol boyunca bana yardımcı olan bazı kaynakları listeledim.
Kullanım Örnekleri: Python'u Ne İçin Kullandığıma İlişkin Örnekler
Programlamaya giriş, 1980'lerin ortalarında bir Oric 1'de BASIC öğrenmekti. O zamanlar BASIC en yaygın başlangıç diliydi. 80'lerin sonunda 90'ların ortalarına kadar uğraştığım diğer diller Pascal ve C'ydi, ancak bunları hiçbir zaman profesyonel anlamda kullanmadım ve programlama becerilerine ihtiyaç duymayı veya kullanmayı beklemiyordum. Bildiğim kadarıyla, 1990'ların sonlarında finans alanında kariyer yapmaya karar verdiğimde finans ve programlama çok farklı alanlardı.
2012'ye hızlı bir şekilde ilerleyin ve bir hobi olarak programlamayı geri almak istiyordum, bu yüzden o sırada mevcut olan dilleri araştırmaya başladım. Oldukça fazla şey olduğu ortaya çıktı ve Python ile karşılaştığımda, bir sonraki bölümde ana hatlarıyla anlatacağım birçok nedenden dolayı bağımlıydım. O zamandan beri Python'u hem kişisel hem de profesyonel olarak küçük komut dosyalarından daha büyük projelere kadar çok çeşitli görevler için kullandım. Hepsi olmasa da birçoğu, pek çok finans uzmanının çalışma masası olan elektronik tabloları içeriyor.
Elektronik tabloların ve Python'un birlikte ne kadar iyi gidebileceğine dair birkaç örnek:
1. Bir Birleşme ve Satın Alma Entegrasyonu PMO Kurulumunda Zaman İçinde Yüzlerce Etkinliği İzleme
Birleşme ve satın alma işlemlerinin tüm yönleriyle çalışıyorum, sadece yürütme değil, aynı zamanda entegrasyon. Yakın tarihli bir durumda, PMO ekibi, devam eden yüzlerce aktiviteyi izlemek için bir Kanban panosuna ek olarak, on iki entegrasyon iş akışının her biri için üst düzey planlar için şelale planlama ve Gantt çizelgelerini kullanarak hibrit bir program ve proje yönetimi yaklaşımına karar verdi. herhangi bir zamanda, ilk 100 günlük planda ve sonrasında. Seçilen Kanban aracı MeisterTask, bir dizi istatistiksel ve raporlama özelliğine sahiptir, ancak ihtiyaçlarımız, özel bir çözüm gerektiren analiz ve sunum açısından bunun ötesine geçti. Python kullanarak otomatikleştirdiğim iş akışı bu:
- Tüm panonun durumunu haftalık olarak bir CSV dosyası olarak kaydedin.
- Tüm geçmiş CSV dosyalarını bir Pandas DataFrame'e okuyun.
- Verileri, ilerlemeyi nasıl izlemek istediğimize (etkinlik durumuna, iş akışına vb. göre) ilişkin kararlaştırılan biçimlerde sıralayın, filtreleyin, gruplandırın ve işleyin.
- Çıktıyı, her analizden elde edilen verileri kendi sayfasında, basitçe kopyalanıp düşünce hücresi çizelgelerine yapıştırılabilecek şekilde biçimlendirilmiş bir Excel dosyasına yazın.
- Aylık yürütme kurulu toplantısı için raporlama paketi için tablolar ve çizelgeler oluşturun.
Senaryoyu geliştirmek birkaç saatlik bir ön yatırım gerektirdi, ancak şimdi, yürütme kurulu toplantıları veya geçici analizler için raporlama paketini güncellemek birkaç dakika alıyor. Kelimenin tam anlamıyla, doğru klasöre gitmek ve komut dosyasını tek satırlık bir komutla çalıştırmak için yaklaşık 30 saniye ve ardından çıktıyı slayt destesine kopyalayıp yapıştırmak için birkaç dakika. Yürütülmesi yaklaşık bir ay olan on iki iş akışında yaklaşık 500 etkinlik (kart), iki yıllık bir program zaman çizelgesi içinde nasıl hareket ettiklerinin haftalık takibi ile, kendinizi hızla binlerce ve sonunda düzinelerce veri noktasıyla uğraşırken bulursunuz. dosya sayısı. Otomasyon olmadan burada çok sıkıcı görevlerden bahsediyoruz.
Sadece işlere devam etmek veya otomasyon kurarak daha fazla başlangıç iş yükü eklemek arasındaki "paranın zaman değeri" dengesi, finansta yaygın bir temadır. Verileri CSV dosyaları olarak dışa aktararak bu işlemin ilk adımında benzer bir karar verdim. MeisterTask, birçok modern web uygulaması gibi, Python uygulamanıza bağlanabilen bir API'ye sahiptir, ancak onu kurmak için harcanan zaman, buradaki kullanım durumumuz için zaman tasarrufundan çok daha ağır basacaktır.
Dolayısıyla, gördüğünüz gibi, çoğu zaman en uygun çözüm, bir iş akışının belirli adımlarını otomatikleştirmek ve diğerlerini manuel tutmaktır.
2. Web Scraping, Google Maps API ve Excel Kullanarak Ev Fiyat İstatistiklerini Analiz Etme
Başka bir örnek, kişisel ilgim dışında yaptığım bir şey, ancak Python'un yardımcı programının başka ilginç unsurlarını içerdiği için vurgulamak istiyorum:
- Belirli bir alan için adres, büyüklük, oda sayısı, talep edilen fiyat ve diğer özellikler dahil olmak üzere emlak listelerinin verilerini kazıyın; toplamda birkaç yüz ila belki bin satır.
- Bir Python veri yapısına kaydedin.
- Google Haritalar API'sine bağlanın ve her bir listeleme için mülk ile deniz, şehir merkezi, en yakın tren istasyonu, en yakın havaalanı vb. gibi önemli yer işaretleri arasındaki mesafeyi alın.
- Verileri bir Excel dosyasına aktarın.
- Regresyonları çalıştırmak, istatistikleri hesaplamak ve metrekare başına fiyat ve önemli noktalara olan mesafe gibi standart metrikler üzerinde grafikler oluşturmak için standart Excel işlevselliğini kullanın.
Buradaki sonuçlar, gayrimenkul ararken tercihler ve finansal sınırlamalar açısından kendi kişisel ağırlıklarınızla birleştirilebilir.
Bunlar, elektronik tabloyla ilgili işleri otomatikleştirmeye ve özellikler eklemeye odaklanan yalnızca iki örnektir, ancak Python ile fırsatlar neredeyse sınırsızdır. Bir sonraki bölümde, Python'da adım adım Monte Carlo simülasyon eğitimine geçmeden önce bu kadar popüler olmasının nedenlerini özetleyeceğim.
Python Neden Finans Uzmanları İçin Mükemmel Bir Seçimdir?
Python programlama dili 1990'dan beri var, ancak popülaritesinin patlaması son yıllara kadar değil.
Bunun birkaç nedeni var, sırayla her birine bakalım.
1. Python Üst Düzey Bir Programlama Dilidir
Üst düzey bir programlama dili, bilgisayarın iç işleyişinin birçok ayrıntısını soyutlayan bir dildir. İyi bir örnek bellek yönetimidir. Alt düzey programlama dilleri, görevleri gerçekleştirmek için harcanan zamana ve gereken kod satırlarına ek olarak, bilgisayarın belleğinin nasıl düzenlendiği, tahsis edildiği ve serbest bırakıldığına ilişkin karmaşıklıkların ayrıntılı bir şekilde anlaşılmasını gerektirir. Python, bu ayrıntıların çoğunu otomatik olarak soyutlar ve ele alır ve sizi başarmak istediğiniz şeye odaklanmaya bırakır.
2. Kısa ve öz
Python üst düzey bir programlama dili olduğundan, kod daha özlüdür ve neredeyse tamamen teknik uygulama ayrıntılarından ziyade elde etmek istediğiniz şeyin iş mantığına odaklanır. Dil tasarımı seçimleri buna katkıda bulunur: bir örnek olarak, Python diğer birçok dilde olduğu gibi işlevleri, döngüleri ve çizgileri betimlemek için küme parantezi veya noktalı virgül kullanılmasını gerektirmez, bu da onu daha özlü kılar ve bazılarının iddia ettiği gibi geliştirir okunabilirlik.
3. Öğrenmesi ve Anlaması Kolay
Python'da dil tasarımı seçimlerini etkileyen bir gözlem, programların yazıldığından daha sık okunduğudur. Python, kodu sade İngilizceye çok yakın göründüğü için burada öne çıkıyor, özellikle de komut dosyanızın veya programınızın farklı bileşenlerini mantıklı bir şekilde adlandırırsanız.
4. Hızlı, Yinelemeli Geliştirme için Uygun
Aydınlanmış deneme yanılma, kusursuz zekaların planlamasından daha iyi performans gösterir. - David Kelley
Python, prototip oluşturma ve hızlı, yinelemeli geliştirme (ve evet, deneme-yanılma) için idealdir çünkü Python kabuğu, IPython ve Jupyter not defterleri gibi etkileşimli yorumlayıcı araçlar Python araç zincirinde önde ve merkezdedir. Bu etkileşimli ortamlarda, her bir kod satırını ayrı ayrı yazıp yürütebilir ve sonuçları (veya yardımcı bir hata mesajını) hemen görebilirsiniz. Diğer dillerde de bu vardır, ancak çoğu durumda Python ile aynı derecede değildir.
5. Hem Prototip hem de Üretim Kodu İçin Kullanılabilir
Python, prototip oluşturma için harika olmasının yanı sıra, büyük üretim uygulamaları için de mükemmel ve güçlü bir dildir. Dünyanın en büyük yazılım şirketlerinden bazıları, çeşitli uygulamalarda ve kullanım durumlarında Python'u yoğun bir şekilde kullanmaktadır.
6. "Piller Dahildir": Python Standart Kitaplığı
Temel işlemler için gereken her şey doğrudan dilde yerleşiktir, ancak buna ek olarak Python standart kitaplığında dosyalar, medya, ağ iletişimi, tarih ve saat bilgileri ve çok daha fazlasıyla çalışmak için araçlar bulunur. Bu, üçüncü taraf paketleri aramak zorunda kalmadan çok çeşitli görevleri gerçekleştirmenize olanak tanır.
7. Finansal Analiz için Büyük Üçüncü Taraf Kütüphaneleri
Finans uzmanları için, DataFrame ve Series nesneleri ile Pandalar ve ndarray'i ile Numpy , Python ile finansal analizin beygirleridir. Matplotlib ve diğer görselleştirme kitaplıkları ile birlikte, üretkenliğe yardımcı olacak harika araçlara sahip olursunuz.
8. Python Ücretsizdir!
Python, açık kaynak lisansı altında geliştirilmiştir ve ticari kullanım için de ücretsizdir.
Python ve Finansı Birlikte Kullanmaya Yönelik Adım Adım Eğitim
Aşağıda, önceki blog yazımda açıklanan Monte Carlo simülasyonunun basitleştirilmiş bir sürümünün nasıl oluşturulacağını gösteren, ancak Excel için @RISK eklentisi yerine Python kullanılarak adım adım bir eğitim verilmektedir.
Monte Carlo yöntemleri, sayısal sonuçlar elde etmek için rastgele örneklemeye dayanır. Böyle bir uygulama, değişkenlerin veya varsayımların bir dizi değer alabildiği, dünyanın gelecekteki belirsiz potansiyel durumlarını temsil eden bir olasılık dağılımından rastgele örnekler çizmektir.
Opsiyonların veya diğer türevlerin değerlemesini gösteren daha yaygın örnekler yerine, Monte Carlo simülasyonunu basitleştirilmiş bir DCF değerleme modeli üzerinde yapmak yararlıdır, çünkü bunun için finansal tabloları hesaplama temellerinin ötesinde herhangi bir matematiğe ihtiyacımız yoktur ve Python kavramlarına ve araçlarına odaklanmamızı sağlayan nakit akışlarını indirgemek. Ancak bu temel eğitim modelinin temel kavramları açıklamaya yönelik olduğunu ve herhangi bir pratik amaç için olduğu gibi yararlı olmadığını lütfen unutmayın. Ayrıca Monte Carlo simülasyonlarının akademik yönlerine de değinmeyeceğim.
Eğitim, değişkenler ve işlevler gibi programlamanın temel yapı taşlarına aşina olduğunuzu varsayar. Değilse, örneğin bu girişteki temel kavramları kontrol etmek için 10 dakika ayırmanız yararlı olabilir.
Başlangıç Noktası ve İstenen Sonuç
Monte Carlo simülasyon eğitiminde kullanılan aynı çok basitleştirilmiş DCF değerleme modeliyle başlıyorum. Üç mali tablodan bazı önemli satır öğelerine ve Excel sürümünde, potansiyel sonuç aralıklarını keşfetmeye başlamak için şimdi olasılık dağılımlarıyla değiştirmek istediğimiz nokta tahminlere sahip vurgulanmış üç girdi hücresine sahiptir.
Küçük Bir Komut Dosyası Geliştirmeye İki Adımlı Bir Yaklaşım
Çalıştır, düzelt, hızlı yap - Kent Beck
Bu öğreticinin amacı, Python'da yeni olan finans uzmanlarına yalnızca yararlı bir programın nasıl görünebileceğine değil, aynı zamanda onu geliştirmek için kullanabileceğiniz yinelemeli sürece de bir giriş vermektir. Bu nedenle, iki bölümden oluşur:
- İlk olarak, izlemesi kolay olduğunu düşündüğüm basit bir yaklaşım kullanarak çalışan bir prototip geliştiriyorum ve sıfırdan başlayacaksanız bu projeyi başlatmak için kullanabileceğiniz süreçten tamamen farklı değil.
- Ardından, çalışan prototipi geliştirdikten sonra, yeniden düzenleme sürecinden geçiyorum - işlevselliğini değiştirmeden kodun yapısını değiştiriyorum. Bu kısım için uğraşmak isteyebilirsiniz - bu, ilkinden daha zarif bir çözümdür ve bonus olarak, yürütme süresi açısından yaklaşık 75 kat daha hızlıdır.
1. Çalışan Bir Prototip Geliştirme
Jupyter Notebook'u kurma
Jupyter notebook, Python ile etkileşimli olarak çalışmak için harika bir araçtır. Kod, Markdown metni, resimler veya diğer verileri içerebilen hücrelere sahip etkileşimli bir Python yorumlayıcısıdır. Bu eğitim için Python Quant Platformunu kullandım, ancak ücretsiz ve bulutta çalışan Colaboratory by Google'ı da önerebilirim. Bir kez orada, "Dosya" menüsünden "Yeni Python 3 Not Defteri"ni seçin ve gitmeye hazırsınız.
Bunu yaptıktan sonraki adım, veri işleme ve görselleştirmeler için ihtiyaç duyduğumuz üçüncü taraf paketlerini içe aktarmak ve programa grafikleri ayrı pencereler yerine not defterimizde satır içi görmek istediğimizi söylemektir:
import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline
İlk değişkenlerimizi adlandırmaya başlamadan önce bir not. Daha önce vurguladığım gibi, okunabilirlik Python'un güçlü yönlerinden biridir. Dil tasarımı bunu desteklemek için uzun bir yol kat eder, ancak kod yazan herkes onu yalnızca başkaları için değil, kendileri için de okunabilir ve anlaşılır kılmaktan sorumludur. Eagleson Yasası'nın belirttiği gibi, "Altı ay veya daha uzun süredir bakmadığınız herhangi bir kodunuz başka biri tarafından yazılmış olabilir."
İyi bir kural, programınızın bileşenlerini, programınızın ne yaptığını açıklayan ayrı yorumlara olan ihtiyacı en aza indirecek şekilde adlandırmaktır.
Bunu akılda tutarak, devam edelim.
Mali Tabloların Oluşturulması
Python'da mevcut elektronik tablo verileriyle çalışmanın birçok yolu vardır. Örneğin, read_excel
komutunu kullanarak bir kod satırıyla Pandas DataFrame'e bir sayfa okuyabilirdik. Elektronik tablonuz ve Python kodunuz arasında daha sıkı bir entegrasyon ve gerçek zamanlı bağlantı istiyorsanız, bu işlevi sağlamak için hem ücretsiz hem de ticari seçenekler mevcuttur.

Buradaki model çok basit olduğundan ve bizi Python kavramlarına odaklamak için, onu betiğimizde sıfırdan yeniden oluşturacağız. İlk bölümün sonunda, oluşturduğumuz şeyi bir elektronik tabloya nasıl aktarabileceğinizi göstereceğim.
Finansal tabloların Python temsilini oluşturmaya yönelik ilk adım olarak uygun bir veri yapısına ihtiyacımız olacak. Aralarından seçim yapabileceğiniz çok şey var, bazıları Python'da yerleşik, diğerleri çeşitli kitaplıklardan, ya da kendimizinkini oluşturabiliriz. Şimdilik, işlevselliğine bir göz atmak için Pandas kitaplığından bir Seri kullanalım:
years = ['2018A', '2019B', '2020P', '2021P', '2022P', '2023P'] sales = pd.Series(index=years) sales['2018A'] = 31.0 sales
Bu girdi ve buna karşılık gelen çıktı aşağıda gösterilmiştir:
İlk üç satırla, yıllardan (her biri Gerçek, Bütçe veya Öngörülen olup olmadığını gösterecek şekilde işaretlenmiş), bir başlangıç değerinden (orijinal DCF modelinde olduğu gibi milyon avro olarak) ve projeksiyonlar için boş (NaN, “Sayı Değil”) hücreler. Dördüncü satır, verilerin bir temsilini yazdırır - genel olarak, etkileşimli yorumlayıcıya bir değişkenin veya diğer nesnelerin adını yazmak, genellikle size bunun mantıklı bir temsilini verir.
Ardından, öngörülen yıllık satış büyümesini temsil edecek bir değişken beyan ederiz. Bu aşamada, orijinal DCF modelimizdekiyle aynı rakam olan bir nokta tahminidir. Nokta tahminlerini olasılık dağılımlarıyla değiştirmeye bakmadan önce, ilk olarak aynı girdileri kullanmak ve Python sürümümüzün Excel sürümüyle aynı işlevi gördüğünü ve aynı sonucu verdiğini doğrulamak istiyoruz. Bu değişkeni kullanarak, bir önceki yıla ve büyüme oranına dayalı projeksiyonların her yıldaki satışlarını hesaplayan bir döngü oluşturuyoruz:
growth_rate = 0.1 for year in range(1, 6): sales[year] = sales[year - 1] * (1 + growth_rate) sales
Artık NaN yerine tahmini satışlarımız var:
Aynı yaklaşımı kullanarak, finansal tablolara devam ediyoruz, değişkenleri ihtiyaç duyduğumuz şekilde beyan ediyor ve sonunda serbest nakit akışına ulaşmak için gerekli hesaplamaları yapıyoruz. Oraya vardığımızda elimizdekilerin DCF modelinin Excel sürümünün söylediklerine karşılık gelip gelmediğini kontrol edebiliriz.
ebitda_margin = 0.14 depr_percent = 0.032 ebitda = sales * ebitda_margin depreciation = sales * depr_percent ebit = ebitda - depreciation nwc_percent = 0.24 nwc = sales * nwc_percent change_in_nwc = nwc.shift(1) - nwc capex_percent = depr_percent capex = -(sales * capex_percent) tax_rate = 0.25 tax_payment = -ebit * tax_rate tax_payment = tax_payment.apply(lambda x: min(x, 0)) free_cash_flow = ebit + depreciation + tax_payment + capex + change_in_nwc free_cash_flow
Bu bize ücretsiz nakit akışlarını verir:
Bu aşamada bir yoruma ihtiyaç duyan yukarıdaki satır, ikinci tax_payment
referansıdır. Burada, vergi öncesi kârın negatif olduğu senaryolarda, pozitif bir vergi ödememiz olmayacağından emin olmak için küçük bir fonksiyon uyguluyoruz. Bu, Pandas Series veya DataFrame'deki tüm hücrelere özel işlevleri ne kadar etkili şekilde uygulayabileceğinizi gösterir. Uygulanan asıl işlev elbette bir basitleştirmedir. Daha büyük bir değerleme uygulaması için daha gerçekçi bir model, şirkete özgü bir dizi faktöre dayalı olarak ödenen fiili nakit vergileri hesaplayan ayrı bir vergi modeline sahip olacaktır.
DCF Değerlemesinin Yapılması
Öngörülen nakit akışlarına ulaştıktan sonra, artık basit bir terminal değeri hesaplayabilir ve DCF sonucunu elde etmek için tüm nakit akışlarını bugüne indirebiliriz. Aşağıdaki kod, Pandas Series nesnesi gibi bir veri yapısındaki bir veya daha fazla öğeye erişmemizi sağlayan indeksleme ve dilimlemeyi tanıtır.
Elemanlara, yapının adından hemen sonra köşeli parantezler yazarak erişiyoruz. Basit indeksleme, sıfırdan başlayarak öğelere konumlarına göre erişir, yani free_cash_flow[1]
bize ikinci öğeyi verir. [-1]
son öğeye erişmenin kısaltmasıdır (terminal değeri hesaplamak için geçen yılın nakit akışı kullanılır) ve iki nokta üst üste kullanmak bize bir dilim verir, yani [1:]
bize birinci hariç tüm öğeleri verir, DCF değerlememize 2018A
tarihi yılını dahil etmek istemediğimizden.
cost_of_capital = 0.12 terminal_growth = 0.02 terminal_value = ((free_cash_flow[-1] * (1 + terminal_growth)) / (cost_of_capital - terminal_growth)) discount_factors = [(1 / (1 + cost_of_capital)) ** i for i in range (1,6)] dcf_value = (sum(free_cash_flow[1:] * discount_factors) + terminal_value * discount_factors[-1]) dcf_value
Bu, prototipimizin ilk bölümünü tamamlıyor - artık Python'da çok ilkel olsa da çalışan bir DCF modelimiz var.
Verileri Dışa Aktarma
Asıl Monte Carlo simülasyonuna geçmeden önce, Panda paketindeki dışa aktarma yeteneklerinden bahsetmek için iyi bir zaman olabilir. Pandas DataFrame nesneniz varsa, bunu to_excel
yöntemini kullanarak tek satırlık bir Excel dosyasına yazabilirsiniz. Bir düzineden fazla başka biçime ve hedefe de dışa aktarmak için benzer işlevler vardır.
output = pd.DataFrame([sales, ebit, free_cash_flow], index=['Sales', 'EBIT', 'Free Cash Flow']).round(1) output.to_excel('Python DCF Model Output.xlsx') output
Monte Carlo Simülasyonumuz için Olasılık Dağılımları Oluşturma
Şimdi bir sonraki zorluğun üstesinden gelmeye hazırız: nokta tahmin girdilerinden bazılarını olasılık dağılımlarıyla değiştirmek. Bu noktaya kadar olan adımlar, aynı modeli Excel'de oluşturmaya kıyasla biraz hantal görünse de, sonraki birkaç satır size Python'un ne kadar güçlü olabileceğine dair bir fikir verecektir.
İlk adımımız, simülasyonda kaç yineleme çalıştırmak istediğimize karar vermektir. Başlangıç noktası olarak 1.000'i kullanmak, mantıklı çıktı grafikleri elde etmek için yeterli veri noktası elde etmek ile simülasyonun makul bir zaman çerçevesinde bitirilmesi arasında bir denge kurar. Ardından, gerçek dağılımları oluştururuz. Basit olması adına, burada üç normal dağılım oluşturdum, ancak NumPy kitaplığında seçim yapabileceğiniz çok sayıda dağıtım var ve Python standart kitaplığı da dahil olmak üzere bakılacak başka yerler de var. Hangi dağılımın kullanılacağına karar verdikten sonra, ortalama ve standart sapma gibi şekillerini tanımlamak için gereken parametreleri ve istenen sonuçların sayısını belirlememiz gerekir.
iterations = 1000 sales_growth_dist = np.random.normal(loc=0.1, scale=0.01, size=iterations) ebitda_margin_dist = np.random.normal(loc=0.14, scale=0.02, size=iterations) nwc_percent_dist = np.random.normal(loc=0.24, scale=0.01, size=iterations) plt.hist(sales_growth_dist, bins=20) plt.show()
Burada FAVÖK'ün satışlardan bağımsız ayrı bir rastgele değişken olmaması, bunun yerine satışlarla bir dereceye kadar ilişkili olması gerektiğini iddia edebilirsiniz. Buna katılıyorum ve maliyet yapısının dinamikleri (değişken, yarı değişken ve sabit maliyetler) ve temel maliyet sürücülerinin (bazılarının kendi olasılık dağılımları olabilir) sağlam bir anlayışla yönlendirilmesi gerektiğini ekliyorum. örneğin girdi emtia fiyatları gibi), ancak bu karmaşıklıkları yer ve açıklık adına burada bir kenara bırakıyorum.
Dağıtım ve parametre seçiminizi bilgilendirmek için ne kadar az veriye sahip olursanız, olası senaryo aralıkları üzerinde bir fikir birliği görünümü oluşturmak için deneyimle birleştirilmiş çeşitli durum tespiti iş akışlarınızın sonucuna o kadar fazla güvenmek zorunda kalacaksınız. Bu örnekte, nakit akışı projeksiyonlarıyla, büyük bir öznel bileşen olacaktır, bu da olasılık dağılımlarını görselleştirmenin önemli hale geldiği anlamına gelir. Burada, sadece iki kısa kod satırı ile satış artışı dağılımını gösteren temel bir görselleştirme elde edebiliriz. Bu şekilde, takımın toplu görüşünü en iyi yansıtan göz küresi dağılımını hızlı bir şekilde görebiliriz.
Şimdi simülasyonu çalıştırmak için ihtiyacımız olan tüm yapı taşlarına sahibiz, ancak simülasyonu çalıştırmak için uygun bir formatta değiller. Şu ana kadar çalıştığımız kodun aynısı, ancak tümü tek bir hücrede toplandı ve kolaylık sağlamak için bir işleve yeniden düzenlendi:
def run_mcs(): # Create probability distributions sales_growth_dist = np.random.normal(loc=0.1, scale=0.01, size=iterations) ebitda_margin_dist = np.random.normal(loc=0.14, scale=0.02, size=iterations) nwc_percent_dist = np.random.normal(loc=0.24, scale=0.01, size=iterations) # Calculate DCF value for each set of random inputs output_distribution = [] for i in range(iterations): for year in range(1, 6): sales[year] = sales[year - 1] * (1 + sales_growth_dist[0]) ebitda = sales * ebitda_margin_dist[i] depreciation = (sales * depr_percent) ebit = ebitda - depreciation nwc = sales * nwc_percent_dist[i] change_in_nwc = nwc.shift(1) - nwc capex = -(sales * capex_percent) tax_payment = -ebit * tax_rate tax_payment = tax_payment.apply(lambda x: min(x, 0)) free_cash_flow = ebit + depreciation + tax_payment + capex + change_in_nwc # DCF valuation terminal_value = (free_cash_flow[-1] * 1.02) / (cost_of_capital - 0.02) free_cash_flow[-1] += terminal_value discount_factors = [(1 / (1 + cost_of_capital)) ** i for i in range (1,6)] dcf_value = sum(free_cash_flow[1:] * discount_factors ) output_distribution.append(dcf_value) return output_distribution
Şimdi tüm simülasyonu çalıştırabilir ve bu şirketin 1.000 iterasyonun her birinde indirgenmiş nakit akış değeri olacak çıktı dağılımını aşağıdaki kodla çizebiliriz. %time
komutu Python kodu değil, bir şeyi çalıştırma süresini ölçen bir not defteri stenografisidir (bunun yerine standart kitaplıktan Python işlevini kullanabilirsiniz). Çalıştırdığınız bilgisayara bağlıdır, ancak bu sürümün 1.000 yinelemeyi çalıştırmak ve sonucu görselleştirmek için 1-2 saniyeye ihtiyacı vardır.
%time plt.hist(run_mcs(), bins=20, color='r') plt.show()
2. Prototipin İncelenmesi
Bir şeyin basitleştirilebileceğine dair gizlenen şüphe, dünyanın en zengin ödüllendirici zorluk kaynağıdır. - Edsger Dijkstra
Yeniden düzenleme, işlevselliğini değiştirmeden yapısını iyileştirmek için mevcut kodu yeniden yazma sürecini ifade eder ve kodlamanın en eğlenceli ve ödüllendirici unsurlarından biri olabilir. Bunu yapmanın birkaç nedeni olabilir. Şunlar için olabilir:
- Farklı parçaları daha mantıklı bir şekilde düzenleyin.
- Amaçlarını ve çalışmalarını daha net hale getirmek için değişkenleri ve işlevleri yeniden adlandırın.
- İzin verin ve gelecekteki özelliklere hazırlanın.
- Yürütme hızını, bellek ayak izini veya diğer kaynak kullanımını iyileştirin.
Bu süreçteki bir adımın nasıl görünebileceğini göstermek için, prototip komut dosyasında olduğu gibi dağılmak yerine tüm başlangıç değişkenlerini tek bir yerde toplayarak az önce üzerinde çalıştığımız prototipi temizledim ve adı verilen bir işlemle yürütme hızını optimize ettim. vektörleştirme .
NumPy dizilerini kullanmak, birçok türde veri işleme görevini, aksi takdirde yazma döngüleri gerektirebilecek kısa dizi ifadeleri olarak ifade etmenizi sağlar. Açık döngüleri dizi ifadeleriyle değiştirme uygulamasına genel olarak vektörleştirme denir. Wes McKinney
Artık daha temiz ve anlaşılması daha kolay görünüyor:
# Key inputs from DCF model years = 5 starting_sales = 31.0 capex_percent = depr_percent = 0.032 sales_growth = 0.1 ebitda_margin = 0.14 nwc_percent = 0.24 tax_rate = 0.25 # DCF assumptions r = 0.12 g = 0.02 # For MCS model iterations = 1000 sales_std_dev = 0.01 ebitda_std_dev = 0.02 nwc_std_dev = 0.01
def run_mcs(): # Generate probability distributions sales_growth_dist = np.random.normal(loc=sales_growth, scale=sales_std_dev, size=(years, iterations)) ebitda_margin_dist = np.random.normal(loc=ebitda_margin, scale=ebitda_std_dev, size=(years, iterations)) nwc_percent_dist = np.random.normal(loc=nwc_percent, scale=nwc_std_dev, size=(years, iterations)) # Calculate free cash flow sales_growth_dist += 1 for i in range(1, len(sales_growth_dist)): sales_growth_dist[i] *= sales_growth_dist[i-1] sales = sales_growth_dist * starting_sales ebitda = sales * ebitda_margin_dist ebit = ebitda - (sales * depr_percent) tax = -(ebit * tax_rate) np.clip(tax, a_min=None, a_max=0) nwc = nwc_percent_dist * sales starting_nwc = starting_sales * nwc_percent prev_year_nwc = np.roll(nwc, 1, axis=0) prev_year_nwc[0] = starting_nwc delta_nwc = prev_year_nwc - nwc capex = -(sales * capex_percent) free_cash_flow = ebitda + tax + delta_nwc + capex # Discount cash flows to get DCF value terminal_value = free_cash_flow[-1] * (1 + g) / (r - g) discount_rates = [(1 / (1 + r)) ** i for i in range (1,6)] dcf_value = sum((free_cash_flow.T * discount_rates).T) dcf_value += terminal_value * discount_rates[-1] return dcf_value
Bu sürüm ile önceki sürüm arasında fark edeceğiniz temel fark, for i in range(iterations)
döngüsünün olmamasıdır. NumPy'nin dizi işlemini kullanan bu sürüm, prototip sürümü için 1,35 saniyeye kıyasla 18 milisaniyede çalışır - kabaca 75 kat daha hızlı.
%time plt.hist(run_mcs(), bins=20, density=True, color="r") plt.show()
Daha fazla optimizasyonun mümkün olduğundan eminim, çünkü hem prototipi hem de rafine versiyonu kısa sürede yalnızca bu eğitimin amacı için bir araya getirdim.
daha ileri götürmek
Bu eğitim, Python'un bazı güçlü özelliklerini gösterdi ve eğer bunu daha da geliştirirseniz, fırsatlar neredeyse sonsuzdur. Örneğin:
- Varsayımlar ve olasılık dağılımları seçiminizi bilgilendirmeye yardımcı olması için web sayfalarından veya diğer veri kaynaklarından ilgili şirket veya sektör istatistiklerini kazıyın veya indirin.
- Python'u, temel ve/veya makroekonomik faktörlere dayalı otomatik bir ticaret algoritması gibi nicel finans uygulamalarında kullanın.
- Dahili işlem inceleme ve onay sürecinizin bir parçası olarak veya harici sunumlar için kullanılmak üzere bir elektronik tablo ve/veya sunum biçiminde çıktı oluşturan dışa aktarma yetenekleri oluşturun.
Python'un başarısına katkıda bulunan çeşitli web, veri bilimi ve makine öğrenimi uygulamalarıyla da neler yapabileceğinize değinmedim bile.
Özetle: Finansal Araç Kutunuz için Faydalı Bir Dil
Bu makale Python programlama diline bir giriş yaptı, finansta bu kadar popüler olmasının bazı nedenlerini sıraladı ve küçük bir Python betiğinin nasıl oluşturulacağını gösterdi. Adım adım bir eğitimde Python'un yinelemeli prototip oluşturma, etkileşimli finansal analiz ve değerleme modelleri, algoritmik ticaret programları ve daha fazlası için uygulama kodu için nasıl kullanılabileceğini anlattım.
Benim için günün sonunda Python teknolojisinin öldürücü özelliği, birlikte çalışmanın eğlenceli olması! Problem çözmeyi, bir şeyler inşa etmeyi ve iş akışlarını daha verimli hale getirmeyi seviyorsanız, denemenizi tavsiye ederim. Bununla ne yaptığınızı veya onunla ne yapmak istediğinizi duymayı çok isterim.
Finans Uzmanlarının Python Öğrenmesi İçin Önerilen Kaynaklar
- O'Reilly kitapları. Özellikle tavsiye edebilirim:
- Python for Finance by Yves Hilpisch
- Learning Python by Mark Lutz
- Fluent Python by Luciano Ramalho
- The Python Quants
- PyCon talks on YouTube
- Udemy