Niille ammateille, jotka ovat pitkään luottaneet troolaukseen laskentataulukoiden kautta, Python on erityisen arvokas. Amerikkalainen pankki Citigroup on ottanut käyttöön Pythonissa kaatumiskurssin harjoitteluanalyytikoilleen. - Taloustieteilijä
Rahoitusalan ammattilaisilla on jo pitkään ollut pääsy niihin VBA (Visual Basic for Applications) Excelissä rakentaa mukautettuja toimintoja ja automatisoida työnkulkuja. Kun viime vuosina on tullut Google Sheets vakavaksi kilpailijaksi laskentataulukossa, Google Apps -skripti tarjoaa nyt lisävalinnan.
Haluan kuitenkin kiinnittää huomiota kolmanteen vaihtoehtoon, Python-ohjelmointikieli , josta on tullut erittäin suosittu useilla aloilla.
Tässä artikkelissa annan joitain esimerkkejä siitä, mitä voit saavuttaa Pythonilla, aloittaen yleiskatsauksesta itse kielestä ja miksi siitä on tullut niin suosittu niin monilla aloilla, kuten verkkokehitys, koneoppiminen, rahoitus, tiede ja koulutus, vain muutamia mainitakseni. Toinen puolisko koostuu sitten vaiheittaisesta opetusohjelmasta.
Kirjoitan tämän tarkoituksena on auttaa sinua päättämään, näyttääkö Python tarpeeksi kiehtovalta, jotta voit harkita sen lisäämistä taloudelliseen työkalupakkiisi. Jos otat harppauksen, kielen oppimiseen on tarjolla monia sovelluksia, kursseja, videoita, artikkeleita, kirjoja ja blogitekstejä. Teoksen lopussa olen luetellut joitain resursseja, jotka ovat auttaneet minua matkan varrella.
Johdanto ohjelmointiin oli oppimista PERUS päällä Mikä tahansa 1 1980-luvun puolivälissä. Tuolloin BASIC oli yleisin aloittelijan kieli. Muita kieliä, joita käytin 80-luvun lopulla 90-luvun puoliväliin saakka, olivat Pascal ja C, mutta en koskaan käyttänyt niitä millään ammatillisella ominaisuudella, enkä uskonut tarvitsevani tai käyttäneeni ohjelmointitaitoja. Tietojeni mukaan tuolloin 90-luvun lopulla rahoitus ja ohjelmointi olivat hyvin erilaisia aloja, kun päätin aloittaa uran rahoituksen alalla.
Nopeasti eteenpäin vuoteen 2012, ja halusin valita ohjelmoinnin takaisin harrastuksena, joten aloin tutkia tuolloin käytettävissä olevia kieliä. Kävi ilmi, että oli tapahtunut melko vähän, ja kun törmäsin Pythoniin, olin koukussa monista syistä, jotka esitän seuraavassa osassa. Siitä lähtien olen käyttänyt Pythonia monenlaisiin tehtäviin pienistä skripteistä suurempiin projekteihin, henkilökohtaisesti ja ammattimaisesti. Monilla, mutta ei kaikilla, on ollut mukana laskentataulukoita, monien rahoitusalan ammattilaisten työpöytä.
Tässä on muutama esimerkki siitä, kuinka hyvin laskentataulukot ja Python voivat toimia yhdessä:
Työskentelen yrityskauppojen kaikilla osa-alueilla, paitsi toteutuksen, myös integraation kanssa. Äskettäisessä tapauksessa PMO-tiimi päätti hybridiohjelmasta ja projektinhallinnasta, käyttäen vesiputoussuunnittelua ja Gantt-kaavioita korkean tason suunnitelmille jokaiselle kahdestatoista integrointityön virrasta, Kanban-hallituksen lisäksi satojen meneillään olevien toimien seuraamiseksi. päällä milloin tahansa, ensimmäisessä 100 päivän suunnitelmassa ja sen jälkeen. Valittu Kanban-työkalu MeisterTask , sisältää useita tilasto- ja raportointiominaisuuksia, mutta tarpeemme ylittivät analyysin ja esityksen suhteen, mikä vaati mukautettua ratkaisua. Tämä on työnkulku, jonka automatisoin Pythonilla:
Komentosarjan kehittäminen vaati muutaman tunnin ennakkomaksun, mutta nyt raportointipaketin päivittäminen ohjauskomitean kokouksiin tai tapausanalyysiin kestää muutaman minuutin. Kirjaimellisesti noin 30 sekuntia siirtyäksesi oikeaan kansioon ja suorittamalla komentosarja yksirivisellä komennolla, ja sitten muutama minuutti kopioida ja liittää ulostulo dian kannelle. Kun noin 500 aktiviteettia (korttia) on kulunut kahdentoista työn aikana, noin kuukauden kuluttua toteutuksesta, viikoittainen seuranta niiden liikkumisesta kahden vuoden ohjelman aikajanalla, löydät itsesi nopeasti käsittelemään tuhansia ja lopulta kymmeniä tuhansia datapisteitä kymmenissä tiedostoja. Ilman automaatiota puhumme täällä joistakin erittäin tylsäistä tehtävistä.
Rahan aika-arvoinen kompromissi pelkän asioihin pääsyn tai alkuperäisen työmäärän lisäämisen asettamalla automaatio on yleinen aihe rahoituksessa. Tein samanlaisen päätöksen tämän prosessin ensimmäisessä vaiheessa viemällä tiedot CSV-tiedostoina. MeisterTask, kuten monet modernit verkkosovellukset, on API , joka voidaan liittää Python-sovellukseesi, mutta sen asettamiseen käytetty aika olisi paljon suurempi kuin tässä tapauksessa käytetyn tapauksen säästöt.
Joten, kuten näette, usein optimaalinen ratkaisu on automatisoida tietyt työnkulun vaiheet ja pitää muut manuaalisesti.
Toinen esimerkki on asia, jonka tein henkilökohtaisesta kiinnostuksesta, mutta haluan korostaa sen, koska se sisältää joitain muita mielenkiintoisia elementtejä Pythonin apuohjelmasta:
Tulokset voidaan yhdistää omiin henkilökohtaisiin painotuksiisi mieltymysten ja taloudellisten rajoitusten suhteen, kun etsit kiinteistöä.
Nämä ovat vain kaksi esimerkkiä, jotka keskittyvät taulukkolaskentaan liittyvän työn automatisointiin ja ominaisuuksien lisäämiseen, mutta mahdollisuudet Pythonilla ovat lähes rajattomat. Seuraavassa osassa esitän syyt, miksi siitä on tullut niin suosittu, ennen kuin siirrytään vaiheittaiseen Monte Carlon simulointioppaaseen Pythonissa.
Ohjelmointikieli Python on ollut käytössä vuodesta 1990, mutta vasta viime vuosina sen suosio on räjähtänyt.
Tähän on useita syitä, katsotaanpa kutakin peräkkäin.
Korkean tason ohjelmointikieli on sellainen, joka tiivistää monia tietokoneen sisäisen toiminnan yksityiskohtia. Hyvä esimerkki on muistin hallinta. Alemman tason ohjelmointikielet edellyttävät tehtävien käsittelemiseen tarvittavan ajan ja koodirivien lisäksi yksityiskohtaista ymmärrystä tietokoneen muistin sijoittelun, allokoinnin ja vapauttamisen monimutkaisuudesta. Python tiivistää ja käsittelee monet näistä yksityiskohdista automaattisesti, jolloin voit keskittyä siihen, mitä haluat saavuttaa.
Koska Python on korkean tason ohjelmointikieli, koodi on ytimekkäämpi ja melkein kokonaan keskittynyt saavutettavan liiketoiminnan logiikkaan teknisen toteutuksen yksityiskohtien sijaan. Kielisuunnitteluvaihtoehdot myötävaikuttavat tähän: Python ei esimerkiksi vaadi kiharaa aaltosulkeita tai puolipisteitä funktioiden, silmukoiden ja viivojen määrittelemiseksi samalla tavalla kuin monet muut kielet, mikä tekee siitä suppeamman ja, kuten jotkut väittävät, parantaa luettavuus.
Yksi havainto, joka on vaikuttanut kielen suunnitteluun Pythonissa, on se, että ohjelmia luetaan useammin kuin kirjoitetaan. Python on loistava tässä, koska sen koodi näyttää hyvin lähellä tavallista englantia, varsinkin jos nimität skriptin tai ohjelman eri komponentit järkevällä tavalla.
Valaistunut kokeilu ja virhe ovat parempia kuin virheetön äly. - David Kelley
Python on ihanteellinen prototyyppien luomiseen ja nopeaan, iteratiiviseen kehitykseen (ja kyllä, kokeiluvirheisiin), koska interaktiiviset tulkkityökalut, kuten Python-kuori , IPython- ja Jupyter-muistikirjat ovat edessä ja keskellä Python-työkaluketjussa. Näissä vuorovaikutteisissa ympäristöissä voit kirjoittaa ja suorittaa jokaisen koodirivin erikseen ja nähdä tulokset (tai hyödyllisen virhesanoman) välittömästi. Myös muilla kielillä on tämä, mutta useimmissa tapauksissa ei samassa määrin kuin Python .
Sen lisäksi, että Python on loistava prototyyppien valmistamiseen, se on myös erinomainen ja tehokas kieli suuriin tuotantosovelluksiin. Jotkut maailman suurimmista ohjelmistoyrityksistä käyttävät Pythonia voimakkaasti useissa sovelluksissa ja käyttötapauksissa.
Kaikki perustoimintojen edellyttämä osa on rakennettu suoraan kielelle, mutta sen lisäksi Python-standardikirjasto on työkaluja tiedostojen, median, verkkoyhteyksien, päivämäärä- ja aikatietojen ja paljon muuta käsittelemiseen. Tämän avulla voit suorittaa monenlaisia tehtäviä ilman, että sinun tarvitsee etsiä kolmannen osapuolen paketteja.
Rahoitusalan ammattilaisille Pandas sen kanssa Datakehys ja Sarja esineitä, ja Numpy sen kanssa ndarray ovat taloudellisen analyysin työhevoset Pythonin kanssa. Yhdessä matplotlibin ja muiden visualisointikirjastojen kanssa sinulla on käytettävissään upeita työkaluja tuottavuuden parantamiseksi.
Python on kehitetty avoimen lähdekoodin lisenssillä, joten se on ilmainen myös kaupalliseen käyttöön.
Seuraavassa on vaiheittainen opetusohjelma, joka näyttää yksinkertaistetun version luomisesta Monte Carlon simulaatiosta, joka on kuvattu edellinen blogikirjoitukseni , mutta käyttämällä Pythonia @RISK-laajennuksen sijaan Excelille.
Monte Carlo -menetelmät perustuvat satunnaisotantaan numeeristen tulosten saamiseksi. Yksi tällainen sovellus on piirtää satunnaisotoksia todennäköisyysjakaumasta, joka edustaa epävarmoja mahdollisia tulevaisuuden maailmatiloja, joissa muuttujat tai oletukset voivat saada arvoja.
On hyödyllistä tehdä Monte Carlon simulointi yksinkertaistetulla DCF-arvostusmallilla sen sijaan, että näet yleisempien esimerkkien, jotka osoittavat optioiden tai muiden johdannaisten arvostuksen, koska tähän ei tarvita mitään matematiikkaa tilinpäätöksen laskennan perusteiden lisäksi. diskonttaamalla kassavirrat, jolloin voimme keskittyä Python-konsepteihin ja -työkaluihin. Huomaa kuitenkin, että tämä perusopetusmalli on tarkoitettu havainnollistamaan keskeisiä käsitteitä, eikä se ole hyödyllinen sellaisenaan käytännön tarkoituksiin. En aio koskea myöskään Monte Carlon simulaatioiden akateemisempia näkökohtia.
Opetusohjelmassa oletetaan, että olet perehtynyt ohjelmoinnin perusrakenteisiin, kuten muuttujiin ja toimintoihin. Jos ei, voi olla hyödyllistä käyttää 10 minuuttia esimerkiksi avainkäsitteiden tarkistamiseen tämä johdanto .
Aloitan samalla hyvin yksinkertaistetulla DCF-arvostusmallilla, jota käytettiin Monte Carlon simulaatio-opetusohjelmassa. Siinä on joitain keskeisiä rivikohtia kolmesta tilinpäätöksestä ja kolme korostettua syöttösolua, joilla Excel-versiossa on pistearvioita, jotka haluamme nyt korvata todennäköisyysjakaumilla, jotta voimme alkaa tutkia mahdollisia tulosalueita.
Tee se toimimaan, tee se oikein, tee se nopeasti - Kent Beck
Tämän opetusohjelman tarkoituksena on antaa Pythonille uusille rahoitusalan ammattilaisille johdanto paitsi siihen, miltä hyödyllinen ohjelma voi näyttää, myös johdanto iteratiiviseen prosessiin, jota voit käyttää sen kehittämiseen. Siksi sillä on kaksi osaa:
Jupyter-muistikirja on loistava työkalu Pythonin kanssa vuorovaikutteiseen työskentelyyn. Se on interaktiivinen Python-tulkki, jossa on soluja, jotka voivat sisältää koodia, Markdown-tekstiä, kuvia tai muuta tietoa. Tässä opetusohjelmassa käytin Python Quant -alusta , mutta voin myös suositella Googlen yhteistyö , joka on ilmainen ja toimii pilvessä. Kun olet siellä, valitse 'Uusi Python 3 -muistikirja' Tiedosto-valikosta, ja olet valmis menemään.
Kun tämä on tehty, seuraava askel on tuoda kolmannen osapuolen paketit, joita tarvitsemme tietojen käsittelyyn ja visualisointeihin, ja kertoa ohjelmalle, että haluamme nähdä kaaviot inline-muistikirjassa erillisten ikkunoiden sijaan:
import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline
Huomautus ennen kuin aloitamme ensimmäisten muuttujiemme nimeämisen. Kuten jo korostin, luettavuus on yksi Pythonin vahvuuksista. Kielisuunnittelu tukee pitkälti sitä, mutta jokainen koodin kirjoittaja on vastuussa sen tekemisestä luettavaksi ja ymmärrettäväksi paitsi muille myös itselleen. Kuten Eaglesonin laki sanoo: 'Kaikki omat koodisi, joita et ole katsonut kuusi tai enemmän kuukautta, ovat yhtä hyvin kirjoittaneet.'
Hyvä nyrkkisääntö on nimetä ohjelman komponentit siten, että minimoisit tarpeen tarvita erillisiä kommentteja, jotka selittävät ohjelmasi.
Siirrymme tässä mielessä eteenpäin.
On olemassa monia tapoja, joilla voimme työskennellä olemassa olevien laskentataulukoiden tietojen kanssa Pythonissa. Voisimme esimerkiksi lukea taulukon Pandas DataFrame-kehykseksi yhdellä koodirivillä read_excel
komento. Jos haluat tiukemman integraation ja reaaliaikaisen linkin laskentataulukon ja Python-koodin välille, on molempia vapaa ja kaupallinen käytettävissä olevat vaihtoehdot kyseisen toiminnon tarjoamiseksi.
Koska tässä oleva malli on hyvin yksinkertainen ja keskitämme meidät Python-käsitteisiin, luomme sen uudelleen tyhjästä käsikirjoituksessamme. Ensimmäisen osan lopussa näytän, kuinka voit viedä luomamme taulukkoon.
Ensimmäisenä askeleena kohti Python-esityksen luomista tilinpäätökselle tarvitsemme sopivan tietorakenteen. Valittavana on monia, jotkut sisäänrakennettuina Pythonissa, toiset eri kirjastoista, tai voimme luoda oman. Käytä nyt Pandas-kirjaston sarjaa katsomaan sen toimivuutta:
years = ['2018A', '2019B', '2020P', '2021P', '2022P', '2023P'] sales = pd.Series(index=years) sales['2018A'] = 31.0 sales
Tämä tulo ja sitä vastaava lähtö on esitetty alla:
Kolmen ensimmäisen rivin avulla olemme luoneet tietorakenteen, jossa on vuosiluku (jokainen merkitty osoittamaan, onko se todellinen, budjetti vai ennustettu), lähtöarvo (miljoonina euroina, kuten alkuperäisessä DCF-mallissa) ja tyhjät (NaN, 'Not a Number') solut ennusteita varten. Neljäs rivi tulostaa datan esityksen - yleensä kirjoittamalla muuttujan tai muun objektin nimi interaktiiviseen tulkkiin saat yleensä järkevän esityksen siitä.
Seuraavaksi ilmoitamme muuttujan edustavan ennakoitua vuotuista myynnin kasvua. Tässä vaiheessa se on pisteestimaatti, sama luku kuin alkuperäisessä DCF-mallissamme. Haluamme ensin käyttää samoja tuloja ja vahvistaa, että Python-versiomme toimii samalla tavalla ja antaa saman tuloksen kuin Excel-versio, ennen kuin tarkastelemme piste-estimaattien korvaamista todennäköisyysjakaumilla. Tämän muuttujan avulla luomme silmukan, joka laskee ennusteiden myynnin kullekin vuodelle edellisen vuoden ja kasvun perusteella:
growth_rate = 0.1 for year in range(1, 6): sales[year] = sales[year - 1] * (1 + growth_rate) sales
Meillä on nyt ennustettu myynti NaN: n sijaan:
Samaa lähestymistapaa noudattaen jatkamme tilinpäätöstä, ilmoitamme muuttujia tarpeen mukaan ja teemme tarvittavat laskelmat, jotta lopulta saadaan vapaa kassavirta. Saavuttuamme voimme tarkistaa, että mitä meillä on, vastaa DCF-mallin Excel-versiota.
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
Tämä antaa meille vapaat kassavirrat:
Yläpuolella oleva rivi, joka ehkä tarvitsee kommentin tässä vaiheessa, on toinen tax_payment
viite. Tässä käytämme pientä toimintoa varmistaaksemme, että tilanteissa, joissa voitto ennen veroja tulee negatiiviseksi, meillä ei ole positiivista veromaksua. Tämä osoittaa, kuinka tehokkaasti voit käyttää mukautettuja toimintoja kaikkiin Pandas-sarjan tai DataFrame-kehyksen soluihin. Varsinainen toiminto on tietysti yksinkertaistaminen. Realistisempi malli a suurempi arvostus olisi erillinen veromalli, joka laskee maksetut todelliset käteisverot useiden yrityskohtaisten tekijöiden perusteella.
Saatuamme ennustetut kassavirrat, voimme nyt laskea yksinkertaisen päätearvon ja diskontata kaikki kassavirrat takaisin nykyhetkeen saadaksesi DCF-tuloksen. Seuraava koodi esittelee indeksoinnin ja viipaloinnin, jonka avulla voimme käyttää yhtä tai useampaa tietorakenteen elementtiä, kuten Pandas Series -objektia.
Pääset elementteihin kirjoittamalla hakasulkeet suoraan rakenteen nimen jälkeen. Yksinkertainen indeksointi käyttää elementtejä sijainnin mukaan nollasta alkaen, mikä tarkoittaa, että free_cash_flow[1]
antaisi meille toisen elementin. [-1]
on lyhenne viimeiseen elementtiin pääsemiseksi (viimeisen vuoden kassavirtaa käytetään päätearvon laskemiseen), ja kaksoispisteen käyttäminen antaa meille osan, mikä tarkoittaa, että [1:]
antaa meille kaikki elementit paitsi ensimmäisen, koska emme halua sisällyttää historiallista vuotta 2018A
DCF-arvostuksessamme.
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
Tämä päättää prototyyppimme ensimmäisen osan - meillä on nyt toimiva DCF-malli, vaikkakin hyvin alkeellinen, Pythonissa.
Ennen siirtymistä varsinaiseen Monte Carlon simulaatioon, tämä saattaa olla hyvä aika mainita Pandas-paketissa käytettävissä olevat vientitoiminnot. Jos sinulla on Pandas DataFrame -objekti, voit kirjoittaa sen Excel-tiedostoon yhdellä rivillä to_excel
menetelmä. Vastaavia toimintoja voidaan viedä myös yli tusinaan muuhun muotoon ja kohteeseen.
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
Nyt olemme valmiita vastaamaan seuraavaan haasteeseen: korvaamaan osa piste-estimaatin syötteistä todennäköisyysjakaumilla. Vaikka vaiheet tähän pisteeseen ovat saattaneet tuntua jonkin verran hankalilta verrattuna saman mallin rakentamiseen Excelissä, nämä seuraavat rivit antavat sinulle vilauksen siitä, kuinka tehokas Python voi olla.
Ensimmäinen askel on päättää, kuinka monta iteraatiota haluamme suorittaa simulaatiossa. 1000: n käyttäminen lähtökohtana saavuttaa tasapainon riittävien datapisteiden saamisen välillä järkevien tuloskaavioiden saamiseksi verrattuna simulaation loppuun saamiseen järkevässä ajassa. Seuraavaksi muodostamme todelliset jakaumat. Yksinkertaisuuden vuoksi tuotin kolme normaalijakaumaa täällä, mutta NumPy-kirjastossa on paljon jakeluja valita, ja on muitakin paikkoja etsiä, mukaan lukien Python-standardikirjasto . Kun olemme päättäneet käytettävän jakauman, meidän on määritettävä niiden muodon kuvaamiseen tarvittavat parametrit, kuten keskiarvo ja keskihajonta sekä haluttujen tulosten lukumäärä.
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()
Täällä voit väittää, että käyttökatteen ei pitäisi olla erillinen satunnaismuuttuja, joka on riippumaton myynnistä, vaan korreloi sen kanssa jossain määrin. Hyväksyn tämän ja lisäisin, että sen tulisi perustua vankkaan ymmärrykseen kustannusrakenteen dynamiikasta (muuttujat, puolimuuttujat ja kiinteät kustannukset) ja tärkeimmistä kustannustekijöistä (joista joillakin voi olla omat todennäköisyysjakaumansa) kuten esimerkiksi raaka-ainehinnat), mutta jätän nämä monimutkaisuudet sivuun tilaa ja selkeyden vuoksi.
Mitä vähemmän tietoja sinun on ilmoitettava valinnastasi jakelu ja parametrit, sitä enemmän joudut luottamaan erilaisten due diligence -työnkulkujen tulokseen yhdistettynä kokemukseen muodostaaksesi konsensuskuvan todennäköisten skenaarioiden alueista. Tässä esimerkissä kassavirtaennusteiden kanssa tulee olemaan suuri subjektiivinen komponentti, mikä tarkoittaa, että todennäköisyysjakaumien visualisointi tulee tärkeäksi. Täältä voimme saada perusvisualisoinnin, joka näyttää myynnin kasvun jakauman, vain kahdella lyhyellä koodirivillä. Näin voimme nopeasti tarkastella mitä tahansa silmämunan jakaumaa, joka parhaiten heijastaa joukkueen kollektiivista näkemystä.
Nyt meillä on kaikki tarvitsemamme rakennuspalikat simulaation suorittamiseen, mutta ne eivät ole sopivassa muodossa simulaation suorittamiseen. Tässä on sama koodi, jonka kanssa olemme työskennelleet toistaiseksi, mutta kaikki on koottu yhteen soluun ja järjestetty uudelleen toimintoon mukavuuden vuoksi:
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
Voimme nyt suorittaa koko simulaation ja piirtää tuotosjakauman, joka on tämän yrityksen diskontattu kassavirta-arvo kussakin 1000 iteraatiossa, seuraavalla koodilla. %time
-komento ei ole Python-koodi, vaan muistikirjan lyhenne, joka mittaa ajan jonkin suorittamiseksi (voit sen sijaan käyttää Python-toiminto vakiokirjastosta ). Se riippuu tietokoneesta, jossa suoritat sen, mutta tämä versio tarvitsee 1–2 sekuntia 1000 iteraation suorittamiseksi ja lopputuloksen visualisoimiseksi.
%time plt.hist(run_mcs(), bins=20, color='r') plt.show()
Vielä piilevä epäily siitä, että jotain voisi yksinkertaistaa, on maailman rikkain lähde palkitseviin haasteisiin. - Edsger Dijkstra
Refactoring tarkoittaa nykyisen koodin uudelleenkirjoittamista sen rakenteen parantamiseksi muuttamatta sen toiminnallisuutta, ja se voi olla yksi hauskimmista ja palkitsevimmista koodauksen elementeistä. Tähän voi olla useita syitä. Se voi olla:
Osoittaakseni, miltä yksi vaihe prosessissa saattaa näyttää, siivoin vain käymämme prototyypin keräämällä kaikki alkuperäiset muuttujat yhteen paikkaan, eikä hajallaan kuten prototyyppikomentosarjassa, ja optimoin sen suorittamisnopeuden prosessilla nimeltä vektorisointi .
NumPy-matriisien avulla voit ilmaista monenlaisia tietojenkäsittelytehtäviä ytimekkäinä taulukkolausekkeina, jotka muuten saattavat edellyttää silmukoiden kirjoittamista. Tätä käytäntöä, jolla korvataan eksplisiittiset silmukat matriisilausekkeilla, kutsutaan yleisesti vektoriksi. Wes McKinney
Se näyttää nyt puhtaammalta ja helpommin ymmärrettävältä:
# 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
Tärkein ero, jonka huomaat tämän version ja edellisen välillä, on for i in range(iterations)
: n puuttuminen silmukka. NumPyn matriisitoimintoa käyttämällä tämä versio toimii 18 millisekunnissa verrattuna prototyyppiversiolle 1,35 sekuntiin - suunnilleen 75 kertaa nopeammin.
%time plt.hist(run_mcs(), bins=20, density=True, color='r') plt.show()
Olen varma, että lisäoptimointi on mahdollista, koska kootin sekä prototyypin että hienostetun version lyhyessä ajassa yksinomaan tämän opetusohjelman tarkoituksiin.
Tämä opetusohjelma esitti joitain Pythonin tehokkaita ominaisuuksia, ja jos kehittäisit tätä edelleen, mahdollisuudet ovat melkein rajattomat. Voisit esimerkiksi:
En ole edes käsitellyt sitä, mitä voisit tehdä myös erilaisilla verkko-, datatieteen ja koneoppimissovelluksilla, jotka ovat vaikuttaneet Pythonin menestykseen.
Tässä artikkelissa esiteltiin Python-ohjelmointikieli, lueteltiin joitain syitä, miksi siitä on tullut niin suosittua rahoituksessa, ja osoitettiin, kuinka rakentaa pieni Python-komentosarja. Vaiheittainen opetusohjelma kävelin läpi, kuinka Pythonia voidaan käyttää iteratiiviseen prototyyppiin, interaktiiviseen taloudelliseen analyysiin ja sovelluskoodiin arvostusmalleille, algoritmisille kaupankäyntiohjelmille ja muille.
Minulle päivän lopussa Python-tekniikan tappajaominaisuus on, että sen kanssa on yksinkertaisesti hauskaa työskennellä! Jos pidät ongelmanratkaisusta, asioiden rakentamisesta ja työnkulkujen tehostamisesta, kannustan sinua kokeilemaan sitä. Haluaisin kuulla, mitä olet tehnyt sen kanssa tai haluaisit tehdä sen kanssa.
Pythonia käytetään enimmäkseen määrälliseen ja laadulliseen analyysiin varojen hintakehityksistä ja ennusteista. Se soveltuu hyvin myös eri tietolähteiden työnkulkujen automatisointiin.
Python suunniteltiin 1980-luvulla ja otettiin ensimmäisen kerran käyttöön joulukuussa 1989.
Python on muokattava, yleinen ohjelmointikieli, jossa on käyttötapauksia useilla aloilla. Huolehtimalla sovelluksen ohjelmoinnista se antaa ohjelmoijan keskittyä luomisensa toimivuuteen.