xellstorm
ZH
開啟應用程式

需求不確定時,該訂購多少件?

實作範例 · 訂購量 · 更新於 2026年10月

訂購量要取需求有 66.7% 的時間低於它的那個數量,也就是臨界分位數:需求平均 1,000 件(標準差 200),每件售價 10、成本 4、剩貨殘值 1,這個數量就是 1,086.1 件,預期利潤為 5,345.5。用蒙地卡羅搜尋範例 Excel 檔案,選出最接近這個最佳值的間隔值 1,090 件。

臨界分位數這一點的意思是:多賣出一件的機率乘以獲利,剛好等於它賣不掉的機率乘以損失;若流失一筆銷售放棄的利潤高於一件剩貨的成本,這一點就高於需求中位數(需求有一半時間會超過的水準)。這個範例的需求是常態分配,中位數就是平均值,金額以 Excel 檔案的貨幣單位計。搜尋範圍是 600 至 1,600 件的訂購量,以 10 件為間隔;訂購 1,090 件時,平均利潤為 5,345 ± 31(95% 信賴區間,5,000 個模擬銷售季),有 32.6% 的銷售季需求超過庫存。

模型

這就是報童問題(newsvendor):銷售季開始前只下一次訂單,需求只知道是一段可能的範圍,賣不完的商品在季末低價出清,超過訂購量的需求就流失了。Excel 檔案只有一張工作表 Model,A 欄是標籤,B 欄是數值:

範例的數字(金額以 Excel 檔案的貨幣單位計)
訂購量,B11,000 件(決策)
價格,B2每售出一件 10
單位成本,B3每訂購一件 4
殘值,B4每件剩貨 1
需求,B6常態分配,平均值 1,000 件,標準差 200

四個公式把訂購量與需求值轉成該銷售季的結果:售出件數(Sold),=MIN(B1,B6);剩貨件數(Leftover),=MAX(B1-B6,0);利潤(Profit),=B2*B8+B4*B9-B3*B1,即銷售收入加殘值,再減去整批訂購的成本;以及缺貨損失(Lost sales),=MAX(B6-B1,0),也就是訂購量滿足不了的需求。這裡的缺貨指有缺貨損失的銷售季:需求高於訂購量。沒有增益集函數。

下載的檔案有這些公式、1,000 件的訂購量,以及需求儲存格裡固定的預留值。需求分配、兩個輸出(Profit 與 Lost sales)、缺貨目標與最佳化研究,都在 xellstorm 裡設定,隨範例一起載入,放在 Excel 檔案旁邊;Excel 檔案本身維持一般自建的樣子。

常態分配原則上允許負的需求,但零在平均值之下 5 個標準差處,機率約為 3.5 百萬分之 1;5,000 個模擬需求中最低的是 200 件。需求以連續數字抽出,所以銷售量、剩貨量與下文目標搜尋得到的訂購量都可能有小數;下訂單時請四捨五入成整數件。

為什麼要訂得比平均需求多?

想想訂購的最後一件。賣出去,賺價格減成本,10 − 4 = 6;賣不掉,虧成本減殘值,4 − 1 = 3。只要賣出的機率乘以 6,大於賣不掉的機率乘以 3,多訂一件就划算;也就是賣出的機率只要高於 3 / (6 + 3) = 33.3%。訂購量等於平均需求 1,000 件時,下一件有一半的機率賣出,所以訂得更多划算。多訂到需求有 66.7% 的時間低於訂購量,就不再划算。

模擬逐個銷售季重現同樣的算術。在同樣的 5,000 個模擬銷售季上,訂購 1,090 件而非 1,000 件:需求達到 1,090 件的銷售季(占 32.6%),恰好多賺 540(90 × 6);需求不超過 1,000 件的銷售季(占 50%),恰好少賺 270(90 × 3);介於兩者之間的銷售季,差額落在這兩個數字之間。平均而言,較大的訂購量每個銷售季多賺 63.5,和下方公式算出的理論值相同(63.5)。

理論值:臨界分位數

這條規則叫臨界分位數:最佳訂購量 Q* 是「不被超過的機率」等於 (價格 − 成本) / (價格 − 殘值) 的需求水準,這裡為 (10 − 4) / (10 − 1) = 0.667。需求為常態分配時,Q* = 平均值 + z × 標準差,其中 z = 0.4307 是標準常態分配下方機率為 66.7% 的點(Excel 用 =NORM.S.INV(6/9))。所以 Q* = 1,000 + 0.4307 × 200 = 1,086.1 件。

預期利潤也有解析解。任一訂購量 Q,令 z = (Q − 平均值) / 標準差,預期利潤為 (價格 − 殘值) × (平均值 − 標準差 × L(z)) − (成本 − 殘值) × Q,其中 L(z) = φ(z) − z × (1 − Φ(z)) 是標準常態損失函數,φ 是標準常態密度函數,Φ 是其累積分配函數(Excel 用 =NORM.S.DIST(z,FALSE)-z*(1-NORM.S.DIST(z,TRUE)));標準差 × L(z) 就是預期缺貨損失。到了 Q*,式子化簡為 (價格 − 成本) × 平均值 − (價格 − 殘值) × 標準差 × φ(z) = 5,345.5,缺貨機率為 1 − 0.667 = 33.3%。改訂平均需求 1,000 件,預期利潤則為 5,281.9。

用模擬搜尋訂購量

公式要求模型夠簡單(單一產品、一次訂購、價格固定),需求分配的分位數與預期缺貨損失也要有公式可用;模擬只需要能抽出需求,本例也驗證它找到相同的答案。隨範例載入的最佳化研究,以訂購量(B1)為決策,從 600 到 1,600 件、每 10 件試一次,共 101 個候選方案,目標是讓 Profit 的平均值最大。另有一項限制條件:缺貨機率(Lost sales 大於零的試驗所占比例)至多為 50%。每個候選方案用 1,000 次試驗模擬,最好的三個再用 5,000 次試驗重跑,每次都用同一組需求亂數。這就是共同亂數:候選方案之間的差異只來自訂購量,而不是抽到的運氣。

各訂購量的平均利潤從 600 到 1,600、每隔 10 的每個訂購量,1,000 個模擬銷售季的平均利潤,其 95% 區間以色帶表示,預期利潤的理論值為虛線。曲線在搜尋中的峰值為 1,100 件;以 5,000 次試驗重新執行後選出 1,090 件,平均利潤為 5,345。3,5004,0004,5005,0005,5006008001,0001,2001,4001,600最佳 1,090虛線:理論值
每個銷售季的平均利潤與訂購量(件)的關係:每個訂購量 1,000 個模擬銷售季(實線)及其 95% 區間(色帶),以及由常態公式算出的預期利潤理論值(虛線)。點線標示以 5,000 次試驗重新執行後勝出的訂購量。
以 5,000 次試驗重新執行的最佳訂購量(平均利潤及其 95% 區間)
訂購量(件)平均利潤預期利潤(理論值)缺貨機率
1,0905,345 ± 315,345.432.6%
1,1005,344 ± 315,344.030.9%
1,1105,341 ± 325,340.929.1%

重新執行選出 1,090 件:平均利潤為 5,345 ± 31,這個訂購量的理論值為 5,345.4,缺貨的銷售季占 32.6%(理論值:32.6%)。這是最接近理論最佳值 1,086.1 的間隔值,預期利潤的理論值 5,345.5 也落在區間內。

前三名訂購量的區間幾乎完全重疊,勝出者卻很明確。每個區間是 xellstorm 對該候選方案平均值雜訊的估計,依其試驗分成 20 批、看各批平均值的差異而得。xellstorm 預設的拉丁超立方抽樣,會把每次執行的抽取值均勻分散在需求分配上,整次執行的平均值比區間顯示的更穩定:換另外 3 個亂數種子重新執行,1,090 件的平均利潤與本次的差距都在 0.2 以內。

要在候選方案之間做取捨,看的是它們的差異;而相同的抽取值會讓所有候選方案同升同降,所以差異比各自的區間穩定得多。逐個銷售季比較,訂購 1,090 件勝過 1,100 件,利潤高出 1.43(95% 信賴區間 0.47 至 2.39),區間不含零:優勢不是偶然,但差距很小。預期利潤差距的理論值為 1.43。頂點附近的利潤曲線很平坦,差一個間隔幾乎沒有代價;在範圍兩端,也就是 600 與 1,600 件,預期利潤降為 3,585 與 4,199。

搜尋本身把 1,100 件排第一,平均利潤為 5,370.3,1,090 件則為 5,369.9。搜尋只用 5,000 次試驗中的前 1,000 次,而這些試驗碰巧抽到略高的需求,平均 1,003.7 件,全部試驗平均為 1,000.0 件,使頂點附近較大訂購量的利潤升高,把峰值往上推了一個間隔。用 5,000 次試驗重新執行後就能定案;重新執行若改變了勝出者,xellstorm 也會明確指出。

限制條件,以及減少缺貨的代價

缺貨限制條件在此並未起作用。它排除了 1,000 件或更少的訂購量(訂購 1,000 件時,搜尋的試驗有 51.6% 發生缺貨):需求為常態分配時,訂購量等於平均值,有一半的時間會缺貨。最佳訂購量已把缺貨機率降到 32.6%。

各訂購量的缺貨機率各訂購量在 1,000 個模擬銷售季中,需求高於訂購量的比例,其 95% 區間以色帶表示,理論機率為虛線;限制條件的上限 50% 為點線。在 1,090 件的最佳訂購量下,機率為 32.6%(使用 5,000 次試驗);目標搜尋則在 1,256.25 件得到 10% 的機率。0%25%50%75%100%6008001,0001,2001,4001,600上限 50%最佳 1,090虛線:理論值1,256 件時 10%
缺貨機率(需求高於訂購量)與訂購量的關係:每個訂購量 1,000 個模擬銷售季(實線,含其 95% 色帶)、理論機率(虛線)、研究的上限 50%(點線),以及 10% 的目標搜尋答案。

若 32.6% 的銷售季缺貨仍嫌太頻繁,例如顧客看到貨架空了就不再回來,就選定能接受的機率,讓目標搜尋找出訂購量。xellstorm 的目標搜尋會把訂購量範圍一再對半縮小,直到統計量達到目標。每次評估用 5,000 次試驗,經過 7 次評估找到 1,256.25 件,這時恰有 10% 的試驗缺貨。理論值是需求有 90% 機率不被超過的水準:1,000 + 200 × NORM.S.INV(0.9) = 1,256.3 件。

在相同的 5,000 個模擬銷售季上,訂購 1,000 件(平均需求)、1,090 件(平均利潤最高)與 1,256.25 件(缺貨機率 10%)的結果
訂購量(件)1,0001,0901,256.25
平均利潤5,2825,3455,146
P10 利潤3,6953,4252,926
缺貨機率50%32.6%10%
平均剩貨件數80133266
平均缺貨損失(件)80439

把缺貨機率從 32.6% 降到 10%,要多訂 166 件,其中平均每個銷售季有 133 件賣不掉,每季平均利潤也少 199(3.7%;兩個訂購量的預期利潤差距,理論值為 199.4)。P10 利潤(90% 的銷售季能達到的水準)也會從 3,425 降到 2,926:需求疲弱的銷售季,訂得多就有更多庫存賣不出去(請參閱 P50、P80 與 P90)。只訂平均需求的方案,P10 利潤是三者中最高,但有 50% 的銷售季缺貨。少缺貨值不值得這個代價,是商業上的決定;模擬則把這個代價算成數字。

親自試試

  1. 在 xellstorm 開啟模型。需求分配、輸出 Profit 與 Lost sales、目標(Lost sales 大於零,即缺貨機率)以及最佳化研究都已設好;不必安裝,也不必註冊,Excel 檔案直接在瀏覽器計算。
  2. 執行看看。以儲存的訂購量 1,000 件、範例的亂數種子(7)與 5,000 次試驗執行,平均利潤為 5,282,缺貨機率為 50%。
  3. 開啟 Optimize 步驟。訂購量(Model!B1)是決策儲存格,範圍從 600 到 1,600,間隔 10;目標是讓 Profit 的平均值最大,限制條件是 Lost sales 大於零的機率至多為 50%。按下 Optimize:應用程式用 1,000 次試驗評估每一種訂購量,用 5,000 次試驗重跑最好的三個,逐次試驗比較勝出者與次佳者,並畫出各訂購量的平均利潤圖與 95% 區間帶。
  4. 要找缺貨機率為 10% 的訂購量,選擇 Goal seek:統計量設為 Probability,條件設為 >、門檻為 0(對象為 Lost sales),目標設為 0.1;清除訂購量的 Step 欄位(它保留了研究中的 10),Trials per evaluation 設為 5,000,再按下 Seek goal。
  5. 按下 Set as fixed cells,再執行一次模擬,就能取得所選訂購量的完整結果;或按下 Add as scenario,在相同的抽取值上與已儲存的訂購量比較。

只用 Excel 也做得到嗎?

這個特例做得到:需求為常態分配時,=NORM.INV((B2-B3)/(B2-B4), 1000, 200) 直接傳回臨界分位數的訂購量 1,086.1。需求偏態時,把 NORM.INV 換成該分配的反函數(LOGNORM.INV、GAMMA.INV,或對過去銷量用 PERCENTILE.INC)即可。但只要多項產品共用預算或倉庫、有最低訂購量,或降價出清的價格取決於剩下多少,這條規則就不再適用。模擬處理得了這些情況,但在一般 Excel 裡對模擬模型做最佳化並不順手:每次重新計算都會抽出新的亂數,資料表或規劃求解會在不同的亂數上比較各個訂購量,追的是雜訊。在同一組固定的亂數上評估每個候選方案,正是 xellstorm 替您做的事。Excel 蒙地卡羅模擬說明一般的做法。

常見問題

什麼是報童模型?

報童模型是個經典問題:需求未知時,為單一銷售期決定備貨量,剩貨以低於成本的價格出清,超過庫存的需求則流失。最佳訂購量就是需求的臨界分位數:需求以機率 (價格 − 成本) / (價格 − 殘值) 不超過的那個數量。名稱來自報販每天早上決定要進多少份報紙;季節性商品、生鮮食品、活動容量與一次性的生產批量,也有同樣的問題。反覆補貨的庫存,請參閱哪個再訂購點能平衡成本與缺貨。

最佳訂購量何時會低於平均需求?

剩貨一件的成本高於流失一筆銷售的利潤時,也就是單位成本減殘值大於價格減單位成本時,最佳訂購量會低於平均需求。這時臨界分位數低於二分之一,而像常態分配這種對稱的需求分配,最佳訂購量就低於平均值。利潤薄、賣不掉的庫存又一文不值,訂購量會被壓低;利潤高、殘值好,訂購量就會推高。

為什麼要在相同的亂數上評估每個訂購量?

在同一組模擬需求上評估每個訂購量,就是共同亂數,候選方案之間的差異只來自訂購量本身。這個範例中,前三名訂購量的 95% 區間幾乎完全重疊,但最好的兩者逐個銷售季的差異,區間為 0.47 至 2.39,不含零。一般蒙地卡羅抽樣會為每個候選方案重新抽取,搜尋就會追逐雜訊:要同樣精確地量出這兩個訂購量的差異,所需試驗次數約為共同亂數的 2,000 倍。

若需求不是常態分配呢?

需求不是常態分配時,臨界分位數仍然成立,但訂購量要取自該分配的分位數函數,上述預期利潤之類的公式也不再適用。模擬只需要分配本身:在 xellstorm 裡,可以為需求儲存格選其他分配,例如對數常態、伽瑪、PERT、卜瓦松或負二項分配;也可以在 Distributions 步驟對過去銷量配適分配,或讓 Excel 檔案由其他不確定的輸入算出需求,再做同樣的最佳化。

相關內容

xellstorm 是在瀏覽器中執行的 Excel 模型蒙地卡羅模擬工具:免裝增益集,Excel 檔案也不會離開您的電腦。