蒙地卡羅模擬是一種根據大量隨機試驗的數值計算方法,常用於處理複雜系統中的不確定性問題。在金融領域,它可以有效地模擬股票價格波動、評估投資組合風險、預測產品需求等。透過 Python 的 scipy 和 matplotlib 等函式庫,可以輕鬆實作 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()
內容解密:
cum_price函式:此函式模擬股票價格隨時間的變化。它接受初始價格p、天數d、平均值m和標準差s作為引數。stats.norm.rvs(loc=m, scale=s):使用常態分佈生成隨機變數,其中loc是平均值,scale是標準差。price = (p * prob):計算新的股票價格,將當前價格乘以生成的隨機變數。plt.plot(data, color='lime'):繪製股票價格隨時間變化的圖表,使用石灰綠色表示。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)
內容解密:
- 需求函式(demand()):根據給定的機率分佈生成隨機需求量。
- 生產函式(production()):根據需求量、生產量、價格、單位成本和處置成本計算利潤。
- 蒙地卡羅模擬函式(mcs()):進行指定次數的模擬,計算每次模擬的利潤。
- 顯示函式(display()):輸出不同生產量下的平均利潤。
- 巢狀蒙地卡羅模擬:在主程式中,對不同的生產量進行多次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')
內容解密:
- 機率密度函式(PDF):描述隨機變數在某一點的機率密度。
- 累積分佈函式(CDF):描述隨機變數小於或等於某一值的機率。
- 逆累積分佈函式(ICDF或PPF):CDF的逆函式,用於根據給定的機率查詢對應的分位數。
- 繪圖:使用matplotlib函式庫繪製PDF、CDF和ICDF的圖形,以視覺化方式展示這些概念。