Python dan Keuangan – Tingkatkan Spreadsheet Anda

Diterbitkan: 2022-03-11

Ringkasan bisnis plan

Mengapa Python merupakan bahasa pemrograman yang bagus untuk dipelajari oleh para profesional keuangan?
  • Python adalah bahasa pemrograman tingkat tinggi, artinya ia mengabstraksi dan menangani banyak aspek teknis pemrograman, seperti manajemen memori, yang harus ditangani secara eksplisit dalam bahasa lain. Ini membuat Python mudah digunakan bagi mereka yang tidak memiliki latar belakang teknis.
  • Karena bahasa ini dirancang dengan mempertimbangkan keterbacaan dan kemudahan penggunaan, ini adalah salah satu bahasa yang paling mudah dipelajari. Kode Python ringkas dan dekat dengan bahasa Inggris biasa.
  • Python sangat ideal untuk pembuatan prototipe dan pengembangan berulang yang cepat. Alat penerjemah interaktifnya menyediakan lingkungan tempat Anda dapat menulis dan mengeksekusi setiap baris kode secara terpisah dan melihat hasilnya dengan segera.
  • Pada saat yang sama, Python kuat dan berkinerja, menjadikannya pilihan yang layak juga untuk sistem inti dan aplikasi yang lebih besar.
  • Selain perpustakaan standar yang besar dari alat yang berguna, Python memiliki perpustakaan pihak ketiga yang hebat untuk analisis keuangan dan komputasi, seperti perpustakaan Pandas dan NumPy yang digunakan dalam tutorial ini.
Apa saja kasus penggunaan untuk mengimplementasikan Python dan keuangan bersama?
  • Skrip Python dapat digunakan untuk mengotomatiskan tugas dan alur kerja yang berulang, menghemat waktu, dan mengurangi risiko kesalahan manual.
  • Skrip memungkinkan pengguna untuk dengan mudah menarik data dari spreadsheet, database, dan API, atau bahkan mengikis data web, yang kemudian dapat diproses dan dianalisis menggunakan alat statistik dan analitik yang kuat.
  • Berbagai plugin untuk Excel memungkinkan pengguna membuat tautan dua arah waktu nyata antara spreadsheet Anda dan kode Python.
  • Python memungkinkan jenis analisis baru, seperti simulasi Monte Carlo, yang tidak tersedia di spreadsheet standar.
  • Perdagangan algoritmik tidak lagi menjadi domain eksklusif dana lindung nilai dan bank investasi besar. Dengan Python, Anda dapat mengembangkan, menguji ulang, dan menerapkan strategi perdagangan Anda sendiri dalam waktu singkat dan dengan biaya rendah.

Untuk profesi yang telah lama mengandalkan trawl melalui spreadsheet, Python sangat berharga. Citigroup, sebuah bank Amerika, telah memperkenalkan kursus kilat dengan Python untuk analis pelatihannya. - Sang Ekonom

Profesional keuangan telah lama memiliki akses ke VBA (Visual Basic for Applications) di Excel untuk membangun fungsionalitas kustom dan mengotomatiskan alur kerja. Dengan munculnya Google Sheets dalam beberapa tahun terakhir sebagai pesaing serius di ruang spreadsheet, Google Apps Script sekarang menawarkan pilihan tambahan.

Namun, saya ingin menarik perhatian pada opsi ketiga, bahasa pemrograman Python, yang telah menjadi sangat populer di sejumlah bidang.

Dalam artikel ini, saya akan memberikan beberapa contoh tentang apa yang dapat Anda capai dengan Python, dimulai dengan gambaran umum tentang bahasa itu sendiri dan mengapa itu menjadi sangat populer di berbagai bidang, mulai dari pengembangan web, pembelajaran mesin, keuangan, sains, dan pendidikan, hanya untuk beberapa nama. Babak kedua kemudian akan terdiri dari tutorial langkah demi langkah.

Tujuan saya menulis ini adalah untuk membantu Anda memutuskan apakah Python terlihat cukup menarik bagi Anda untuk mempertimbangkan menambahkannya ke kotak peralatan keuangan Anda. Jika Anda mengambil lompatan, ada banyak aplikasi, kursus, video, artikel, buku, dan posting blog yang tersedia untuk mempelajari bahasa tersebut. Di akhir artikel, saya telah membuat daftar beberapa sumber yang telah membantu saya selama ini.

Kasus Penggunaan: Contoh dari Apa yang Saya Gunakan Untuk Python

Pengantar pemrograman saya adalah belajar BASIC di Oric 1 pada pertengahan 1980-an. Saat itu BASIC adalah bahasa pemula yang paling umum. Bahasa lain yang saya coba di akhir 80-an hingga pertengahan 90-an adalah Pascal dan C, tetapi saya tidak pernah menggunakannya dalam kapasitas profesional apa pun, dan saya tidak berharap untuk membutuhkan atau menggunakan keterampilan pemrograman. Sepengetahuan saya saat itu di akhir 90-an, keuangan dan pemrograman adalah bidang yang sangat berbeda, ketika saya memilih untuk memulai jalur karir di bidang keuangan.

Maju cepat ke 2012, dan saya ingin memilih pemrograman kembali sebagai hobi, jadi saya mulai meneliti bahasa yang tersedia saat itu. Ternyata cukup banyak yang telah terjadi, dan ketika saya menemukan Python saya terpikat, karena banyak alasan yang akan saya uraikan di bagian selanjutnya. Sejak itu saya telah menggunakan Python untuk berbagai tugas, dari skrip kecil hingga proyek yang lebih besar, baik secara pribadi maupun profesional. Banyak, tapi tidak semua, telah melibatkan spreadsheet, meja kerja banyak profesional keuangan.

Berikut adalah beberapa contoh seberapa baik spreadsheet dan Python dapat berjalan bersama:

1. Melacak Ratusan Aktivitas Dari Waktu ke Waktu dalam Pengaturan PMO Integrasi M&A

Saya bekerja dengan semua aspek transaksi M&A, tidak hanya eksekusi, tetapi juga integrasi. Dalam kasus baru-baru ini, tim PMO memutuskan program hibrid dan pendekatan manajemen proyek, menggunakan perencanaan air terjun dan bagan Gantt untuk rencana tingkat tinggi untuk masing-masing dari dua belas alur kerja integrasi, selain papan Kanban untuk melacak ratusan aktivitas yang sedang berjalan. pada waktu tertentu, dalam rencana 100 hari pertama dan seterusnya. Alat Kanban yang dipilih, MeisterTask, memiliki sejumlah fitur statistik dan pelaporan, tetapi kebutuhan kami lebih dari itu dalam hal analisis dan presentasi, yang memerlukan solusi khusus. Ini adalah alur kerja yang saya otomatis menggunakan Python:

  1. Simpan status seluruh papan mingguan sebagai file CSV.
  2. Baca semua file CSV historis ke dalam Pandas DataFrame.
  3. Mengurutkan, memfilter, mengelompokkan, dan memanipulasi data ke dalam format yang disepakati tentang bagaimana kita ingin melacak kemajuan (berdasarkan status aktivitas, alur kerja, dll.).
  4. Tulis output ke file Excel dengan data dari setiap analisis di dalam lembarnya sendiri, diformat sedemikian rupa sehingga dapat dengan mudah disalin dan ditempelkan ke bagan think-cell.
  5. Buat tabel dan bagan untuk paket pelaporan untuk rapat komite pengarah bulanan.

Mengembangkan skrip memerlukan investasi di muka selama beberapa jam, tetapi sekarang, memperbarui paket pelaporan untuk rapat komite pengarah atau analisis ad hoc membutuhkan waktu beberapa menit. Secara harfiah, sekitar 30 detik untuk pergi ke folder yang tepat dan menjalankan skrip dengan perintah satu baris, dan kemudian beberapa menit untuk menyalin-menempelkan output ke dek slide. Dengan sekitar 500 aktivitas (kartu) di dua belas alur kerja yang sudah berjalan sekitar satu bulan, pelacakan mingguan tentang bagaimana mereka bergerak, di dalam garis waktu program dua tahun, Anda dengan cepat menemukan diri Anda berurusan dengan ribuan, dan akhirnya puluhan ribu titik data di lusinan dari file. Tanpa otomatisasi, kita berbicara tentang beberapa tugas yang sangat membosankan di sini.

Pertukaran “nilai waktu dari uang” antara hanya melanjutkan sesuatu, atau menambahkan lebih banyak beban kerja awal dengan menyiapkan otomatisasi adalah tema umum di bidang keuangan. Saya membuat keputusan serupa dengan langkah pertama dari proses ini, dengan mengekspor data sebagai file CSV. MeisterTask, seperti banyak aplikasi web modern, memiliki API, yang dapat dihubungkan ke aplikasi Python Anda, tetapi waktu yang dihabiskan untuk menyiapkannya akan jauh lebih besar daripada penghematan waktu untuk kasus penggunaan kami di sini.

Jadi, seperti yang Anda lihat, seringkali solusi optimal adalah dengan mengotomatiskan langkah-langkah tertentu dari alur kerja dan membuat yang lain tetap manual.

2. Menganalisis Statistik Harga Rumah Menggunakan Web Scraping, Google Maps API, dan Excel

Contoh lain adalah sesuatu yang saya lakukan karena minat pribadi tetapi saya ingin menyorotinya karena mengandung beberapa elemen menarik lainnya dari utilitas Python:

  1. Mengikis data daftar real estat, termasuk alamat, ukuran, jumlah kamar, harga yang diminta, dan fitur lainnya, untuk area tertentu; beberapa ratus hingga mungkin seribu baris secara total.
  2. Simpan ke dalam struktur data Python.
  3. Hubungkan ke Google Maps API dan, untuk setiap cantuman, ambil jarak antara properti dan landmark utama seperti laut, pusat kota, stasiun kereta terdekat, bandara terdekat, dll.
  4. Ekspor data ke file Excel.
  5. Gunakan fungsionalitas Excel standar untuk menjalankan regresi, menghitung statistik, dan membuat bagan pada metrik standar seperti harga per meter persegi dan jarak ke landmark.

Hasil di sini dapat digabungkan dengan bobot pribadi Anda dalam hal preferensi, dan keterbatasan finansial saat mencari real estat.

Ini hanya dua contoh, yang berfokus pada otomatisasi pekerjaan terkait spreadsheet dan penambahan fitur, tetapi peluang dengan Python hampir tidak terbatas. Di bagian selanjutnya, saya akan menjelaskan alasan mengapa ini menjadi sangat populer, sebelum beralih ke tutorial simulasi Monte Carlo langkah demi langkah dengan Python.

Mengapa Python adalah Pilihan Terbaik untuk Profesional Keuangan

Bahasa pemrograman Python telah ada sejak tahun 1990, tetapi baru beberapa tahun terakhir popularitasnya meledak.

python adalah bahasa pemrograman yang paling banyak dicari

Ada beberapa alasan untuk ini, mari kita lihat satu per satu.

1. Python Adalah Bahasa Pemrograman Tingkat Tinggi

Bahasa pemrograman tingkat tinggi adalah bahasa yang mengabstraksikan banyak detail cara kerja bagian dalam komputer. Contoh yang baik adalah manajemen memori. Bahasa pemrograman tingkat rendah memerlukan pemahaman terperinci tentang kompleksitas bagaimana memori komputer diletakkan, dialokasikan, dan dirilis, selain waktu yang dihabiskan dan baris kode yang diperlukan untuk menangani tugas. Python mengabstraksi dan menangani banyak detail ini secara otomatis, membuat Anda fokus pada apa yang ingin Anda capai.

2. Ini Ringkas

Karena Python adalah bahasa pemrograman tingkat tinggi, kodenya lebih ringkas dan hampir seluruhnya berfokus pada logika bisnis dari apa yang ingin Anda capai, daripada detail implementasi teknis. Pilihan desain bahasa berkontribusi pada hal ini: sebagai contoh, Python tidak memerlukan penggunaan kurung kurawal atau titik koma untuk menggambarkan fungsi, loop, dan garis seperti yang dilakukan banyak bahasa lain, yang membuatnya lebih ringkas dan, seperti yang dikatakan beberapa orang, meningkatkan keterbacaan.

3. Mudah Dipelajari dan Dipahami

Satu pengamatan yang memengaruhi pilihan desain bahasa di Python adalah bahwa program lebih sering dibaca daripada ditulis. Python unggul di sini karena kodenya terlihat sangat mirip dengan bahasa Inggris biasa, terutama jika Anda memberi nama berbagai komponen skrip atau program Anda dengan cara yang masuk akal.

4. Cocok untuk Pengembangan Cepat dan Iteratif

Percobaan dan kesalahan yang tercerahkan mengungguli perencanaan intelek yang sempurna. - David Kelly

Python sangat ideal untuk pembuatan prototipe dan pengembangan iteratif yang cepat (dan, ya, coba-coba) karena alat juru bahasa interaktif seperti shell Python, IPython, dan notebook Jupyter berada di depan dan tengah dalam rantai alat Python. Dalam lingkungan interaktif ini, Anda dapat menulis dan mengeksekusi setiap baris kode secara terpisah dan melihat hasilnya (atau pesan kesalahan yang berguna) dengan segera. Bahasa lain juga memiliki ini, tetapi dalam banyak kasus tidak pada tingkat yang sama dengan Python.

5. Dapat Digunakan Baik untuk Prototyping dan Kode Produksi

Selain hebat untuk pembuatan prototipe, Python juga merupakan bahasa yang sangat baik dan kuat untuk aplikasi produksi besar. Beberapa perusahaan perangkat lunak terbesar di dunia banyak menggunakan Python dalam berbagai aplikasi dan kasus penggunaan.

6. Dilengkapi dengan “Termasuk Baterai:” Pustaka Standar Python

Semua yang diperlukan untuk operasi dasar dibangun langsung ke dalam bahasa, tetapi selain itu, pustaka standar Python memiliki alat untuk bekerja dengan file, media, jaringan, informasi tanggal dan waktu, dan banyak lagi. Ini memungkinkan Anda untuk menyelesaikan berbagai macam tugas tanpa harus mencari paket pihak ketiga.

7. Perpustakaan Pihak Ketiga yang Hebat untuk Analisis Keuangan

Untuk profesional keuangan, Pandas dengan objek DataFrame dan Serinya , dan Numpy dengan ndarray -nya adalah pekerja keras analisis keuangan dengan Python. Dikombinasikan dengan matplotlib dan perpustakaan visualisasi lainnya, Anda memiliki alat hebat yang dapat Anda gunakan untuk membantu produktivitas.

8. Python Gratis!

Python dikembangkan di bawah lisensi open source sehingga gratis juga untuk penggunaan komersial.

Tutorial Langkah-demi-Langkah Menggunakan Python dan Keuangan Bersama

Berikut ini adalah tutorial langkah demi langkah yang menunjukkan cara membuat versi simulasi Monte Carlo yang disederhanakan yang dijelaskan dalam posting blog saya sebelumnya, tetapi menggunakan Python alih-alih plugin @RISK untuk Excel.

Metode Monte Carlo mengandalkan random sampling untuk mendapatkan hasil numerik. Salah satu aplikasi tersebut adalah untuk menarik sampel acak dari distribusi probabilitas yang mewakili keadaan potensial masa depan yang tidak pasti dari dunia di mana variabel atau asumsi dapat mengambil berbagai nilai.

Akan sangat membantu untuk melakukan simulasi Monte Carlo pada model penilaian DCF yang disederhanakan daripada contoh yang lebih umum yang Anda lihat menunjukkan penilaian opsi atau turunan lainnya, karena untuk ini kami tidak memerlukan matematika apa pun di luar dasar penghitungan laporan keuangan dan mendiskontokan arus kas, memungkinkan kami untuk fokus pada konsep dan alat Python. Harap dicatat bahwa model tutorial dasar ini dimaksudkan untuk mengilustrasikan konsep-konsep kunci, dan tidak berguna apa adanya untuk tujuan praktis apa pun. Saya juga tidak akan menyentuh aspek akademis mana pun dari simulasi Monte Carlo.

Tutorial mengasumsikan bahwa Anda sudah familiar dengan blok bangunan dasar pemrograman, seperti variabel dan fungsi. Jika tidak, mungkin berguna untuk meluangkan waktu 10 menit untuk memeriksa konsep-konsep kunci, misalnya, pendahuluan ini.

Titik Awal dan Hasil yang Diinginkan

Saya mulai dengan model penilaian DCF yang sangat disederhanakan yang digunakan dalam tutorial simulasi Monte Carlo. Ini memiliki beberapa item baris utama dari tiga laporan keuangan, dan tiga sel input yang disorot, yang dalam versi Excel memiliki perkiraan titik yang sekarang ingin kami ganti dengan distribusi probabilitas untuk mulai menjelajahi rentang hasil yang potensial.

contoh proyeksi keuangan

Pendekatan Dua Langkah untuk Mengembangkan Skrip Kecil

Buat itu berhasil, perbaiki, buat cepat - Kent Beck

Maksud dari tutorial ini adalah untuk memberikan pengenalan kepada para profesional keuangan yang baru mengenal Python tidak hanya seperti apa tampilan program yang berguna, tetapi juga pengenalan proses berulang yang dapat Anda gunakan untuk mengembangkannya. Oleh karena itu, ia memiliki dua bagian:

  1. Pertama, saya mengembangkan prototipe kerja menggunakan pendekatan langsung yang menurut saya mudah diikuti dan tidak sepenuhnya berbeda dengan proses yang dapat digunakan untuk memulai proyek ini jika Anda memulai dari awal.
  2. Kemudian, setelah mengembangkan prototipe yang berfungsi, saya menjalani proses refactoring - mengubah struktur kode tanpa mengubah fungsinya. Anda mungkin ingin bertahan untuk bagian itu - ini adalah solusi yang lebih elegan daripada yang pertama, dan, sebagai bonus, ini sekitar 75x lebih cepat dalam hal waktu eksekusi.

1. Mengembangkan Prototipe yang Bekerja

Menyiapkan Notebook Jupyter

Notebook Jupyter adalah alat yang hebat untuk bekerja dengan Python secara interaktif. Ini adalah juru bahasa Python interaktif dengan sel yang dapat berisi kode, teks penurunan harga, gambar, atau data lainnya. Untuk tutorial ini saya menggunakan Python Quant Platform, tetapi saya juga dapat merekomendasikan Colaboratory by Google, yang gratis dan berjalan di cloud. Sesampai di sana, cukup pilih "New Python 3 Notebook" di menu "File", dan Anda siap untuk pergi.

Setelah melakukan itu, langkah selanjutnya adalah mengimpor paket pihak ketiga yang kita butuhkan untuk manipulasi data dan visualisasi, dan memberitahu program bahwa kita ingin melihat grafik inline di notebook kita, bukan di jendela terpisah:

 import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline

Catatan sebelum kita mulai menamai variabel pertama kita. Seperti yang sudah saya soroti, keterbacaan adalah salah satu kekuatan Python. Desain bahasa sangat mendukung hal itu, tetapi setiap orang yang menulis kode bertanggung jawab untuk membuatnya dapat dibaca dan dimengerti, tidak hanya untuk orang lain tetapi juga untuk diri mereka sendiri. Seperti yang dinyatakan oleh Hukum Eagleson, "Kode apa pun milik Anda yang belum Anda lihat selama enam bulan atau lebih mungkin juga telah ditulis oleh orang lain."

Aturan praktis yang baik adalah memberi nama komponen program Anda sedemikian rupa sehingga Anda meminimalkan kebutuhan akan komentar terpisah yang menjelaskan apa yang dilakukan program Anda.

Dengan mengingat hal itu, mari kita lanjutkan.

Membuat Laporan Keuangan

Ada banyak cara agar kita dapat bekerja dengan data spreadsheet yang ada di Python. Kita bisa, misalnya, membaca sebuah sheet ke dalam Pandas DataFrame dengan satu baris kode menggunakan perintah read_excel . Jika Anda menginginkan integrasi yang lebih erat dan tautan waktu nyata antara spreadsheet dan kode Python, ada opsi gratis dan komersial yang tersedia untuk menyediakan fungsionalitas itu.

Karena model di sini sangat sederhana, dan untuk memfokuskan kita pada konsep Python, kita akan membuatnya kembali dari awal dalam skrip kita. Di akhir bagian pertama, saya akan menunjukkan bagaimana Anda dapat mengekspor apa yang telah kita buat ke spreadsheet.

Sebagai langkah pertama untuk membuat representasi Python dari laporan keuangan, kita akan membutuhkan struktur data yang sesuai. Ada banyak pilihan, beberapa dibangun ke dalam Python, yang lain dari berbagai perpustakaan, atau kita bisa membuatnya sendiri. Untuk saat ini, mari gunakan Seri dari perpustakaan Pandas untuk melihat fungsionalitasnya:

 years = ['2018A', '2019B', '2020P', '2021P', '2022P', '2023P'] sales = pd.Series(index=years) sales['2018A'] = 31.0 sales

Input ini dan output yang sesuai ditunjukkan di bawah ini:

membuat seri dari perpustakaan python

Dengan tiga baris pertama kami telah membuat struktur data dengan indeks yang terdiri dari tahun (masing-masing ditandai untuk menunjukkan apakah itu Aktual, Anggaran atau Proyeksi), nilai awal (dalam jutaan euro, seperti pada model DCF asli), dan sel kosong (NaN, "Bukan Angka") untuk proyeksi. Baris keempat mencetak representasi data - secara umum, mengetik nama variabel atau objek lain di interpreter interaktif biasanya akan memberi Anda representasi yang masuk akal.

Selanjutnya, kami mendeklarasikan variabel untuk mewakili proyeksi pertumbuhan penjualan tahunan. Pada tahap ini, ini adalah perkiraan titik, angka yang sama seperti pada model DCF asli kami. Kami ingin menggunakan input yang sama terlebih dahulu dan mengonfirmasi bahwa versi Python kami melakukan hal yang sama dan memberikan hasil yang sama seperti versi Excel, sebelum melihat penggantian estimasi titik dengan distribusi probabilitas. Dengan menggunakan variabel ini, kami membuat lingkaran yang menghitung penjualan di setiap tahun dari proyeksi berdasarkan tahun sebelumnya dan tingkat pertumbuhan:

 growth_rate = 0.1 for year in range(1, 6): sales[year] = sales[year - 1] * (1 + growth_rate) sales

Kami sekarang telah memproyeksikan penjualan, bukan NaN:

python dan keuangan: memproyeksikan angka penjualan

Menggunakan pendekatan yang sama, kami melanjutkan melalui laporan keuangan, menyatakan variabel yang kami butuhkan dan melakukan perhitungan yang diperlukan untuk akhirnya sampai pada arus kas bebas. Setelah kami sampai di sana, kami dapat memeriksa apakah yang kami miliki sesuai dengan apa yang dikatakan versi Excel dari model DCF.

 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

Ini memberi kita arus kas bebas:

keluaran arus kas yang didiskon dari python

Satu baris di atas yang mungkin perlu dikomentari pada tahap ini adalah referensi tax_payment kedua. Di sini, kami menerapkan fungsi kecil untuk memastikan bahwa dalam skenario di mana laba sebelum pajak menjadi negatif, kami tidak akan memiliki pembayaran pajak positif. Ini menunjukkan seberapa efektif Anda dapat menerapkan fungsi khusus ke semua sel dalam Seri Pandas atau DataFrame. Fungsi aktual yang diterapkan tentu saja merupakan penyederhanaan. Model yang lebih realistis untuk penilaian yang lebih besar akan memiliki model pajak terpisah yang menghitung pajak tunai aktual yang dibayarkan berdasarkan sejumlah faktor spesifik perusahaan.

Melakukan Penilaian DCF

Setelah sampai pada proyeksi arus kas, sekarang kita dapat menghitung nilai terminal sederhana dan mendiskon semua arus kas kembali ke masa sekarang untuk mendapatkan hasil DCF. Kode berikut memperkenalkan pengindeksan dan pengirisan, yang memungkinkan kita mengakses satu atau lebih elemen dalam struktur data, seperti objek Seri Pandas.

Kami mengakses elemen dengan menulis tanda kurung siku langsung setelah nama struktur. Pengindeksan sederhana mengakses elemen berdasarkan posisinya, dimulai dengan nol, artinya free_cash_flow[1] akan memberi kita elemen kedua. [-1] adalah singkatan untuk mengakses elemen terakhir (arus kas tahun lalu digunakan untuk menghitung nilai terminal), dan menggunakan titik dua memberi kita irisan, artinya [1:] memberi kita semua elemen kecuali yang pertama, karena kami tidak ingin memasukkan tahun bersejarah 2018A dalam penilaian DCF kami.

 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 

keluaran dcf dari perhitungan arus kas diskon python

Itu menyimpulkan bagian pertama dari prototipe kami - kami sekarang memiliki model DCF yang berfungsi, meskipun sangat sederhana, dengan Python.

Mengekspor Data

Sebelum beralih ke simulasi Monte Carlo yang sebenarnya, ini mungkin saat yang tepat untuk menyebutkan kemampuan mengekspor yang tersedia dalam paket Pandas. Jika Anda memiliki objek Pandas DataFrame, Anda dapat menulisnya ke file Excel dengan satu baris menggunakan metode to_excel . Ada fungsi serupa untuk mengekspor ke lebih dari selusin format dan tujuan lain juga.

 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 

contoh output tabel excel yang dihasilkan dengan python

Membuat Distribusi Probabilitas untuk Simulasi Monte Carlo Kami

Sekarang kami siap untuk mengatasi tantangan berikutnya: mengganti beberapa input estimasi titik dengan distribusi probabilitas. Sementara langkah-langkah hingga saat ini mungkin tampak agak rumit dibandingkan dengan membangun model yang sama di Excel, beberapa baris berikut ini akan memberi Anda gambaran tentang betapa kuatnya Python.

Langkah pertama kita adalah memutuskan berapa banyak iterasi yang ingin kita jalankan dalam simulasi. Menggunakan 1.000 sebagai titik awal mencapai keseimbangan antara mendapatkan titik data yang cukup untuk mendapatkan plot keluaran yang masuk akal, versus menyelesaikan simulasi dalam kerangka waktu yang masuk akal. Selanjutnya, kami menghasilkan distribusi aktual. Demi kesederhanaan, saya membuat tiga distribusi normal di sini, tetapi perpustakaan NumPy memiliki banyak distribusi untuk dipilih, dan ada tempat lain untuk dilihat, termasuk perpustakaan standar Python. Setelah memutuskan distribusi mana yang akan digunakan, kita perlu menentukan parameter yang diperlukan untuk menggambarkan bentuknya, seperti mean dan standar deviasi, dan jumlah hasil yang diinginkan.

 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() 

keluaran simulasi monte carlo dari python

Di sini Anda dapat berargumen bahwa EBITDA tidak boleh menjadi variabel acak terpisah yang independen dari penjualan, melainkan berkorelasi dengan penjualan sampai tingkat tertentu. Saya setuju dengan ini, dan menambahkan bahwa itu harus didorong oleh pemahaman yang kuat tentang dinamika struktur biaya (biaya variabel, semi-variabel dan tetap) dan pemicu biaya utama (beberapa di antaranya mungkin memiliki distribusi probabilitasnya sendiri, seperti misalnya harga komoditas input), tetapi kerumitan itu saya kesampingkan di sini demi ruang dan kejelasan.

Semakin sedikit data yang Anda miliki untuk menginformasikan pilihan distribusi dan parameter Anda, semakin Anda harus mengandalkan hasil dari berbagai alur kerja uji tuntas Anda, dikombinasikan dengan pengalaman, untuk membentuk pandangan konsensus tentang rentang skenario yang mungkin. Dalam contoh ini, dengan proyeksi arus kas, akan ada komponen subjektif yang besar, yang berarti bahwa memvisualisasikan distribusi probabilitas menjadi penting. Di sini, kita bisa mendapatkan visualisasi dasar, yang menunjukkan distribusi pertumbuhan penjualan, hanya dengan dua baris kode pendek. Dengan cara ini kami dapat dengan cepat melihat distribusi apa pun ke bola mata yang paling mencerminkan pandangan kolektif tim.

Sekarang kita memiliki semua blok bangunan yang kita butuhkan untuk menjalankan simulasi, tetapi mereka tidak dalam format yang nyaman untuk menjalankan simulasi. Berikut adalah kode yang sama yang telah kami kerjakan sejauh ini tetapi semuanya dikumpulkan dalam satu sel dan disusun ulang menjadi fungsi untuk kenyamanan:

 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

Sekarang kita dapat menjalankan seluruh simulasi dan memplot distribusi output, yang akan menjadi nilai arus kas yang didiskontokan dari perusahaan ini di setiap 1.000 iterasi, dengan kode berikut. Perintah %time bukan kode Python tetapi steno notebook yang mengukur waktu untuk menjalankan sesuatu (Anda dapat menggunakan fungsi Python dari pustaka standar). Itu tergantung pada komputer tempat Anda menjalankannya, tetapi versi ini membutuhkan 1-2 detik untuk menjalankan 1.000 iterasi dan memvisualisasikan hasilnya.

 %time plt.hist(run_mcs(), bins=20, color='r') plt.show() 

keluaran simulasi monte carlo dari skrip python

2. Menyempurnakan Prototipe

Kecurigaan yang mengintai bahwa sesuatu dapat disederhanakan adalah sumber tantangan yang paling berharga di dunia. - Edsger Dijkstra

Refactoring mengacu pada proses penulisan ulang kode yang ada untuk memperbaiki strukturnya tanpa mengubah fungsinya, dan ini bisa menjadi salah satu elemen pengkodean yang paling menyenangkan dan bermanfaat. Ada beberapa alasan untuk melakukan ini. Mungkin untuk:

  1. Atur bagian-bagian yang berbeda dengan cara yang lebih masuk akal.
  2. Ganti nama variabel dan fungsi untuk membuat tujuan dan cara kerjanya lebih jelas.
  3. Izinkan dan persiapkan untuk fitur mendatang.
  4. Tingkatkan kecepatan eksekusi, jejak memori, atau pemanfaatan sumber daya lainnya.

Untuk menunjukkan seperti apa satu langkah dalam proses itu, saya membersihkan prototipe yang baru saja kita lalui dengan mengumpulkan semua variabel awal di satu tempat, daripada tersebar di seluruh seperti dalam skrip prototipe, dan mengoptimalkan kecepatan eksekusinya melalui proses yang disebut vektorisasi .

Menggunakan array NumPy memungkinkan Anda untuk mengekspresikan berbagai jenis tugas pemrosesan data sebagai ekspresi array ringkas yang mungkin memerlukan penulisan loop. Praktik mengganti loop eksplisit dengan ekspresi array ini biasanya disebut sebagai vektorisasi. Wes McKinney

Sekarang terlihat lebih bersih dan lebih mudah dipahami:

 # 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

Perbedaan utama yang akan Anda lihat antara versi ini dan versi sebelumnya adalah tidak adanya loop for i in range(iterations) . Menggunakan operasi array NumPy, versi ini berjalan dalam 18 milidetik dibandingkan dengan 1,35 detik untuk versi prototipe - kira-kira 75x lebih cepat.

 %time plt.hist(run_mcs(), bins=20, density=True, color="r") plt.show() 

Contoh operasi array NumPy

Saya yakin bahwa pengoptimalan lebih lanjut dapat dilakukan, karena saya menyusun prototipe dan versi yang disempurnakan dalam waktu singkat semata-mata untuk tujuan tutorial ini.

Mengambilnya Lebih Jauh

Tutorial ini menunjukkan beberapa fitur hebat dari Python, dan jika Anda ingin mengembangkan ini lebih jauh, peluangnya hampir tidak terbatas. Anda bisa misalnya:

  • Mengikis atau mengunduh statistik perusahaan atau sektor yang relevan dari halaman web atau sumber data lain, untuk membantu menginformasikan pilihan asumsi dan distribusi probabilitas Anda.
  • Gunakan Python dalam aplikasi keuangan kuantitatif, seperti dalam algoritme perdagangan otomatis berdasarkan faktor fundamental dan/atau makroekonomi.
  • Bangun kemampuan ekspor yang menghasilkan output dalam spreadsheet dan/atau format presentasi, untuk digunakan sebagai bagian dari tinjauan transaksi internal dan proses persetujuan Anda, atau untuk presentasi eksternal.

Saya bahkan belum menyentuh apa yang juga dapat Anda lakukan dengan berbagai web, ilmu data, dan aplikasi pembelajaran mesin yang telah berkontribusi pada kesuksesan Python.

Ringkasan: Bahasa yang Berguna untuk Kotak Alat Keuangan Anda

Artikel ini memberikan pengantar bahasa pemrograman Python, mencantumkan beberapa alasan mengapa itu menjadi sangat populer di bidang keuangan dan menunjukkan cara membuat skrip Python kecil. Dalam tutorial langkah demi langkah, saya menjelaskan bagaimana Python dapat digunakan untuk pembuatan prototipe berulang, analisis keuangan interaktif, dan untuk kode aplikasi untuk model penilaian, program perdagangan algoritmik, dan banyak lagi.

Bagi saya, pada akhirnya, fitur mematikan dari teknologi Python adalah sangat menyenangkan untuk digunakan! Jika Anda menikmati pemecahan masalah, membangun sesuatu, dan membuat alur kerja lebih efisien, maka saya mendorong Anda untuk mencobanya. Saya akan senang mendengar apa yang telah Anda lakukan dengannya atau yang ingin Anda lakukan dengannya.

Sumber Daya yang Direkomendasikan untuk Profesional Keuangan untuk Belajar Python

  • buku O'Reilly. Saya terutama dapat merekomendasikan:
    • Python for Finance by Yves Hilpisch
    • Learning Python by Mark Lutz
    • Fluent Python by Luciano Ramalho
  • The Python Quants
  • PyCon talks on YouTube
  • Udemy