孫玥璠 張琦 蔣帆(北京工商大學商學院 北京 100048)
企業的長期投資決策具有投入資金多、涉及時間長、投資風險大等特點。長期投資決策是否科學,對企業長期的盈利能力、現金能力等多方面都會產生較大影響,決策失誤更可能會給企業帶來巨大風險。在企業財務學理論中,長期投資決策分析的方法包括凈現值法、內部收益率法、投資回收期法等多種方法。其中最常用的是凈現值法(Net Present Value,簡稱NPV)。凈現值法考慮到了投資項目現金流量的時間價值,通過利用項目未來現金凈流量的現值與原始投資額的差額算出凈現值,再根據凈現值的大小評價投資項目的可行性。
然而,現實中企業進行長期投資決策時,嚴格按照這些方法進行決策的情況很少。除了企業長期投資決策本身具有戰略考量外,使用這些方法計算出來的指標可能與實際情況嚴重不符也是一個重要的原因。因無論哪種長期投資決策方法,都需要預測擬投資項目的未來現金凈流量,如果預測不準確,得到的結果可能失之毫厘,謬之千里。這個問題在已經邁入“數智時代”的今天,可以借助計算機工具,通過引入蒙特卡羅模擬方法,來比較輕松地解決。本文通過導入案例來實景還原手工環境下長期投資決策指標計算可能產生的謬誤,繼而給出基于Excel和Python的解決方案,并比較優劣。
A公司是大型商業零售企業,總部設立于北京市,現已在全國范圍內發展多家連鎖超市。近期,A公司擬在某二線城市開辦一家新連鎖超市。根據以往經驗,在這樣的二線城市開新店的初始投資額約為70萬元。針對此項投資,A公司財務部王經理和劉經理按照超市經營期10年分別進行了預測并計算了凈現值,如表1和表2所示。從中可以看到,二位經理都預測開辦一個新的超市后在第一年顧客數為5 000人,但對之后各年的顧客增長情況、每千名顧客每年能為超市帶來的毛利和超市每年的非存貨成本的預測是不同的,從而對每年凈現金流量的預測也是不同的,最終分別得到了正的凈現值和負的凈現值,產生了相悖的結論。
實際上,我們在進行長期投資決策的時候無法知道王經理和劉經理誰的預測是正確的,也許兩個人的預測都存在很大問題。雖然本例中采用的是凈現值法(NPV),其他各種長期投資決策方法基本上都需要對未來進行預測,存在的問題本質是一樣的。

表1 擬投資項目預測表

表2 擬投資項目凈現值測算表 單位:萬元
解決長期投資決策中投資項目未來現金凈流量難以準確預測問題的辦法是多次模擬預測。我們可以借助計算機,引入蒙特卡羅模擬方法(Monte Carlo Simulation)。蒙特卡羅模擬方法是利用數學方法進行的一種模擬實驗,當模擬對象本身具有概率特征時,可以通過計算機模擬產生抽樣結果,再根據其結果計算統計量或參數值,當模擬實驗的次數逐漸增多時,預測精度也會逐漸提高。引入蒙特卡羅模擬進行長期投資決策,能夠較好地刻畫擬投資項目未來可能出現的各種情況,從而降低企業長期投資決策的失誤率,提高企業在不確定環境下決策的科學性和準確性。
我們可以使用多種計算機工具來實現引入蒙特卡羅模擬的長期投資決策,不同工具實現方法不同。下文分別分析基于財務人員使用最多的Microsoft Excel電子表格軟件和基于目前最流行的Python編程語言的實現方法。
無論選用何種軟件工具或者編程方法,引入蒙特卡羅模擬都需要首先確定隨機變量及其概率分布規律。在企業的長期投資項目中,實際上有很多變量其實是隨機變化的,例如銷售量、價格、成本等,應根據歷史數據確定它們取值的分布規律。在本文的案例中,王經理和劉經理汲取了前面出現問題的教訓后,在充分調研、獲得較多歷史數據的基礎上,給出了對各年顧客數量、每千名顧客每年能為超市帶來的毛利和超市每年的非存貨成本的分布規律預測:(1)開辦一個新的超市后在第一年顧客數服從均值為5 000人、標準差為600人的正態分布;(2)每年顧客數量的增長率通常在-5%—10%之間;(3)每千名顧客每年能為超市帶來6萬元、8萬元、10萬元、12萬元和14萬元毛利的概率分別為15%、20%、30%、20%和15%;(4)每年非存貨成本的合計數服從均值為50萬元、標準差為15萬元的正態分布。在上述預測基礎上,使用Excel應用蒙特卡羅模擬進行企業長期投資決策的步驟如下:

圖1 數據區
第一步,構建各數據區域。本例中,可設為數據區(如圖1所示)、凈現值測算區(如圖2所示)、模擬實驗區(如圖3所示)和數據特征統計區(如下頁圖4所示)。
第二步,計算凈現值。利用Excel內置函數生成本例中的各隨機變量(第一年新增顧客數、每年顧客增長率、每千名顧客帶來毛利、收入和非存貨成本)并計算各年現金凈流量。需要用到的函數包括取整函數INT、條件函數IF、正態分布函數NORMINV和隨機函數RAND。其中,隨機函數RAND()是產生一個大于等于0而小于1的均勻分布的隨機數。表3給出了計算第1年現金凈流量使用的函數嵌套和公式。之后各年現金凈流量的計算方法只有顧客數的計算方法不同,其余均相同,限于篇幅,不再一一展示。第2年顧客數(J12單元格)的計算使用的函數嵌套為“=INT(I12*(1+(RAND()*(0.1+0.05)-0.05)))”,之后第3—第10年的顧客數計算依此類推。在計算完各年現金凈流量后,可以直接使用Excel內置的凈現值函數NPV來計算凈現值,NPV函數的語法為“NPV (rate,value1,[value2]……)”,其中,rate為貼現率,value為各時間段的現金流。因此,本例中凈現值的計算公式為“=NPV($B$16,I16:R16)-$B$14”,如圖 2 所示。

圖2 凈現值測算

表3 計算第1年現金凈流量使用的函數嵌套和公式
第三步,進行多次模擬。首先將模擬實驗區設為一個1 000行×2列的區域,然后應用Excel“數據”選項卡內“預測”組中“模擬分析”項下的“模擬運算表”命令,在選定模擬實驗區域中生成1 000次隨機模擬的凈現值,如下頁圖3所示(應為1 000行,為節省篇幅,僅給出10行模擬結果)。
第四步,進行數據特征統計并做出投資決策。使用均值函數AVERAGE、標準差函數STDEV、最大值函數MAX、最小值函數MIN和條件計數函數COUNTIF計算出1 000次模擬凈現值的均值、標準差、最大值、最小值和凈現值為負的概率。從圖4中可以看到,模擬1 000次凈現值為負的概率為0.80,也就是說,投資1 000次會有800次凈現值小于0,投資風險較大,不建議投資。

圖3 多次模擬實驗

圖4 數據特征統計
Python是一種面向對象的解釋型計算機程序設計語言,也是目前比較熱門的數據分析工具,它擁有豐富、強大的庫資源,能夠快速便捷地處理大量數據以及詳盡展示分析結果。本文案例使用Python語言應用蒙特卡洛模擬進行企業長期投資決策的步驟如下:
第一步,導入所需庫。Python編程語言中涵蓋大量數據庫,操作者在進行數據分析時能夠直接快速調取庫中信息。本文主要使用的是NumPy計算庫和Matplotlib繪圖庫的pyplot畫圖模塊。導入庫的具體代碼如下:

其中,“import…as…”為導入庫并命名代號(往往是為方便后面而命名的縮寫代號)。
第二步,生成隨機變量。本例中我們使用蒙特卡洛模擬進行10 000次計算,生成各個隨機變量的代碼如下:


其中,關于第一年顧客數隨機變量的生成,np.random.normal(5,0.6,samplesize)為使用NumPy計算庫中的函數生成samplesize個服從均值為5、標準差為0.6的正態分布的隨機數。當samplesize為10 000時,即生成10 000個符合上述條件的隨機數;同理可知顧客數量增長率隨機變量的生成(uniform為均勻分布)和非存貨成本隨機變量的生成。對于每千名顧客每年能為超市帶來的毛利隨機變量的生成,我們定義了一個函數gross_profit(),其內容為首先生成1—100之間的隨機整數r,再根據案例資料取得對應的毛利數值。可以看到,Python代碼的寫法基本上只需要非常簡單的語句將案例資料“翻譯”過來就可以了。
第三步,定義每年現金凈流量數組函數。NumPy庫與Excel一樣有計算凈現值(NPV)的函數,參數也是折現率和每年現金凈流量數組。于是我們定義一個生成每年現金凈流量數組的函數,代碼如下:

我們使用變量ncf_list代表每年現金凈流量數組,所以先將代表初始投資額的現金凈流量-70萬元賦值給ncf_list,再用ncf_list.append將第1—第10年的現金凈流量逐一添加進去(append的涵義是向列表中添加對象)。在計算第1—第10年現金凈流量的時候使用了一個for循環語句,其中調用的range函數range(1,11)含義為從1開始計數,到11結束但不包括11,也就是從1—10的計數。整個for循環語句的含義是對應第1—第10年,使用冪函數pow計算10次客戶數,在此基礎上計算10次每年現金凈流量,然后將每年現金凈流量的數據添加入ncf_list數組。計算每年現金凈流量的公式為:每年現金凈流量=(當年顧客數×單位顧客帶來的毛利-非存貨成本)×(1–稅率)。
第四步,計算凈現值并繪制概率分布圖和累計概率分布圖。計算出凈現值后,將產生的全部凈現值放在名為result的數組中。代碼如下:


在得到10 000組凈現值結果的基礎上,繪制概率分布圖,代碼如下:


圖5 模擬凈現值的概率分布圖
我們使用Matplotlib繪圖庫pyplot畫圖模塊中的hist函數繪制凈現值的直方圖,組數為100,顯示結果如圖5所示。同樣地,我們還可以繪制累計概率分布圖,代碼如下:


圖6 模擬凈現值的累計概率分布圖
仍然使用hist函數,“density=True”表示以密度的形式顯示,“histtype=’step’”表示設置線條類型為未填充線條,“cumulative=True”表示計算累計頻率,顯示累計概率分布圖如圖6所示。
第五步,進行數據特征統計并做出投資決策。計算出10 000次模擬凈現值的均值、標準差、最大值、最小值等描述性統計結果和凈現值為負數的概率,具體代碼如下:


輸出結果如下:
均值:-51.15466062855793
標準差:95.77370483456572
最大值:325.08921939188065
最小值:-401.0152818317847
凈現值為負數的概率:0.7067
從結果中可以看出,對擬投資項目進行10 000次模擬實驗得到的模擬凈現值概率分布圖呈左偏態分布,且擬投資項目的模擬凈現值小于0的概率較大,也就是投資該項目虧損的概率較大,不建議投資。
當然,為了給予決策者更為充分、可靠的依據,我們還可以應用Python進行次數更多的模擬,只需要改變上文代碼中samplesize的賦值即可,在此不再贅述。
從本文案例中可以看出,在企業的長期投資決策分析中,運用蒙特卡羅模擬方法能夠處理擬投資項目未來現金凈流量難以準確預測的問題,彌補手工環境下長期投資決策分析方法的缺陷,使企業的相關決策更加科學準確。
應用Excel進行操作,最大優勢就是財務人員對Excel較為熟悉,但也存在一些問題:(1)Excel是電子表格軟件,所有內容都要在表格內實現。要分析的問題越復雜,實際操作中需要設計規劃的數據區域則越多,界面也就越復雜。(2)計算擬投資項目未來各年現金凈流量和擬投資項目的凈現值時,需要通過多個函數嵌套來實現,不僅操作繁瑣、邏輯復雜不直觀,而且容易出錯。(3)當進行1 000次模擬時就需要使用具有1 000行或者1 000列的數據區域,如果模擬次數更多,就需要更多區域,操作的便利性降低。(4)引入蒙特卡羅模擬方法,其原理是當模擬實驗的次數逐漸增多時,預測精度會逐漸提高。而Excel的優勢是表格處理,其運行和分析的數據量是有限的。就筆者的嘗試而言,本文案例如果進行上萬次的模擬需運行的數據量就已經超出了Excel的運算能力,造成Excel無法運行。而真實情況下的企業長期投資決策問題模型會更復雜,需要運行的數據量更大。
應用Python進行操作,對比Excel具有很多優勢:(1)應用Python可以通過代碼直接輸出決策者需要的關鍵指標,而不需要把所有內容都布置在電子表格中,可以省掉很多多余的步驟和對Excel工作表界面數據區域的規劃;(2)能夠有效解決Excel軟件在進行大數據量模擬分析時可能遇到的運算能力瓶頸問題,大大提升效率。應用Python最大的問題可能在于我們財務工作者對于“編程”“代碼”的心理障礙。實際上,Python是一種解釋型編程語言,基本上是對作業流程的直譯,語言邏輯簡單直白,因此其代碼具有很強的可讀性,對于編程基礎相對薄弱的財務人員來講也是易學習、易上手的。通過本文案例可以看到,Excel函數嵌套的邏輯比起Python語言的這種“直譯”,更為繁瑣一些。在邁入“數智時代”的今天,財務轉型大背景下,Python語言已經成為很多大學本科財會專業學生的必修課程,現有的財務人員也可以嘗試學習、掌握更多新的工具和方法。