บทนำ

เอกสาร R Markdown ภาษาไทยชุดนี้อธิบาย การทำงานของโปรแกรม R/RStudio programming หัวข้อเรื่อง Introduction to R programming ในรายวิชา 2104525 Compuational Methods for IE เอกสารภาษาไทยชุดนี้ประกอบด้วย 3 ส่วน ได้แก่

Topics: การเปรียบเทียบโครงการ

จงคำนวณหาดัชนีชี้วัดทาง เศรษฐวิศวกรรม Net Present Value (NPV), Payback Period, and Internal Rate of Return (IRR) ของกระแสเงินสดต่อไปนี้

ปี 0 1 2 3 4 5 6
Cashflow -1350 363 551 681 761 821 1467

หากอัตราส่วนดอกเบี้ยรายปีคือ 8%


01: Review

เศรษฐศาสตร์วิศวกรรม เป็นการประเมินความคุ้นทุนของโครงการซึ่งมีกระแสเงินเข้า (Cash Inflow) และ กระแสเงินออก (Cash Outflow) แตกต่างกัน เทียบกับการไม่ดำเนินโครงการใดๆ

แนวคิดหลัก

  • Time value money มูลค่าของเงินในอนาคตน้อยกว่ามูลค่าของเงินในปัจจุบัน (เงินขึ้นกับเวลา และ แปรฐานเวลาได้)
  • Cashflow Equivalent ในช่วงเวลาหนึ่ง กระแสเงินเข้า และ กระแสเงินออก สามารถ บวก/ลบ กันได้ โดยไม่พิจารณาลักษณะ (เงิน ณ เวลาหนึ่ง บวก/ลบได้)
  • Project alternative หากไม่ใช้เงินในการทำโครงการแล้ว เม็ดเงินดังกล่าวสามารถงอกเงยได้เท่าไรในแต่ละช่วงเวลาที่ความเสี่ยงเท่ากัน (ความเสี่ยงเท่ากัน เลือกเงินมาก)

ดังนั้นการเปรียบเทียบโครงการควรพิจารณาถึงอัตราผลตอบแทนทั้งโครงการ ณ ช่วงเวลาปัจจุบัน และพิจารณาอัตราผลตอบแทนขั้นต่ำ เรียกว่า NPV (Net Present Value) ซึ่งแสดงความสัมพันธ์ระหว่างกระแสเงิน ช่วงเวลา และอัตราผลตอบแทนดังนี้

\[NPV = \sum_{t=0}\frac{1}{(1+i)^t} cf_t\]

เมื่อ - NPV มูลค่าปัจจุบันจองโครงการ - \(cf_t\) กระแสเงินในช่วงเวลาที่ \(t\) - i อัตราผลตอบแทน

ตัวชี้วัดโครงการอื่นๆ

นอกเหนือจาก NPV ซึ่งเป็นการวัดมูลค่าเงินตัววัดโครงการแล้วยังมีดัชนีที่สำคัญอีก 2 ตัวได้แก่

  • IRR (Net Present Value) เป็นการวัดอัตราตอบแทนของโครงการ หรือ \[IRR = \arg_i \sum_{t=0}\frac{1}{(1+i)^t} cf_t = 0\]

  • Payback Period เป็นการวัดค่าช่วงเวลาที่โครงการเริ่มสร้างกำไร หรือ \[Payback = \arg_{\hat{t}} \sum_{t=0}^{\hat{t}} \frac{1}{(1+i)^t} cf_t = 0\]

การพัฒนาโค้ด

  • ทดลองโค้ดหลัก (concept) เป็นการทดสอบแนวคิดหลักในการคำนวนหรือฟังก์ชั่นว่าต้องการเอาท์พุต (Output) อะไร เพื่อจะได้เอาท์พุตดังกลาวต้องการค่า อินพุต (Input) อะไรบ้างและผ่านกระบวนการคำนวน (procedure) อย่างไร ตัวอย่างเช่นการหาค่า NPV ในเรื่อง Engineering Economy เอาท์พุตคือ ผลรวมของมูลค่าปัจจุบัน อินพุตของการคำนวนประกอบไปด้วย (1) กระแสเงิน (2) อัตราผลตอบแทน และ (3) ระยะเวลา โดยการคำนวนเป็นไปตามสมการข้างต้น
  • สร้าง Function (implement) หลังจากทดลองโค้ดหลักเสร็จสิ้นแล้ว จึงค่อยเขียนฟังก์ชั่นที่่แสดงค่าอินพุต และ เอาท์พุต อย่างชัดเจนด้วตำสัง function() และ return() ตามลำดับ
  • ทดสอบ (debug) ควรมีการทดสอบฟังก์ชั่นอีกครั้งว่าทำงานได้ผลตามที่ต้องการหรือ

02: NPV

Step 01: input

สร้างข้อมูลทดสอบและทดลองโค้ดหลัก
  • คำนวนมูลค่าปัจจุบัน (Present Values: PV)
  • คำนวนผลรวมของมูลค่าปัจจุบัน
cashflow <- c(-1350, 363, 551, 681, 761, 821, 1467)
intDef   <- 0.08

จากข้อมูลกระแสเงิน (cashflow) เราสามารถคำนวนระยะเวลาและสามารถแสดงระยะเวลาของกระแสได้โดย

length(cashflow) -1
## [1] 6
0:(length(cashflow) -1)
## [1] 0 1 2 3 4 5 6

เงินและมูลค่าปัจจุบันได้โดยสร้งตัวแปรชื่อ period สำหรับระยะเวลาของกระแสเงิน

period <- 0:(length(cashflow) -1)
cashflow/(1+intDef)^(period) 
## [1] -1350.0000   336.1111   472.3937   540.5998   559.3577   558.7588   924.4588

Step 02: function

สร้างฟังก์ชั่นโดยรับค่า cashflow และ intDefดังต่อไปนี้ และคำนวน NPV
findPV <- function(cashflow, intDef){
    period <- 0:(length(cashflow) -1)
    result <- cashflow/(1+intDef)^(period) 
    return(result)
}

findNPV <- function(cashflow, intDef){
  sum(findPV(cashflow, intDef)) 
} 

Step 03: test

ทดสอบฟังก์ชั่นด้วยข้อมูลจริง
cashflow <- c(-1350, 363, 551, 681, 761, 821, 1467)
intDef   <- 0.08

findPV(cashflow, intDef) 
## [1] -1350.0000   336.1111   472.3937   540.5998   559.3577   558.7588   924.4588
sum(findPV(cashflow, intDef))
## [1] 2041.68
findNPV(cashflow, intDef) 
## [1] 2041.68

03: Payback Period

Implementing Payback Period

ในการหา Payback period อาจเริ่ใโดยการ plot ซึ่งต้องการค่า ผลรวมมูลค่าปัจจุบันสะสม (Cummerative Present Value) และ ช่วงเวลา

cashflow.pv.sum <- cumsum(findPV(cashflow, intDef))
periods <- 0:(length(cashflow) -1)
plot(periods,cashflow.pv.sum,pch=16,type='b')
abline(h=0,col="red")


เราสามารถให้ R คำนวนประมาณจุดตัดแกน \(x\) ได้โดยการใช้ตำสั่ง approx()

payback  <- approx(x=cashflow.pv.sum,y=periods,xout=0.0)
payback$y
## [1] 3.001601

04: IRR

  • การหาค่า Internal Rate of Return (IRR) มีหลายวิธีขึ้นอยู่ความเข้าใจด้านคณิตศาสตร์

uniroot()

เราสามารถให้ R คำนวนค่ารากของฟังก์ชั่น (จุดตัดแกน \(x\)) ได้โดยการใช้ตำสั่ง `uniroot()’ ซึ่งเป็นการหาคำตอบโดยวิธีการ trial-and-error ด้วย Algorithm Bi-Section Search ซึ่งมีแนวคิดในการทดสอบและเปรียบเทียบค่าของฟังก์ชั่น โดยแบ่งช่วงคำตอบเป็น 2 ส่วน

uniroot(findNPV,interval=c(0,1),cashflow=cashflow)
## $root
## [1] 0.3948883
## 
## $f.root
## [1] -0.02120321
## 
## $iter
## [1] 5
## 
## $init.it
## [1] NA
## 
## $estim.prec
## [1] 6.103516e-05

polyroot()

เนื่องจาก ค่า IRR เป็นค่ารากของสมการคำตอบ NPV (ดอกเบี้ยที่ทำให้ค่า NPV = 0) หรือ

\[ 0 = -1350 \left( \frac{1}{1+i} \right)^0 + 363 \left( \frac{1}{1+i} \right)^1 + 551 \left( \frac{1}{1+i} \right)^2 + 681 \left( \frac{1}{1+i} \right)^3 + 761 \left( \frac{1}{1+i} \right)^4 + 821 \left( \frac{1}{1+i} \right)^5+ 1467 \left( \frac{1}{1+i} \right)^6 \]

หากพิจารณาว่า \(x \equiv \left( \frac{1}{1+i} \right)\) จะได้ว่า

\[ 0 = -1350 + 363 x + 551 x^2 + 681 x^3 + 761 x^4 + 821 x^5+ 1467 x^6 \]

ซึ่งเป็นสมการในรูปะพหคูณ (polynormial function) และสามารถใช้คำสั่ง polyroot ในการหาค่าได้

result   <- polyroot(cashflow)
intRate <- 1/result - 1 

intRate[ abs(Im(intRate)) < 0.001 & Re(intRate) >0 ]  ## เลือกคำตอบที่เป็นจำนวนบวก
## [1] 0.3948815+0i

05: Questions

  • จงประยุกต์แนวคิดของ Bi-Section Search ซึ่งเป็นวิธีการหาคำตอบโดยการทดสอบค่าคำตอบที่จุดกึ่งกลางของช่วงาคำตอบ ในการหาค่า IRR Bisection method
  • จงประยุกต์แนวคิดของ Golden Section Search ซึ่งเป็นวิธีการหาคำตอบโดยการลดช่วงของค่าคำตอบ (Search Region) ลงด้วยสัดส่วนคงที่ \(\frac{2}{1+\sqrt{5}}\) ในการหาค่า IRR
  • เปรียบเทียบแนวคิดทั้งสองในด้านเวลาการทำงาน (Runtime) และ จำนวนขั้น (Iteration) ที่ \(\pm 0.001\) ของคำตอบด้วยวิธี polyroot


Copyright 2019   Oran Kittithreerapronchai.   All Rights Reserved.   Last modified: 2021-23-02,