Προσβασιμότητα στον Ιστό: Γιατί τα πρότυπα W3C συχνά αγνοούνται
Επιστήμη Δεδομένων Και Βάσεις Δεδομένων
Για επαγγέλματα που βασίζονταν εδώ και καιρό στην τράτα μέσω υπολογιστικών φύλλων, η Python είναι ιδιαίτερα πολύτιμη. Η Citigroup, μια αμερικανική τράπεζα, έχει εισαγάγει μια σειρά μαθημάτων συντριβής στο Python για τους εκπαιδευόμενους αναλυτές της. - Ο οικονομολόγος
Οι επαγγελματίες των οικονομικών είχαν από καιρό πρόσβαση σε VBA (Visual Basic for Applications) στο Excel για να δημιουργήσετε προσαρμοσμένες λειτουργίες και να αυτοματοποιήσετε τις ροές εργασίας. Με την εμφάνιση των φύλλων Google τα τελευταία χρόνια ως σοβαρός υποψήφιος στο χώρο του υπολογιστικού φύλλου, Σενάριο Εφαρμογών Google προσφέρει τώρα μια επιπλέον επιλογή.
Ωστόσο, θα ήθελα να επιστήσω την προσοχή σε μια τρίτη επιλογή, τη γλώσσα προγραμματισμού Python , το οποίο έχει γίνει εξαιρετικά δημοφιλές σε διάφορους τομείς.
Σε αυτό το άρθρο, θα παράσχω μερικά παραδείγματα για το τι μπορείτε να πετύχετε με την Python, ξεκινώντας από μια επισκόπηση της ίδιας της γλώσσας και γιατί έχει γίνει τόσο δημοφιλής σε μια τόσο μεγάλη ποικιλία τομέων, που κυμαίνονται από την ανάπτυξη ιστού, τη μηχανική μάθηση, τα χρηματοοικονομικά, επιστήμη και εκπαίδευση, για να αναφέρουμε μόνο μερικά. Στη συνέχεια, το δεύτερο ημίχρονο θα αποτελείται από ένα βήμα προς βήμα φροντιστήριο.
Ο στόχος μου να το γράψω είναι να σας βοηθήσω να αποφασίσετε εάν η Python φαίνεται αρκετά ενδιαφέρουσα για να μπορείτε να το προσθέσετε στην οικονομική σας εργαλειοθήκη. Εάν κάνετε το άλμα, υπάρχουν πολλές εφαρμογές, μαθήματα, βίντεο, άρθρα, βιβλία και αναρτήσεις ιστολογίου για να μάθετε τη γλώσσα. Στο τέλος του κομματιού, έχω αναφέρει μερικούς πόρους που με βοήθησαν στην πορεία.
Η εισαγωγή μου στον προγραμματισμό ήταν η μάθηση ΒΑΣΙΚΟΣ σε ένα Οποιοδήποτε 1 στα μέσα της δεκαετίας του 1980. Τότε το BASIC ήταν η πιο κοινή γλώσσα για αρχάριους. Άλλες γλώσσες με τις οποίες έμαθα στα τέλη της δεκαετίας του '80 έως τα μέσα της δεκαετίας του '90 ήταν οι Pascal και C, αλλά δεν τις χρησιμοποίησα ποτέ με επαγγελματική ιδιότητα και δεν περίμενα να χρειαστεί ή να χρησιμοποιήσω δεξιότητες προγραμματισμού. Από όσα γνωρίζω στα τέλη της δεκαετίας του '90, η χρηματοδότηση και ο προγραμματισμός ήταν πολύ διαφορετικοί τομείς, όταν επέλεξα να ξεκινήσω μια καριέρα στα οικονομικά.
σχεδιασμός λογιστικού σχεδίου βέλτιστων πρακτικών
Γρήγορα προς τα εμπρός στο 2012, και ήθελα να επιλέξω τον προγραμματισμό ως χόμπι, οπότε άρχισα να ερευνώ τις διαθέσιμες γλώσσες εκείνη τη στιγμή. Αποδείχθηκε ότι είχε συμβεί λίγο, και όταν συνάντησα την Python ήμουν γοητευμένος, για πολλούς από τους λόγους που θα περιγράψω στην επόμενη ενότητα. Από τότε έχω χρησιμοποιήσει το Python για ένα ευρύ φάσμα εργασιών, από μικρά σενάρια έως μεγαλύτερα έργα, τόσο προσωπικά όσο και επαγγελματικά. Πολλοί, αλλά όχι όλοι, έχουν ασχοληθεί με υπολογιστικά φύλλα, τον πάγκο εργασίας πολλών επαγγελματιών στον τομέα των οικονομικών.
Ακολουθούν μερικά παραδείγματα για το πόσο καλά μπορούν να συνδυαστούν τα υπολογιστικά φύλλα και η Python:
Δουλεύω με όλες τις πτυχές των συναλλαγών M&A, όχι μόνο την εκτέλεση, αλλά και την ολοκλήρωση. Σε μια πρόσφατη περίπτωση, η ομάδα του PMO αποφάσισε ένα υβριδικό πρόγραμμα και προσέγγιση διαχείρισης έργου, χρησιμοποιώντας καταρράκτες και γραφήματα Gantt για σχέδια υψηλού επιπέδου για καθεμία από τις δώδεκα ροές εργασίας ολοκλήρωσης, εκτός από ένα συμβούλιο Kanban για την παρακολούθηση των εκατοντάδων δραστηριοτήτων που σε οποιαδήποτε δεδομένη στιγμή, στο πρώτο πλάνο 100 ημερών και μετά. Το εργαλείο Kanban που επιλέχθηκε, MeisterTask , έχει μια σειρά από στατιστικά στοιχεία και δυνατότητες αναφοράς, αλλά οι ανάγκες μας ξεπέρασαν αυτό από την άποψη της ανάλυσης και της παρουσίασης, η οποία απαιτούσε μια προσαρμοσμένη λύση. Αυτή είναι η ροή εργασίας που αυτοματοποίησα χρησιμοποιώντας το Python:
Η ανάπτυξη του σεναρίου απαιτούσε μια προκαταρκτική επένδυση για λίγες ώρες, αλλά τώρα, η ενημέρωση του πακέτου αναφοράς για τις συνεδριάσεις της συντονιστικής επιτροπής ή την ad hoc ανάλυση διαρκεί λίγα λεπτά. Κυριολεκτικά, περίπου 30 δευτερόλεπτα για να μεταβείτε στον σωστό φάκελο και να εκτελέσετε το σενάριο με μια εντολή μιας γραμμής και, στη συνέχεια, μερικά λεπτά για να αντιγράψετε-επικολλήσετε την έξοδο στο διαφανές κατάστρωμα. Με περίπου 500 δραστηριότητες (κάρτες) σε δώδεκα ροές εργασίας ήδη περίπου ένα μήνα σε εκτέλεση, εβδομαδιαία παρακολούθηση του τρόπου με τον οποίο κινούνται, μέσα σε ένα χρονοδιάγραμμα προγράμματος δύο ετών, βρίσκεστε γρήγορα να αντιμετωπίζετε χιλιάδες και τελικά δεκάδες χιλιάδες σημεία δεδομένων σε δεκάδες αρχείων. Χωρίς αυτοματισμό, μιλάμε για μερικές πολύ κουραστικές εργασίες εδώ.
Η «χρονική αξία του χρήματος» ανταλλάσσεται μεταξύ της απλής μετάβασης με πράγματα ή της προσθήκης πιο αρχικού φόρτου εργασίας με τη ρύθμιση της αυτοματοποίησης είναι ένα κοινό θέμα στα οικονομικά. Έκανα μια παρόμοια απόφαση με το πρώτο βήμα αυτής της διαδικασίας, εξάγοντας τα δεδομένα ως αρχεία CSV. Το MeisterTask, όπως πολλές σύγχρονες διαδικτυακές εφαρμογές, έχει API , η οποία μπορεί να συνδεθεί με την εφαρμογή σας Python, αλλά ο χρόνος που αφιερώθηκε στη ρύθμιση θα υπερέβαινε κατά πολύ την εξοικονόμηση χρόνου για τη θήκη χρήσης μας εδώ.
Έτσι, όπως βλέπετε, πολλές φορές η βέλτιστη λύση είναι να αυτοματοποιήσετε ορισμένα βήματα μιας ροής εργασίας και να διατηρήσετε τα άλλα εγχειρίδια.
Ένα άλλο παράδειγμα είναι κάτι που έκανα λόγω προσωπικού ενδιαφέροντος, αλλά θέλω να το τονίσω γιατί περιέχει μερικά άλλα ενδιαφέροντα στοιχεία της χρησιμότητας της Python:
Τα αποτελέσματα εδώ θα μπορούσαν να συνδυαστούν με τους δικούς σας προσωπικούς συντελεστές στάθμισης όσον αφορά τις προτιμήσεις και τους οικονομικούς περιορισμούς κατά την αναζήτηση ακινήτων.
Αυτά είναι μόνο δύο παραδείγματα, που επικεντρώνονται στην αυτοματοποίηση εργασιών που σχετίζονται με υπολογιστικά φύλλα και στην προσθήκη λειτουργιών, αλλά οι ευκαιρίες με την Python είναι σχεδόν ατελείωτες. Στην επόμενη ενότητα, θα περιγράψω τους λόγους για τους οποίους έγινε τόσο δημοφιλές, προτού προχωρήσω σε ένα βήμα προς βήμα σεμινάριο προσομοίωσης Monte Carlo στο Python.
Η γλώσσα προγραμματισμού Python υπάρχει από το 1990, αλλά μόλις τα τελευταία χρόνια η δημοτικότητά της εξερράγη.
Υπάρχουν πολλοί λόγοι για αυτό, ας δούμε ο καθένας με τη σειρά.
Μια γλώσσα προγραμματισμού υψηλού επιπέδου είναι μια γλώσσα που αφαιρεί πολλές από τις λεπτομέρειες της εσωτερικής λειτουργίας του υπολογιστή. Ένα καλό παράδειγμα είναι η διαχείριση μνήμης. Οι γλώσσες προγραμματισμού χαμηλότερου επιπέδου απαιτούν μια λεπτομερή κατανόηση των περιπλοκών του τρόπου με τον οποίο διαμορφώνεται, εκχωρείται και απελευθερώνεται η μνήμη του υπολογιστή, εκτός από τον χρόνο που αφιερώνεται και τις γραμμές κώδικα που απαιτούνται για τον χειρισμό εργασιών. Η Python αφαιρεί και χειρίζεται πολλές από αυτές τις λεπτομέρειες αυτόματα, αφήνοντάς σας να εστιάσετε σε αυτό που θέλετε να πετύχετε.
Επειδή η Python είναι μια γλώσσα προγραμματισμού υψηλού επιπέδου, ο κώδικας είναι πιο περιεκτικός και σχεδόν εξ ολοκλήρου εστιασμένος στην επιχειρηματική λογική του τι θέλετε να επιτύχετε, παρά στις τεχνικές λεπτομέρειες εφαρμογής. Οι επιλογές σχεδιασμού γλώσσας συμβάλλουν σε αυτό: για παράδειγμα, η Python δεν απαιτεί τη χρήση σγουρών στηριγμάτων ή ερωτηματικών για να οριοθετήσει λειτουργίες, βρόχους και γραμμές όπως κάνουν πολλές άλλες γλώσσες, γεγονός που το καθιστά πιο συνοπτικό και, όπως υποστηρίζουν ορισμένοι, βελτιώνεται ευανάγνωστο.
Μια παρατήρηση που επηρέασε τις επιλογές γλωσσικού σχεδιασμού στην Python είναι ότι τα προγράμματα διαβάζονται συχνότερα από ό, τι γράφονται. Η Python υπερέχει εδώ καθώς ο κώδικάς της μοιάζει πολύ με τα απλά αγγλικά, ειδικά αν ονομάζετε τα διάφορα στοιχεία του σεναρίου ή του προγράμματος σας με λογικό τρόπο.
Οι διαφωτισμένες δοκιμές και λάθη υπερτερούν του σχεδιασμού των άψογων διανοητικών. - Ντέιβιντ Κέλεϊ
Το Python είναι ιδανικό για πρωτοτυπία και γρήγορη, επαναληπτική ανάπτυξη (και, ναι, δοκιμή-και-σφάλμα) επειδή διαδραστικά εργαλεία διερμηνείας όπως το κέλυφος Python , Σημειωματάρια IPython και Jupyter βρίσκονται μπροστά και στο κέντρο της εργαλειοθήκης Python. Σε αυτά τα διαδραστικά περιβάλλοντα, μπορείτε να γράψετε και να εκτελέσετε κάθε γραμμή κώδικα μεμονωμένα και να δείτε τα αποτελέσματα (ή ένα χρήσιμο μήνυμα σφάλματος) αμέσως. Άλλες γλώσσες το έχουν και αυτό, αλλά στις περισσότερες περιπτώσεις όχι στον ίδιο βαθμό με την Python .
Εκτός από το ότι είναι εξαιρετικό για πρωτότυπα, το Python είναι επίσης μια εξαιρετική και ισχυρή γλώσσα για μεγάλες εφαρμογές παραγωγής. Μερικές από τις μεγαλύτερες εταιρείες λογισμικού στον κόσμο κάνουν βαριά χρήση του Python σε μια ποικιλία εφαρμογών και περιπτώσεων χρήσης.
Όλα όσα χρειάζονται για βασικές λειτουργίες είναι ενσωματωμένα στη γλώσσα, αλλά εκτός από αυτό, το Πρότυπη βιβλιοθήκη Python διαθέτει εργαλεία για την επεξεργασία αρχείων, μέσων, δικτύωσης, πληροφοριών ημερομηνίας και ώρας και πολλά άλλα. Αυτό σας επιτρέπει να ολοκληρώσετε μια μεγάλη ποικιλία εργασιών χωρίς να χρειάζεται να αναζητήσετε πακέτα τρίτων.
Για επαγγελματίες του χρηματοοικονομικού τομέα, Pandas με το Πλαίσιο δεδομένων και Σειρά αντικείμενα, και Numpy με το ndarray είναι οι εργάτες της οικονομικής ανάλυσης με την Python. Σε συνδυασμό με το matplotlib και άλλες βιβλιοθήκες οπτικοποίησης, έχετε στη διάθεσή σας εξαιρετικά εργαλεία για να βοηθήσετε την παραγωγικότητα.
Το Python έχει αναπτυχθεί με άδεια ανοιχτού κώδικα και το καθιστά δωρεάν και για εμπορική χρήση.
Ακολουθεί ένας οδηγός βήμα προς βήμα που δείχνει πώς να δημιουργήσετε μια απλοποιημένη έκδοση της προσομοίωσης Monte Carlo που περιγράφεται στο η προηγούμενη ανάρτηση στο blog μου , αλλά χρησιμοποιώντας το Python αντί για την προσθήκη @RISK για Excel.
Οι μέθοδοι Monte Carlo βασίζονται σε τυχαία δειγματοληψία για τη λήψη αριθμητικών αποτελεσμάτων. Μία τέτοια εφαρμογή είναι να αντλήσουμε τυχαία δείγματα από μια κατανομή πιθανότητας που αντιπροσωπεύει αβέβαιες πιθανές μελλοντικές καταστάσεις του κόσμου όπου οι μεταβλητές ή οι παραδοχές μπορούν να πάρουν μια σειρά τιμών.
Είναι χρήσιμο να κάνετε την προσομοίωση Monte Carlo σε ένα απλοποιημένο μοντέλο αποτίμησης DCF αντί για τα πιο κοινά παραδείγματα που βλέπετε να δείχνουν αποτίμηση των επιλογών ή άλλων παραγώγων, καθώς για αυτό δεν χρειαζόμαστε μαθηματικά πέρα από τα βασικά στοιχεία του υπολογισμού των οικονομικών καταστάσεων και προεξόφληση ταμειακών ροών, επιτρέποντάς μας να επικεντρωθούμε στις έννοιες και τα εργαλεία της Python. Λάβετε υπόψη ότι αυτό το βασικό μοντέλο εκμάθησης έχει σκοπό να απεικονίσει τις βασικές έννοιες και δεν είναι χρήσιμο ως έχει για πρακτικούς σκοπούς. Επίσης, δεν θα αναφερθώ σε καμία από τις πιο ακαδημαϊκές πτυχές των προσομοιώσεων του Μόντε Κάρλο.
τι είναι το rtl-sdr
Το σεμινάριο προϋποθέτει ότι είστε εξοικειωμένοι με τα βασικά δομικά στοιχεία του προγραμματισμού, όπως μεταβλητές και συναρτήσεις. Εάν όχι, θα ήταν χρήσιμο να χρειαστούν 10 λεπτά για να ελέγξετε τις βασικές έννοιες για παράδειγμα αυτή την εισαγωγή .
Ξεκινώ με το ίδιο πολύ απλοποιημένο μοντέλο αποτίμησης DCF που χρησιμοποιήθηκε στο σεμινάριο προσομοίωσης Monte Carlo. Έχει ορισμένα βασικά στοιχεία γραμμής από τις τρεις οικονομικές καταστάσεις και τρία επισημασμένα κελιά εισαγωγής, τα οποία στην έκδοση Excel έχουν εκτιμήσεις σημείου που τώρα θέλουμε να αντικαταστήσουμε με πιθανές κατανομές για να ξεκινήσουμε να εξερευνούμε πιθανές περιοχές αποτελεσμάτων.
Κάντε το να λειτουργεί, κάντε το σωστό, κάντε γρήγορα - Κεντ Μπεκ
Ο σκοπός αυτού του σεμιναρίου είναι να δώσει στους επαγγελματίες του χρηματοοικονομικού τομέα νέους στην Python μια εισαγωγή όχι μόνο για το πώς μπορεί να μοιάζει ένα χρήσιμο πρόγραμμα, αλλά και μια εισαγωγή στην επαναληπτική διαδικασία που μπορείτε να χρησιμοποιήσετε για να το αναπτύξετε. Επομένως, έχει δύο μέρη:
Το σημειωματάριο Jupyter είναι ένα εξαιρετικό εργαλείο για τη διαδραστική συνεργασία με την Python. Είναι ένας διαδραστικός διερμηνέας Python με κελιά που μπορεί να περιέχει κώδικα, κείμενο κατάργησης, εικόνες ή άλλα δεδομένα. Για αυτό το σεμινάριο χρησιμοποίησα το Πλατφόρμα Python Quant , αλλά μπορώ επίσης να προτείνω Συνεργασία από την Google , το οποίο είναι δωρεάν και εκτελείται στο cloud. Μόλις φτάσετε εκεί, απλά επιλέξτε 'New Python 3 Notebook' στο μενού 'Αρχείο' και είστε έτοιμοι να πάτε.
Μετά από αυτό, το επόμενο βήμα είναι να εισαγάγουμε τα πακέτα τρίτων που χρειαζόμαστε για χειρισμό και οπτικοποίηση δεδομένων και να πούμε στο πρόγραμμα ότι θέλουμε να βλέπουμε γραφήματα στο σημειωματάριό μας, αντί σε ξεχωριστά παράθυρα:
import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline
Μια σημείωση πριν αρχίσουμε να ονομάζουμε τις πρώτες μας μεταβλητές. Όπως ανέφερα ήδη, η αναγνωσιμότητα είναι ένα από τα πλεονεκτήματα της Python. Ο σχεδιασμός της γλώσσας προχωρεί σε μεγάλο βαθμό για να το υποστηρίξει αυτό, αλλά ο καθένας που γράφει κώδικα είναι υπεύθυνος για να τον καταστήσει αναγνώσιμο και κατανοητό, όχι μόνο για τους άλλους αλλά και για τον εαυτό τους. Οπως και Ο νόμος του Eagleson δηλώνει, 'Οποιοσδήποτε δικός σας κώδικας που δεν έχετε εξετάσει για έξι ή περισσότερους μήνες μπορεί επίσης να έχει γραφτεί από κάποιον άλλο.'
Ένας καλός κανόνας είναι να ονομάσετε τα στοιχεία του προγράμματος σας με τέτοιο τρόπο ώστε να ελαχιστοποιήσετε την ανάγκη για ξεχωριστά σχόλια που εξηγούν τι κάνει το πρόγραμμά σας.
Έχοντας αυτό κατά νου, ας προχωρήσουμε.
Υπάρχουν πολλοί τρόποι με τους οποίους μπορούμε να εργαστούμε με τα υπάρχοντα δεδομένα υπολογιστικών φύλλων στο Python. Θα μπορούσαμε, για παράδειγμα, να διαβάσουμε ένα φύλλο σε ένα Pandas DataFrame με μία γραμμή κώδικα χρησιμοποιώντας το read_excel
εντολή. Εάν θέλετε μια πιο αυστηρή σύνδεση και σύνδεση σε πραγματικό χρόνο μεταξύ του υπολογιστικού φύλλου και του κώδικα Python, υπάρχουν και τα δύο Ελεύθερος και εμπορικός διαθέσιμες επιλογές για την παροχή αυτής της λειτουργικότητας.
Δεδομένου ότι το μοντέλο εδώ είναι πολύ απλό, και για να μας εστιάσει στις ιδέες Python, θα το δημιουργήσουμε εκ νέου από το μηδέν στο σενάριό μας. Στο τέλος του πρώτου μέρους, θα δείξω πώς μπορείτε να εξαγάγετε αυτό που έχουμε δημιουργήσει σε ένα υπολογιστικό φύλλο.
Ως πρώτο βήμα προς τη δημιουργία μιας αναπαράστασης των οικονομικών καταστάσεων της Python, θα χρειαστούμε μια κατάλληλη δομή δεδομένων. Υπάρχουν πολλά να διαλέξετε, μερικά ενσωματωμένα στην Python, άλλα από διάφορες βιβλιοθήκες ή μπορούμε να δημιουργήσουμε τη δική μας. Προς το παρόν, ας χρησιμοποιήσουμε μια σειρά από τη βιβλιοθήκη Pandas για να ρίξουμε μια ματιά στη λειτουργικότητά της:
years = ['2018A', '2019B', '2020P', '2021P', '2022P', '2023P'] sales = pd.Series(index=years) sales['2018A'] = 31.0 sales
Αυτή η είσοδος και η αντίστοιχη έξοδος φαίνεται παρακάτω:
οι αγοραστές είναι ιδιαίτερα ευαίσθητοι στις τιμές όταν
Με τις τρεις πρώτες γραμμές έχουμε δημιουργήσει μια δομή δεδομένων με ένα ευρετήριο που αποτελείται από χρόνια (το καθένα σημειώνεται για να δείξει εάν είναι Πραγματικό, Προϋπολογισμός ή Προβλεπόμενο), μια αρχική τιμή (σε εκατομμύρια ευρώ, όπως στο αρχικό μοντέλο DCF) και κενά (NaN, 'Not a Number') κελιά για τις προβολές. Η τέταρτη γραμμή εκτυπώνει μια αναπαράσταση των δεδομένων - σε γενικές γραμμές, πληκτρολογώντας το όνομα μιας μεταβλητής ή άλλων αντικειμένων στο διαδραστικό διερμηνέα θα σας δώσει συνήθως μια λογική αναπαράσταση αυτής.
Στη συνέχεια, δηλώνουμε μια μεταβλητή που αντιπροσωπεύει την προβλεπόμενη ετήσια αύξηση των πωλήσεων. Σε αυτό το στάδιο, είναι μια εκτίμηση σημείου, η ίδια εικόνα με το αρχικό μας μοντέλο DCF. Θέλουμε πρώτα να χρησιμοποιήσουμε αυτές τις ίδιες εισόδους και να επιβεβαιώσουμε ότι η έκδοση Python μας αποδίδει το ίδιο και δίνει το ίδιο αποτέλεσμα με την έκδοση Excel, προτού εξετάσουμε την αντικατάσταση των εκτιμήσεων σημείων με κατανομές πιθανότητας. Χρησιμοποιώντας αυτήν τη μεταβλητή, δημιουργούμε έναν βρόχο που υπολογίζει τις πωλήσεις σε κάθε έτος των προβολών βάσει του προηγούμενου έτους και του ρυθμού ανάπτυξης:
growth_rate = 0.1 for year in range(1, 6): sales[year] = sales[year - 1] * (1 + growth_rate) sales
Έχουμε προβάλλει τώρα πωλήσεις, αντί για NaN:
Χρησιμοποιώντας την ίδια προσέγγιση, συνεχίζουμε τις οικονομικές καταστάσεις, δηλώνοντας τις μεταβλητές που τις χρειαζόμαστε και εκτελούμε τους απαραίτητους υπολογισμούς για να φτάσουμε τελικά σε ελεύθερες ταμειακές ροές. Μόλις φτάσουμε εκεί, μπορούμε να ελέγξουμε ότι αυτό που έχουμε αντιστοιχεί σε αυτό που λέει η έκδοση Excel του μοντέλου 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
Αυτό μας δίνει τις δωρεάν ταμειακές ροές:
Η μία γραμμή παραπάνω που ίσως χρειάζεται ένα σχόλιο σε αυτό το στάδιο είναι η δεύτερη tax_payment
αναφορά. Εδώ, εφαρμόζουμε μια μικρή λειτουργία για να διασφαλίσουμε ότι σε σενάρια όπου τα κέρδη προ φόρων γίνονται αρνητικά, τότε δεν θα έχουμε θετική πληρωμή φόρου. Αυτό δείχνει πόσο αποτελεσματικά μπορείτε να εφαρμόσετε προσαρμοσμένες λειτουργίες σε όλα τα κελιά σε μια σειρά Pandas ή σε DataFrame. Η πραγματική συνάρτηση που εφαρμόζεται είναι, φυσικά, μια απλοποίηση. Ένα πιο ρεαλιστικό μοντέλο για ένα μεγαλύτερος άσκηση αποτίμησης θα είχε ένα ξεχωριστό φορολογικό μοντέλο που υπολογίζει τους πραγματικούς φόρους μετρητών που καταβάλλονται με βάση έναν αριθμό συγκεκριμένων παραγόντων της εταιρείας.
Έχοντας φτάσει στις προβλεπόμενες ταμειακές ροές, μπορούμε τώρα να υπολογίσουμε μια απλή τερματική αξία και να μειώσουμε όλες τις ταμειακές ροές στο παρόν για να λάβουμε το αποτέλεσμα DCF. Ο ακόλουθος κώδικας εισάγει την ευρετηρίαση και τον τεμαχισμό, η οποία μας επιτρέπει να έχουμε πρόσβαση σε ένα ή περισσότερα στοιχεία σε μια δομή δεδομένων, όπως το αντικείμενο της σειράς Pandas.
Έχουμε πρόσβαση σε στοιχεία γράφοντας αγκύλες αμέσως μετά το όνομα της δομής. Η απλή ευρετηρίαση αποκτά πρόσβαση σε στοιχεία από τη θέση τους, ξεκινώντας από το μηδέν, που σημαίνει ότι free_cash_flow[1]
θα μας έδινε το δεύτερο στοιχείο. [-1]
είναι συντομογραφία για την πρόσβαση στο τελευταίο στοιχείο (η ταμειακή ροή του προηγούμενου έτους χρησιμοποιείται για τον υπολογισμό της τελικής αξίας) και η χρήση άνω και κάτω τελείας μας δίνει ένα κομμάτι, που σημαίνει ότι [1:]
μας δίνει όλα τα στοιχεία εκτός από το πρώτο, αφού δεν θέλουμε να συμπεριλάβουμε το ιστορικό έτος 2018A
στην αποτίμηση DCF μας.
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
Αυτό ολοκληρώνει το πρώτο μέρος του πρωτοτύπου μας - έχουμε τώρα ένα μοντέλο DCF που λειτουργεί, αν και ένα πολύ στοιχειώδες, στο Python.
Πριν προχωρήσουμε στην πραγματική προσομοίωση του Μόντε Κάρλο, ίσως είναι η κατάλληλη στιγμή να αναφέρουμε τις δυνατότητες εξαγωγής που διατίθενται στο πακέτο Pandas. Εάν έχετε ένα αντικείμενο Pandas DataFrame, μπορείτε να το γράψετε σε ένα αρχείο Excel με μία γραμμή χρησιμοποιώντας το to_excel
μέθοδος. Υπάρχει παρόμοια λειτουργικότητα για εξαγωγή σε περισσότερες από δώδεκα άλλες μορφές και προορισμούς επίσης.
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
Τώρα είμαστε έτοιμοι να αντιμετωπίσουμε την επόμενη πρόκληση: να αντικαταστήσουμε μερικές από τις εισόδους εκτίμησης σημείου με κατανομές πιθανότητας. Ενώ τα βήματα μέχρι αυτό το σημείο μπορεί να φαίνονται κάπως δυσκίνητα σε σύγκριση με την κατασκευή του ίδιου μοντέλου στο Excel, αυτές οι επόμενες λίγες γραμμές θα σας δώσουν μια ματιά για το πόσο ισχυρό μπορεί να είναι το Python.
Το πρώτο μας βήμα είναι να αποφασίσουμε πόσες επαναλήψεις θέλουμε να εκτελέσουμε στην προσομοίωση. Η χρήση του 1.000 ως σημείο εκκίνησης επιτυγχάνει την ισορροπία μεταξύ της λήψης αρκετών σημείων δεδομένων για τη λήψη λογικών σχεδίων εξόδου, έναντι της ολοκλήρωσης της προσομοίωσης εντός ενός λογικού χρονικού πλαισίου. Στη συνέχεια, δημιουργούμε τις πραγματικές διανομές. Για λόγους απλότητας, δημιούργησα τρεις κανονικές διανομές εδώ, αλλά η βιβλιοθήκη NumPy διαθέτει μεγάλο αριθμό διανομών για να διαλέξετε και υπάρχουν και άλλα μέρη για να δείτε, συμπεριλαμβανομένου του Πρότυπη βιβλιοθήκη Python . Αφού αποφασίσουμε ποια κατανομή θα χρησιμοποιήσουμε, πρέπει να καθορίσουμε τις παραμέτρους που απαιτούνται για να περιγράψουμε το σχήμα τους, όπως μέση και τυπική απόκλιση και τον αριθμό των επιθυμητών αποτελεσμάτων.
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()
Εδώ θα μπορούσατε να υποστηρίξετε ότι το EBITDA δεν πρέπει να είναι μια ξεχωριστή τυχαία μεταβλητή ανεξάρτητη από τις πωλήσεις, αλλά να συσχετίζεται με τις πωλήσεις σε κάποιο βαθμό. Θα συμφωνούσα με αυτό, και θα προσθέσω ότι πρέπει να καθοδηγείται από μια σταθερή κατανόηση της δυναμικής της δομής του κόστους (μεταβλητό, ημι-μεταβλητό και σταθερό κόστος) και των βασικών οδηγών κόστους (μερικά από τα οποία μπορεί να έχουν τις δικές τους κατανομές πιθανότητας, όπως για παράδειγμα τιμές εισροών εμπορευμάτων), αλλά αφήνω αυτές τις πολυπλοκότητες εδώ για χάρη του χώρου και της σαφήνειας.
llc vs s corp vs c corp chart
Όσο λιγότερα δεδομένα έχετε για να ενημερώσετε την επιλογή σας για τη διανομή και τις παραμέτρους, τόσο περισσότερο θα πρέπει να βασιστείτε στο αποτέλεσμα των διαφόρων ροών εργασίας δέουσας επιμέλειας, σε συνδυασμό με την εμπειρία, για να διαμορφώσετε μια συναίνεση σε μια σειρά από πιθανά σενάρια. Σε αυτό το παράδειγμα, με προβολές ταμειακών ροών, θα υπάρχει ένα μεγάλο υποκειμενικό στοιχείο, πράγμα που σημαίνει ότι η οπτικοποίηση των κατανομών πιθανότητας καθίσταται σημαντική. Εδώ, μπορούμε να πάρουμε μια βασική απεικόνιση, που δείχνει την κατανομή της αύξησης των πωλήσεων, με μόνο δύο σύντομες γραμμές κώδικα. Με αυτόν τον τρόπο μπορούμε να δούμε γρήγορα οποιαδήποτε διανομή στο eyeball που αντικατοπτρίζει καλύτερα τη συλλογική άποψη της ομάδας.
Τώρα έχουμε όλα τα δομικά στοιχεία που πρέπει να εκτελέσουμε την προσομοίωση, αλλά δεν είναι σε κατάλληλη μορφή για την εκτέλεση της προσομοίωσης. Εδώ είναι ο ίδιος κώδικας με τον οποίο έχουμε εργαστεί μέχρι στιγμής, αλλά όλοι συγκεντρώθηκαν σε ένα κελί και αναδιατάχθηκαν σε μια συνάρτηση για ευκολία:
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
Τώρα μπορούμε να εκτελέσουμε ολόκληρη την προσομοίωση και να σχεδιάσουμε τη διανομή εξόδου, η οποία θα είναι η προεξοφλημένη αξία ταμειακών ροών αυτής της εταιρείας σε καθεμία από τις 1.000 επαναλήψεις, με τον ακόλουθο κωδικό. Το %time
Η εντολή δεν είναι κωδικός Python αλλά ένα σημειωματάριο που μετρά το χρόνο για να τρέξει κάτι (θα μπορούσατε αντ 'αυτού να χρησιμοποιήσετε τη συνάρτηση Python από την τυπική βιβλιοθήκη ). Εξαρτάται από τον υπολογιστή στον οποίο εκτελείτε, αλλά αυτή η έκδοση χρειάζεται 1-2 δευτερόλεπτα για να εκτελέσει τις 1.000 επαναλήψεις και να απεικονίσει το αποτέλεσμα.
%time plt.hist(run_mcs(), bins=20, color='r') plt.show()
Η παρατεταμένη υποψία ότι κάτι θα μπορούσε να απλοποιηθεί είναι η πλουσιότερη πηγή ανταμοιβών στον κόσμο. - Edsger Dijkstra
Το Refactoring αναφέρεται στη διαδικασία επανεγγραφής του υπάρχοντος κώδικα για να βελτιώσει τη δομή του χωρίς να αλλάξει τη λειτουργικότητά του και μπορεί να είναι ένα από τα πιο διασκεδαστικά και επιβραβευτικά στοιχεία της κωδικοποίησης. Μπορεί να υπάρχουν πολλοί λόγοι για να γίνει αυτό. Μπορεί να είναι:
Για να δείξω πώς μπορεί να μοιάζει ένα βήμα αυτής της διαδικασίας, καθαρίσαμε το πρωτότυπο που μόλις περάσαμε συλλέγοντας όλες τις αρχικές μεταβλητές σε ένα μέρος, αντί να διασκορπιστεί σε ολόκληρο το σενάριο πρωτοτύπου και βελτιστοποίησε την ταχύτητα εκτέλεσης μέσω μιας διαδικασίας που ονομάζεται διανυσματικοποίηση .
Η χρήση των συστοιχιών NumPy σάς δίνει τη δυνατότητα να εκφράζετε πολλά είδη εργασιών επεξεργασίας δεδομένων ως συνοπτικές εκφράσεις πίνακα που διαφορετικά θα απαιτούσαν βρόχους γραφής. Αυτή η πρακτική αντικατάστασης ρητών βρόχων με εκφράσεις πίνακα αναφέρεται συνήθως ως διανυσματοποίηση. Wes McKinney
Φαίνεται τώρα πιο καθαρό και πιο κατανοητό:
# 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
Η κύρια διαφορά που θα παρατηρήσετε μεταξύ αυτής της έκδοσης και της προηγούμενης είναι η απουσία του for i in range(iterations)
βρόχος. Χρησιμοποιώντας τη λειτουργία συστοιχίας του NumPy, αυτή η έκδοση εκτελείται σε 18 χιλιοστά του δευτερολέπτου σε σύγκριση με τα 1,35 δευτερόλεπτα για την πρωτότυπη έκδοση - περίπου 75 φορές πιο γρήγορα.
%time plt.hist(run_mcs(), bins=20, density=True, color='r') plt.show()
Είμαι βέβαιος ότι είναι δυνατή η περαιτέρω βελτιστοποίηση, καθώς έχω συνθέσει τόσο το πρωτότυπο όσο και την εκλεπτυσμένη έκδοση σε σύντομο χρονικό διάστημα μόνο για τους σκοπούς αυτού του σεμιναρίου.
στοιχεία και αρχές των ορισμών σχεδιασμού
Αυτό το σεμινάριο έδειξε μερικά από τα ισχυρά χαρακτηριστικά του Python και αν επρόκειτο να το αναπτύξετε περαιτέρω οι ευκαιρίες είναι σχεδόν ατελείωτες. Θα μπορούσατε για παράδειγμα:
Δεν έχω αγγίξει ακόμη και τι θα μπορούσατε επίσης να κάνετε με τις διάφορες εφαρμογές ιστού, δεδομένων και μηχανικής μάθησης που συνέβαλαν στην επιτυχία της Python.
Αυτό το άρθρο έδωσε μια εισαγωγή στη γλώσσα προγραμματισμού Python, απαριθμώντας μερικούς από τους λόγους για τους οποίους έγινε τόσο δημοφιλές στη χρηματοδότηση και έδειξε πώς να φτιάξετε ένα μικρό σενάριο Python. Σε ένα βήμα-προς-βήμα σεμινάριο, αναλύτηκα πώς το Python μπορεί να χρησιμοποιηθεί για επαναληπτικό πρωτότυπο, διαδραστική οικονομική ανάλυση και για κωδικό εφαρμογής για μοντέλα αποτίμησης, αλγοριθμικά προγράμματα συναλλαγών και άλλα.
Για μένα, στο τέλος της ημέρας, το δολοφονικό χαρακτηριστικό της τεχνολογίας Python είναι ότι είναι απλά διασκεδαστικό να δουλεύεις! Εάν σας αρέσει η επίλυση προβλημάτων, η οικοδόμηση πραγμάτων και η αποτελεσματικότερη ροή εργασιών, σας προτείνω να το δοκιμάσετε. Θα ήθελα πολύ να ακούσω τι έχετε κάνει με αυτό ή θα ήθελα να το κάνω.
Το Python χρησιμοποιείται ως επί το πλείστον για ποσοτική και ποιοτική ανάλυση για τις τάσεις και τις προβλέψεις των τιμών των περιουσιακών στοιχείων. Επίσης προσφέρεται για την αυτοματοποίηση ροών εργασιών σε διαφορετικές πηγές δεδομένων.
Η Python σχεδιάστηκε τη δεκαετία του 1980 και εφαρμόστηκε για πρώτη φορά τον Δεκέμβριο του 1989.
Η Python είναι μια εύπλαστη, γενικευμένη γλώσσα προγραμματισμού με περιπτώσεις χρήσης σε διάφορα πεδία. Φροντίζοντας την πτυχή προγραμματισμού της εφαρμογής, επιτρέπει στον προγραμματιστή να επικεντρωθεί στη λειτουργικότητα της δημιουργίας τους.