วิธีสร้างแบบจำลองกระแสเงินสด Python พื้นฐานสำหรับเงินกู้

เผยแพร่แล้ว: 2022-03-11

ผู้เชี่ยวชาญด้านการเงินหลายคนเชี่ยวชาญในการใช้ Excel เพื่อสร้างแบบจำลองทางการเงิน อย่างไรก็ตาม เนื่องจากปัญหาในการตรวจสอบโดยเพื่อน การควบคุมเวอร์ชัน และการไม่สามารถสร้างฟังก์ชันแบบเรียกซ้ำ Excel อาจไม่ใช่ตัวเลือกที่ดีที่สุดสำหรับตัวแบบที่ซับซ้อนมากขึ้น แม้จะมีข้อเสียเหล่านี้ แต่ผู้เชี่ยวชาญด้านการเงินหลายคนยังคงใช้ Excel เพราะพวกเขาไม่ค่อยมั่นใจในภาษาโปรแกรมอย่าง Python

Python เป็นหนึ่งในภาษาการเขียนโปรแกรมที่ง่ายที่สุดในการเรียนรู้ เนื่องจากได้รับการออกแบบมาโดยคำนึงถึงความสามารถในการอ่านและใช้งานง่าย โค้ดจึงกระชับและใกล้เคียงกับภาษาอังกฤษทั่วไป ในบทความนี้ ผมจะแสดงให้เห็นว่าการสร้างแบบจำลองกระแสเงินสดของ Python สำหรับการชำระเงินกู้นั้นง่ายเพียงใดโดยใช้ฟังก์ชัน แพ็คเกจ และโครงสร้างข้อมูลพื้นฐานที่สุด

ในการปฏิบัติตาม คุณจะต้องใช้ Colaboratory (เรียกสั้นๆ ว่า Colab) ซึ่งเป็นแอปพลิเคชันสมุดบันทึกบนเว็บฟรีของ Google ที่ให้คุณเขียนและรันโค้ดได้ Colab เป็นล่าม Python ที่ใช้เซลล์ที่สามารถมีโค้ด Markdown (สำหรับข้อความที่จัดรูปแบบได้ง่าย) รูปภาพ หรือข้อมูลอื่นๆ Colab เก็บค่าของโค้ดของคุณอย่างต่อเนื่องในขณะที่คุณเขียน ทำให้สามารถตรวจจับข้อผิดพลาดหรือจุดบกพร่องได้อย่างรวดเร็วและง่ายดาย (หากคุณยังไม่ต้องการเข้าร่วม ให้ทำตามตัวอย่างสมุดบันทึก Colab นี้)

ขั้นแรก ตรวจสอบให้แน่ใจว่าคุณมีเครื่องมือที่คุณต้องการ

เราจะสร้างแบบจำลองสำหรับเงินกู้ที่ตัดจำหน่ายซึ่งมีกำหนดชำระเป็นงวดสำหรับทั้งเงินต้นและดอกเบี้ยของเงินกู้ โดยมีการผ่อนชำระคงที่ในแต่ละงวดและส่วนดอกเบี้ยของเงินที่ชำระจะลดลงตามช่วงเวลา คุณจะต้องมีไลบรารี Python สามไลบรารี ชุดของรูทีนซอฟต์แวร์ที่ป้องกันไม่ให้นักพัฒนาต้องเขียนโค้ดตั้งแต่เริ่มต้น สำหรับโมเดลนี้—NumPy, Pandas และ Matplotlib:

  • numpy-financial==1.0.0
  • pandas==1.2.3
  • matplotlib==3.2.2

ใน Colab แพ็คเกจ Pandas และ Matplotlib จะถูกติดตั้งตามค่าเริ่มต้น ดังนั้นคุณเพียงแค่ต้องติดตั้งไลบรารี่ numpy-financial ซึ่งคุณทำได้โดยตรงจาก Colab ในการติดตั้ง numpy-financial และนำเข้าไลบรารีทั้งสามที่คุณต้องการใช้ในภายหลัง ให้เปิดสมุดบันทึก Colab ใหม่จากเมนูไฟล์ แล้ววางสิ่งต่อไปนี้ลงในเซลล์โค้ดแรก:

 # initial set-up !pip install numpy_financial import pandas as pd import numpy_financial as npf import matplotlib.pyplot as plt from collections import namedtuple

ก่อนที่เราจะไปยังขั้นตอนถัดไป ให้ฉันอธิบายโค้ดก่อนหน้านี้และเหตุใดจึงเขียนโค้ดตามที่เขียน แม้ว่าชื่อของ numpy-financial จะมียัติภังค์ คุณต้องใช้ขีดล่างในชื่อเมื่อคุณติดตั้งและนำเข้า (สำหรับข้อมูลเพิ่มเติมและคำอธิบายเกี่ยวกับการติดตั้ง numpy_financial โปรดดูเอกสารประกอบ) คุณอาจสังเกตเห็นคำย่อด้วยเช่นกัน โดยทั่วไปจะใช้นามแฝงที่กำหนดไว้ล่วงหน้าสำหรับแพ็คเกจ—NumPy เขียนเป็น np, Pandas เป็น pd นามแฝงเหล่านี้ใช้เพื่อช่วยให้คุณไม่ต้องเขียนชื่อเต็มของแพ็คเกจทุกครั้งที่คุณต้องการใช้ และยังช่วยให้โค้ดของคุณอ่านง่ายขึ้นอีกด้วย

ตอนนี้ ใช้ NumPy เพื่อกำหนดลักษณะเงินกู้

NumPy เป็นหนึ่งในไลบรารี Python ที่ได้รับความนิยมมากที่สุด โดยเพิ่มการรองรับอาร์เรย์หลายมิติขนาดใหญ่ พร้อมด้วยคอลเลกชั่นฟังก์ชันทางคณิตศาสตร์ระดับสูงที่สำคัญเพื่อใช้งานกับอาร์เรย์เหล่านั้น ห้องสมุดการเงิน numpy เป็นแพ็คเกจที่ค่อนข้างใหม่ซึ่งประกอบด้วยคอลเล็กชั่นฟังก์ชั่นทางการเงินที่ใช้กันทั่วไปซึ่งแยกออกจากห้องสมุด NumPy หลักและให้ความภาคภูมิใจในสถานที่ของตนเอง

วิธีที่ง่ายที่สุดในการคำนวณดอกเบี้ยตามกำหนดเวลาและพาหะหลักสำหรับอายุของเงินกู้ที่ตัดจำหน่ายของเราคือการใช้ฟังก์ชัน PMT, IPMT และ PPMT จากแพ็คเกจการเงิน numpy ฟังก์ชัน PMT ให้การผ่อนชำระเงินกู้แบบคงที่เพื่อชำระคืนเงินกู้เต็มจำนวนตามจำนวนงวดที่กำหนด ฟังก์ชัน IPMT และ PPMT ให้ดอกเบี้ยและเงินต้นตามลำดับ ขึ้นอยู่กับอินพุตของช่วงเวลา ฟังก์ชัน IPMT และ PPMT สามารถคืนค่าสำหรับช่วงเวลาเดียวหรือหลายงวดได้

สำหรับตัวอย่างนี้ เราจะจัดเตรียมช่วงที่มีช่วงอายุของเงินกู้เป็นข้อมูลระยะเวลา เช่นนี้ เราจะได้รับอาร์เรย์เวกเตอร์พร้อมดอกเบี้ยในการชำระเงินต้นสำหรับแต่ละช่วงอายุเงินกู้:

 # loan characteristics original_balance = 500_000 coupon = 0.08 term = 120 # payments periods = range(1, term+1) interest_payment = npf.ipmt( rate=coupon / 12, per=periods, nper=term, pv=-original_balance) principal_payment = npf.ppmt( rate=coupon / 12, per=periods, nper=term, pv=-original_balance)

คุณจะไม่ "เห็น" สิ่งใดเกิดขึ้นในไฟล์ Colab ของคุณหลังจากป้อนรหัส ซึ่งเป็นข้อมูลเงินกู้พื้นฐานที่จำเป็นในการดำเนินการส่วนที่เหลือของแบบฝึกหัดนี้ (รายชื่อของฟังก์ชัน numpy-financial ทั้งหมดที่ฉันใช้ คำจำกัดความ และข้อมูลที่ป้อน สามารถดูได้ในเอกสารอย่างเป็นทางการ)

ถัดไป ใช้ Matplotlib เพื่อสร้างแผนภูมิ

แม้ว่าจะเป็นการดีที่จะมีเวกเตอร์เป็นเอาต์พุต อาจเป็นการดีที่สุดที่จะเห็นภาพเอาต์พุตในรูปแบบของแผนภูมิ โดยเฉพาะอย่างยิ่งเป็นพล็อตแบบกองซ้อน ในการตั้งค่าแผนภูมิ เราจะใช้ plt ซึ่งเป็นนามแฝงสำหรับการรวบรวมฟังก์ชัน pyplot จากไลบรารี matplotlib ในตัวอย่างของเรา เราจะเพิ่มคำอธิบายที่มุมบนซ้ายและเพิ่มชื่อให้กับแกน x และแกน y เนื่องจากเราไม่ต้องการเส้นขอบภายใน เราจึงตั้งค่าระยะขอบเป็น 0

เพิ่มเซลล์รหัสอื่น และใส่รหัสต่อไปนี้:

 plt.stackplot(periods, interest_payment, principal_payment, labels=['Interest', 'Principal']) plt.legend(loc='upper left') plt.xlabel("Period") plt.ylabel("Payment") plt.margins(0, 0) 

ดังที่เราเห็น ดอกเบี้ยลดลงเมื่อเวลาผ่านไป ยอดเงินกู้ลดลงตามการชำระเงินต้นในแต่ละงวด ส่วนเงินต้นต้องเพิ่มขึ้นเพื่อคงค่างวดคงที่

สุดท้าย ใช้นุ่นสร้างตาราง

แพ็คเกจ Pandas เป็นแพ็คเกจ Python ที่ใช้บ่อยที่สุดสำหรับการจัดการตารางตัวเลขและอนุกรมเวลา มีโครงสร้างข้อมูลที่รวดเร็ว ยืดหยุ่น และแสดงออกซึ่งออกแบบมาเพื่อให้การทำงานกับข้อมูลเชิงสัมพันธ์หรือข้อมูลที่มีป้ายกำกับเป็นเรื่องง่ายและใช้งานง่าย เราจะสร้างตารางที่มีการชำระต้นและดอกเบี้ยตลอดจนยอดเงินกู้เริ่มต้นและสิ้นสุดในแต่ละงวด:

 _# pandas float formatting_ pd.options.display.float_format = '{:,.2f}'.format _# cash flow table_ cf_data = {'Interest': interest_payment, 'Principal': principal_payment} cf_table = pd.DataFrame(data=cf_data, index=periods) cf_table['Payment'] = cf_table['Interest'] + cf_table['Principal'] cf_table['Ending Balance'] = original_balance - \ cf_table['Principal'].cumsum() cf_table['Beginning Balance'] = [original_balance] + \ list(cf_table['Ending Balance'])[:-1] cf_table = cf_table[['Beginning Balance', 'Payment', 'Interest', 'Principal', 'Ending Balance']] cf_table.head(8)

โค้ดบรรทัดแรกใช้กฎการจัดรูปแบบการแสดงผลเพื่อทำให้ตารางอ่านง่ายขึ้นโดยการเพิ่มตัวคั่นหลักพันและแสดงตัวเลขเป็นทศนิยมเพียงสองตำแหน่ง

รหัสส่วนที่สองสั่งให้ Colab รวมการจ่ายดอกเบี้ย เงินต้น ยอดคงเหลือปลายงวด และยอดดุลเดิมสำหรับแต่ละงวดเงินกู้ แบ็กสแลชทำหน้าที่เป็นตัวแบ่งบรรทัด เนื่องจากเราไม่สามารถมีอักขระเกิน 79 ตัวในบรรทัดเดียว

จำนวนเงินที่แสดงในแผนภูมิถูกย่อให้เหลือทศนิยมสองตำแหน่ง

หากคุณได้ติดตามสมุดบันทึก Colab ของคุณเองแล้ว ยินดีด้วย! ตอนนี้คุณได้เข้ารหัสโปรไฟล์พอร์ตสินเชื่อค่าตัดจำหน่ายตามกำหนดเวลาอย่างง่ายโดยใช้ Python

มีอะไรอีกมากมายที่คุณสามารถทำได้ด้วย Python สำหรับการเงิน รวมถึงการสร้างแบบจำลองสำหรับสินเชื่อที่มีคูปองดอกเบี้ยผันแปรที่เชื่อมโยงกับอัตราดอกเบี้ยอ้างอิงและโครงสร้างเงินกู้อื่นๆ หวังว่ารูปแบบเงินกู้นี้จะให้คุณได้ลิ้มรสว่าการเข้ารหัสทางการเงินใน Python นั้นง่ายเพียงใด