返回文章列表

蒙地卡羅模擬提升金融資料分析精確度

本文探討蒙地卡羅模擬(MCS)在金融資料分析中的應用,包含股票價格模擬、產品需求預測及精確度提升方法。文章提供 Python 程式碼範例,演示如何使用 MCS 模擬股票價格波動、評估不同生產策略的平均利潤,並利用巢狀 MCS

資料科學 金融科技

蒙地卡羅模擬是一種根據大量隨機試驗的數值計算方法,常用於處理複雜系統中的不確定性問題。在金融領域,它可以有效地模擬股票價格波動、評估投資組合風險、預測產品需求等。透過 Python 的 scipymatplotlib 等函式庫,可以輕鬆實作 MCS 並將結果視覺化,更直觀地理解資料的隨機性和潛在趨勢。藉由調整模擬次數、引數設定,以及結合巢狀蒙地卡羅模擬等進階技巧,更能提升預測的精確度,為決策提供更可靠的依據。機率密度函式和累積分佈函式是理解隨機變數行為的關鍵,結合視覺化工具能更清晰地呈現資料分佈和機率特性,有助於更深入的隨機性分析。

蒙地卡羅模擬與密度函式

蒙地卡羅模擬(MCS)是一種透過重複隨機抽樣來獲得數值結果,以解決確定性問題的方法。廣泛應用於最佳化、數值積分和根據風險的決策。機率和累積密度函式是統計測量,用於將機率分佈應用於隨機變數,可以與MCS結合使用以解決確定性問題。

股票模擬

第一個例子是假設性和簡單的,但有助於展示資料隨機化。它從一檔假設的股票開始,價格為20美元。然後預測未來200天的價格並繪製圖表。

程式碼範例

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

def cum_price(p, d, m, s):
    data = []
    for d in range(d):
        prob = stats.norm.rvs(loc=m, scale=s)
        price = (p * prob)
        data.append(price)
        p = price
    return data

if __name__ == "__main__":
    stk_price, days, mean, s = 20, 200, 1.001, 0.005
    data = cum_price(stk_price, days, mean, s)
    plt.plot(data, color='lime')
    plt.ylabel('價格')
    plt.xlabel('天數')
    plt.title('股票收盤價')
    plt.show()

內容解密:

  1. cum_price 函式:此函式模擬股票價格隨時間的變化。它接受初始價格 p、天數 d、平均值 m 和標準差 s 作為引數。
  2. stats.norm.rvs(loc=m, scale=s):使用常態分佈生成隨機變數,其中 loc 是平均值,scale 是標準差。
  3. price = (p * prob):計算新的股票價格,將當前價格乘以生成的隨機變數。
  4. plt.plot(data, color='lime'):繪製股票價格隨時間變化的圖表,使用石灰綠色表示。
  5. plt.ylabel('價格')plt.xlabel('天數')plt.title('股票收盤價'):為圖表新增標籤和標題,使其更具可讀性。

蒙地卡羅模擬的重要性

蒙地卡羅模擬是一種強大的工具,用於模擬複雜系統和預測結果。透過重複隨機抽樣,可以獲得對系統行為的深入瞭解,並做出更準確的預測。在金融領域,蒙地卡羅模擬可用於模擬股票價格、評估投資組合風險等。

視覺化

視覺化是資料科學中的一個重要方面,因為它使我們能夠更好地理解和解釋複雜的資料。在上述例子中,使用了 matplotlib 函式庫來視覺化股票價格的變化。透過視覺化,可以直觀地看到股票價格的波動,並對其未來走勢做出更準確的預測。

蒙特卡羅模擬與密度函式

蒙特卡羅模擬(MCS)是一種根據隨機抽樣的數值分析技術,廣泛應用於金融、工程和科學領域,用於模擬複雜系統的行為並預測結果。

簡單的隨機價格模擬

以下是一個簡單的 Python 程式碼範例,用於模擬股票價格的變化:

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

def cum_price(p, d, m, s):
    data = []
    for i in range(d):
        prob = stats.norm.rvs(loc=m, scale=s)
        price = p * prob
        data.append(price)
        p = price
    return data

if __name__ == "__main__":
    stk_price, days, mu, sigma = 20, 200, 1.001, 0.005
    data = cum_price(stk_price, days, mu, sigma)
    plt.plot(data)
    plt.ylabel('價格')
    plt.xlabel('天數')
    plt.title('股票收盤價')
    plt.show()

內容解密:

  • cum_price 函式根據給定的初始價格、交易天數、平均值和標準差,模擬股票價格的變化。
  • 使用 stats.norm.rvs 生成符合正態分佈的隨機數,代表每日的價格變化。
  • 將每日的價格變化累積,形成股票價格的時間序列資料。
  • 最終使用 matplotlib 將模擬的股票價格變化繪製成圖表。

蒙特卡羅模擬的應用

為了更好地理解股票價格的變化,可以使用蒙特卡羅模擬進行多次模擬:

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

def cum_price(p, d, m, s):
    data = []
    for i in range(d):
        prob = stats.norm.rvs(loc=m, scale=s)
        price = p * prob
        data.append(price)
        p = price
    return data

if __name__ == "__main__":
    stk_price, days, mu, sigma = 20, 200, 1.001, 0.005
    x = 0
    while x < 100:
        data = cum_price(stk_price, days, mu, sigma)
        plt.plot(data)
        x += 1
    plt.ylabel('價格')
    plt.xlabel('天數')
    plt.title('股票收盤價')
    plt.show()

內容解密:

  • 使用 while 迴圈進行 100 次蒙特卡羅模擬,每次模擬股票價格的變化。
  • 將每次模擬的結果繪製在同一張圖表中,直觀地展示了股票價格的多種可能變化情況。
  • 這種方法可以幫助投資者更好地理解股票價格的波動性和風險。

假設分析

假設分析是透過改變模型中的引數來觀察結果變化的過程。在上述股票價格模擬中,可以透過改變交易天數、平均值或標準差等引數來觀察股票價格變化的差異。

產品需求模擬

在產品需求預測中,可以使用離散機率分佈來代表不同的需求情況。以下是一個 Python 程式碼範例:

import matplotlib.pyplot as plt
import numpy as np

def demand():
    p = np.random.uniform(0, 1)
    if p < 0.10:
        return 10000
    elif p >= 0.10 and p < 0.45:
        return 20000
    elif p >= 0.45 and p < 0.75:
        return 40000
    else:
        return 60000

def production(demand, units, price, unit_cost, disposal):
    units_sold = min(units, demand)
    revenue = units_sold * price
    total_cost = units * unit_cost
    units_not_sold = units - demand
    if units_not_sold > 0:
        disposal_cost = disposal * units_not_sold
    else:
        disposal_cost = 0
    profit = revenue - total_cost - disposal_cost
    return profit

def mcs(x, n, units, price, unit_cost, disposal):
    profit = []
    while x <= n:
        d = demand()
        v = production(d, units, price, unit_cost, disposal)
        profit.append(v)
        x += 1
    return profit

if __name__ == "__main__":
    units = [10000, 20000, 40000, 60000]
    price, unit_cost, disposal = 4, 1.5, 0.2
    avg_p = []
    x, n = 1, 10000
    
    for unit in units:
        profit = mcs(x, n, unit, price, unit_cost, disposal)
        avg_p.append(np.mean(profit))
        print('產量為 {:,.0f} 時的平均利潤:${:,.2f}'.format(unit, np.mean(profit)))
    
    labels = ['10000', '20000', '40000', '60000']
    pos = np.arange(len(labels))
    width = 0.75
    
    plt.figure(2)
    ax = plt.axes()
    ax.set_xticks(pos + (width / 2))
    ax.set_xticklabels(labels)
    barlist = plt.bar(pos, avg_p, width, color='aquamarine')
    barlist[np.argmax(avg_p)].set_color('orchid')
    plt.ylabel('平均利潤')
    plt.xlabel('生產數量')
    plt.title('不同生產數量下的平均利潤')
    plt.show()

內容解密:

  • demand 函式根據給定的機率分佈,隨機生成產品需求量。
  • production 函式根據給定的生產數量、價格、單位成本和處理成本,計算利潤。
  • mcs 函式進行蒙特卡羅模擬,多次計算不同需求情況下的利潤,並傳回平均利潤。
  • 在主程式中,對不同的生產數量進行蒙特卡羅模擬,計算並比較平均利潤。
  • 最終使用柱狀圖展示不同生產數量下的平均利潤,直觀地比較了不同生產策略的經濟效益。

蒙地卡羅模擬的精確度提升與應用

蒙地卡羅模擬(MCS)是一種根據隨機性的模擬技術,廣泛應用於資料科學、金融、工程等領域。透過增加模擬次數,MCS能夠更準確地預測現實世界的結果。

蒙地卡羅模擬的運作原理

MCS的核心在於利用隨機數生成器來模擬現實世界中的不確定性。透過重複模擬,MCS能夠提供對結果的機率分佈,從而幫助決策者瞭解不同結果的可能性。

提升蒙地卡羅模擬的精確度

為了進一步提高MCS的精確度,可以採用巢狀蒙地卡羅模擬(Nested MCS)的方法。巢狀MCS是指在原有的MCS基礎上,再進行一次MCS,從而獲得更準確的預測結果。

程式碼範例:巢狀蒙地卡羅模擬

import matplotlib.pyplot as plt
import numpy as np

def demand():
    p = np.random.uniform(0, 1)
    if p < 0.10:
        return 10000
    elif p >= 0.10 and p < 0.45:
        return 20000
    elif p >= 0.45 and p < 0.75:
        return 40000
    else:
        return 60000

def production(demand, units, price, unit_cost, disposal):
    units_sold = min(units, demand)
    revenue = units_sold * price
    total_cost = units * unit_cost
    units_not_sold = units - demand
    if units_not_sold > 0:
        disposal_cost = disposal * units_not_sold
    else:
        disposal_cost = 0
    profit = revenue - total_cost - disposal_cost
    return profit

def mcs(x, n, units, price, unit_cost, disposal):
    profit = []
    while x <= n:
        d = demand()
        v = production(d, units, price, unit_cost, disposal)
        profit.append(v)
        x += 1
    return profit

def display(p, i):
    print('Profit for {:,.0f}'.format(units[i]),
          'units: ${:,.2f}'.format(np.mean(p)))

if __name__ == "__main__":
    units = [10000, 20000, 40000, 60000]
    price, unit_cost, disposal = 4, 1.5, 0.2
    avg_ls = []
    x, n, y, z = 1, 10000, 1, 1000
    while y <= z:
        profit_10 = mcs(x, n, units[0], price, unit_cost, disposal)
        profit_20 = mcs(x, n, units[1], price, unit_cost, disposal)
        avg_profit = np.mean(profit_20)
        profit_40 = mcs(x, n, units[2], price, unit_cost, disposal)
        avg_profit = np.mean(profit_40)
        profit_60 = mcs(x, n, units[3], price, unit_cost, disposal)
        avg_profit = np.mean(profit_60)
        avg_ls.append({'p10': np.mean(profit_10),
                       'p20': np.mean(profit_20),
                       'p40': np.mean(profit_40),
                       'p60': np.mean(profit_60)})
        y += 1
    mcs_p10, mcs_p20, mcs_p40, mcs_p60 = [], [], [], []
    for row in avg_ls:
        mcs_p10.append(row['p10'])
        mcs_p20.append(row['p20'])
        mcs_p40.append(row['p40'])
        mcs_p60.append(row['p60'])
    display(np.mean(mcs_p10), 0)
    display(np.mean(mcs_p20), 1)
    display(np.mean(mcs_p40), 2)
    display(np.mean(mcs_p60), 3)

內容解密:

  1. 需求函式(demand()):根據給定的機率分佈生成隨機需求量。
  2. 生產函式(production()):根據需求量、生產量、價格、單位成本和處置成本計算利潤。
  3. 蒙地卡羅模擬函式(mcs()):進行指定次數的模擬,計算每次模擬的利潤。
  4. 顯示函式(display()):輸出不同生產量下的平均利潤。
  5. 巢狀蒙地卡羅模擬:在主程式中,對不同的生產量進行多次MCS,並計算平均利潤。

使用機率密度函式與累積分佈函式進行隨機性分析

在資料科學中,隨機性是模擬現實世界的重要工具。機率密度函式(PDF)和累積分佈函式(CDF)是理解隨機變數行為的關鍵概念。

程式碼範例:繪製PDF、CDF和ICDF

import matplotlib.pyplot as plt
from scipy.stats import norm
import numpy as np

if __name__ == '__main__':
    x = np.linspace(norm.ppf(0.01), norm.ppf(0.99), num=1000)
    y1 = norm.pdf(x)
    plt.figure('PDF')
    plt.xlim(x.min()-0.1, x.max()+0.1)
    plt.ylim(y1.min(), y1.max()+0.01)
    plt.xlabel('x')
    plt.ylabel('Probability Density')
    plt.title('Normal PDF')
    plt.scatter(x, y1, c=x, cmap='jet')
    plt.fill_between(x, y1, color='thistle')
    plt.show()
    plt.close('PDF')

    plt.figure('CDF')
    plt.xlabel('x')
    plt.ylabel('Probability')
    plt.title('Normal CDF')
    y2 = norm.cdf(x)
    plt.scatter(x, y2, c=x, cmap='jet')
    plt.show()
    plt.close('CDF')

    plt.figure('ICDF')
    plt.xlabel('Probability')
    plt.ylabel('x')
    plt.title('Normal ICDF (PPF)')
    y3 = norm.ppf(x)
    plt.scatter(x, y3, c=x, cmap='jet')
    plt.show()
    plt.close('ICDF')

內容解密:

  1. 機率密度函式(PDF):描述隨機變數在某一點的機率密度。
  2. 累積分佈函式(CDF):描述隨機變數小於或等於某一值的機率。
  3. 逆累積分佈函式(ICDF或PPF):CDF的逆函式,用於根據給定的機率查詢對應的分位數。
  4. 繪圖:使用matplotlib函式庫繪製PDF、CDF和ICDF的圖形,以視覺化方式展示這些概念。