GeometricBrownianMotionProcess[μ,σ,x0]
represents a geometric Brownian motion process with drift μ, volatility σ, and initial value x0.
GeometricBrownianMotionProcess
GeometricBrownianMotionProcess[μ,σ,x0]
represents a geometric Brownian motion process with drift μ, volatility σ, and initial value x0.
Details
- GeometricBrownianMotionProcess is also known as exponential Brownian motion and Rendleman–Bartter model.
- In mathematical finance, GeometricBrownianMotionProcess is used in Black–Scholes model for stock price modeling.
- GeometricBrownianMotionProcess is a continuous-time and continuous-state random process.
- The state
of a geometric Brownian motion satisfies an Ito differential equation
, where
follows a standard WienerProcess[]. - The state
follows LogNormalDistribution[(μ-
) t+Log[x0],σ
]. - The parameter μ can be any real number, and σ and x0 any positive real numbers.
- GeometricBrownianMotionProcess can be used with such functions as Mean, PDF, Probability, and RandomFunction.
Examples
open all close allBasic Examples (3)
Simulate a geometric Brownian motion process:
data = RandomFunction[GeometricBrownianMotionProcess[0, .1, 2], {0, 10, .01}]ListLinePlot[data, Filling -> Axis]Mean[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][t]]//SimplifyVariance[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][t]]//SimplifyCovarianceFunction[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]], s, t]Plot3D[CovarianceFunction[GeometricBrownianMotionProcess[0, .6, .3], s, t], {s, 0, 5}, {t, 0, 5}, ColorFunction -> "Rainbow"]Scope (13)
Basic Uses (8)
Simulate an ensemble of paths:
data = RandomFunction[GeometricBrownianMotionProcess[.3, 1, 1], {0, 1, .01}, 4]ListLinePlot[data, Filling -> Axis]Simulate with arbitrary precision:
RandomFunction[GeometricBrownianMotionProcess[0, 1 / 3, 1 / 4], {0, 1, 1 / 4}, WorkingPrecision -> 20]["Path"]Compare paths for different values of the drift parameter:
sample[μ_] := (SeedRandom[14];RandomFunction[GeometricBrownianMotionProcess[μ, 1, .5], {0, 1, .01}])ListLinePlot[sample[#], PlotRange -> {0, 1}, Filling -> Axis, PlotLabel -> StringJoin["μ = ", ToString[#]]]& /@ {-1, 0, 2}Compare paths for different values of the volatility parameter:
sample[σ_] := (SeedRandom[14];RandomFunction[GeometricBrownianMotionProcess[0, σ, .5], {0, 1, .01}])ListLinePlot[sample[#], PlotRange -> {0, 1}, Filling -> Axis, PlotLabel -> StringJoin["μ = ", ToString[#]]]& /@ {.1, .5, 1}Simulate a geometric Brownian motion with different starting points:
proc[x_] := GeometricBrownianMotionProcess[0, .4, x];pts = {.5, 1, 3};SeedRandom[34];
ListLinePlot[RandomFunction[proc[#], {0, 10, .001}]& /@ pts, Filling -> Axis, PlotLegends -> (StringJoin["x = ", ToString[#]]& /@ pts)]data = RandomFunction[GeometricBrownianMotionProcess[0, .1, 2], {0, 100, 0.01}];EstimatedProcess[data, GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]]]CorrelationFunction[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]], s, t]Absolute correlation function:
AbsoluteCorrelationFunction[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]], s, t]Process Slice Properties (5)
Univariate time slice follows a LogNormalDistribution:
GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][t]First-order probability density function:
Plot[Evaluate@Table[PDF[GeometricBrownianMotionProcess[0, 1, 1][t], x], {t, {1 / 2, 1, 2}}], {x, 0, 3}, Filling -> Axis, PlotLegends -> {"t = 1/2", "t = 1", "t = 2"}]PDF[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][t], x]Multi-time slice follows a LogMultinormalDistribution:
GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][{1, 2}]PDF[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][{1, 2}], {x, y}]//SimplifyCompute the expectation of an expression:
Expectation[x[t] ^ 2, xGeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]]]Calculate the probability of an event:
Probability[x[t] < 1, xGeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]]]Skewness[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][t]]Kurtosis[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][t]]Moment[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][t], r]CentralMoment has no closed form for symbolic order:
CentralMoment[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][t], 3]FactorialMoment has no closed form for symbolic order:
FactorialMoment[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][t], 5]Cumulant has no closed form for symbolic order:
Cumulant[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]][t], 4]Generalizations & Extensions (1)
Define a transformed GeometricBrownianMotionProcess:
𝒫 = TransformedProcess[t b[t], bGeometricBrownianMotionProcess[0, 2, 1], t];data = RandomFunction[𝒫, {0, 0.3, 0.01}, 3];ListLinePlot[data, PlotRange -> All]{Mean[𝒫[t]], Variance[𝒫[t]]}CovarianceFunction[𝒫, t, s]Applications (2)
data = FinancialData["SBUX", "Close", {{2013, 1, 1}, {2013, 12, 1}, "Week"}]stocks = QuantityMagnitude[data]dp = DateListPlot[stocks, Filling -> Axis, Joined -> True]Fit a geometric Brownian process to the values:
Clear[a, b, c];proc = EstimatedProcess[stocks["Values"], GeometricBrownianMotionProcess[a, b, c]]Simulate future paths for the next half-year:
paths = RandomFunction[proc, {stocks["PathLength"], stocks["PathLength"] + 26, 1}, 200];td = TemporalData[paths["ValueList"], {data["LastDate"], Automatic, "Week"}, ValueDimensions -> 1]pp = DateListPlot[td, Joined -> True, PlotStyle -> Directive[Opacity[.2]]]Calculate the mean function of the simulations to find predicted future values:
mF = TimeSeriesThread[Mean, td];Show[DateListPlot[stocks, PlotRange -> {{stocks["FirstTime"], td["LastTime"]}, {Min[stocks], Max[td]}}, Joined -> True, Filling -> Axis], pp, DateListPlot[mF, Joined -> True, PlotStyle -> Directive[Thick, Black]]]Find the trend for index SP500:
sp500 = FinancialData["SP500", {{2013, 1, 3}, {2013, 12, 2}}]DateListPlot[sp500]Clear[a, b, c];proc = EstimatedProcess[sp500["Values"], GeometricBrownianMotionProcess[a, b, c]]Simulate future paths for the next 100 business days:
paths = RandomFunction[proc, {sp500["PathLength"], sp500["PathLength"] + 100, 1}, 100];td = TemporalData[paths["ValueList"], {sp500["LastDate"], Automatic, "BusinessDay"}, ValueDimensions -> 1]pp = DateListPlot[td, Joined -> True, PlotStyle -> Directive[Opacity[.2]]]Calculate the mean function of the simulations to find predicted future values:
mF = TimeSeriesThread[Mean, td];Show[DateListPlot[sp500, PlotRange -> {{sp500["FirstTime"], td["LastTime"]}, {Min[sp500], Max[td]}}, Joined -> True, Filling -> Axis], pp, DateListPlot[mF, Joined -> True, PlotStyle -> Directive[Thick, Black]]]Properties & Relations (6)
GeometricBrownianMotionProcess is not weakly stationary:
WeakStationarity[GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]]]Geometric Brownian motion process does not have independent increments:
proc = GeometricBrownianMotionProcess[μ, σ, Subscript[x, 0]];Expectation[(x[t2] - x[t1])(x[t4] - x[t3]), xproc, Assumptions -> 0 < t1 < t2 < t3 < t4]//SimplifyCompare to the product of expectations:
Expectation[(x[t2] - x[t1]), xproc, Assumptions -> 0 < t1 < t2] * Expectation[(x[t4] - x[t3]), xproc, Assumptions -> 0 < t3 < t4]//Simplify% === %%Conditional cumulative probability distribution:
Table[Plot[NProbability[(x[3] <= Subscript[x, 2])(x[1] == Subscript[x, 1]), xGeometricBrownianMotionProcess[0, 1, 2]], {Subscript[x, 2], 0, 14}, Filling -> Axis, PlotRange -> {0, 1}, PlotLabel -> StringJoin["SubscriptBox[x, 1] = ", ToString[Subscript[x, 1]]]], {Subscript[x, 1], {.5, 1, 1.4, 3}}]A geometric Brownian motion process is a special ItoProcess:
ItoProcess[GeometricBrownianMotionProcess[μ, σ, a]]As well as StratonovichProcess:
StratonovichProcess[GeometricBrownianMotionProcess[μ, σ, a]]Geometric Brownian motion is a solution to the stochastic differential equation
:
μ = 1.4;σ = .3;SeedRandom[3];
noisysol = RandomFunction[GeometricBrownianMotionProcess[μ, σ, 1], {0, 3, 0.05}, 5 10 ^ 2];
meanFunction = TimeSeriesThread[Mean, noisysol];Show[ListLinePlot[noisysol, PlotStyle -> Directive[Opacity[.1]]], ListLinePlot[meanFunction, PlotStyle -> Directive[Black, Thick]]]Compare with the corresponding smooth solution:
smoothsol = NDSolve[{P'[t] == μ P[t], P[0] == 1}, P, {t, 0, 3}]Plot[P[t] /. smoothsol, {t, 0, 3}]Use WienerProcess directly to simulate GeometricBrownianMotionProcess:
μ = 1;σ = 1 / 3;x0 = 2;proc = WienerProcess[μ - σ^2 / 2, σ];
SeedRandom[3];
data = RandomFunction[proc, {0, 1, s = .01}];Apply a transformation to the random sample:
sample = x0 Exp[data];It agrees with the algorithm for simulating corresponding GeometricBrownianMotionProcess:
SeedRandom[3];
gbm = RandomFunction[GeometricBrownianMotionProcess[μ, σ, x0], {s, 1 + s, s}];ListLinePlot[{sample, gbm}, PlotStyle -> {Thick, Dashed}]Neat Examples (3)
Simulate a geometric Brownian motion process in two dimensions:
proc = GeometricBrownianMotionProcess[1, 1, .3];
SeedRandom[104];
sample = RandomFunction[proc, {0, 3, 0.001}, 2]["ValueList"];
ListLinePlot[Transpose@sample, ColorFunction -> "FallColors"]Simulate a geometric Brownian motion process in three dimensions:
proc = GeometricBrownianMotionProcess[1, .2, .3];
SeedRandom[123];
sample = Table[RandomFunction[proc, {0, 1, 0.01}, 3]["ValueList"], {6}];Graphics3D@Table[{ColorData["SolarColors"][RandomReal[]], Tube@Line@sample[[i]]}, {i, 6}]Simulate paths from a geometric Brownian motion process:
SeedRandom[154];
data = RandomFunction[GeometricBrownianMotionProcess[0, .3, 1], {0, 1, .01}, 500];Take a slice at 1 and visualize its distribution:
sd = data["SliceData", 1];cf = ColorData["Rainbow"];
sliced = BarChart[Last[#], Axes -> None, BarOrigin -> Left, AspectRatio -> 4, ChartStyle -> (cf /@ Rescale[MovingAverage[First[#], 2], {Min[sd], Max[sd]}, {0, 1}]), ImageSize -> 47]&[HistogramList[sd, {Range[Min[sd], Max[sd], (Max[sd] - Min[sd]) / 20]}]];Plot paths and histogram distribution of the slice distribution at 1:
ListLinePlot[data, ImageSize -> 400, PlotRange -> All,
AspectRatio -> 3 / 4, Epilog -> Inset[sliced, {1.01, 0}, {0, -1.5Exp@Mean[sd]}], PlotStyle -> (cf /@ Rescale[sd]), BaseStyle -> Directive[Thin, Opacity[0.5]], PlotRangePadding -> {{0, .25}, {.5, .5}}]Related Guides
Text
Wolfram Research (2012), GeometricBrownianMotionProcess, Wolfram Language function, https://reference.wolfram.com/language/ref/GeometricBrownianMotionProcess.html (updated 2017).
CMS
Wolfram Language. 2012. "GeometricBrownianMotionProcess." Wolfram Language & System Documentation Center. Wolfram Research. Last Modified 2017. https://reference.wolfram.com/language/ref/GeometricBrownianMotionProcess.html.
APA
Wolfram Language. (2012). GeometricBrownianMotionProcess. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/GeometricBrownianMotionProcess.html
BibTeX
@misc{reference.wolfram_2026_geometricbrownianmotionprocess, author="Wolfram Research", title="{GeometricBrownianMotionProcess}", year="2017", howpublished="\url{https://reference.wolfram.com/language/ref/GeometricBrownianMotionProcess.html}", note=[Accessed: 13-June-2026]}
BibLaTeX
@online{reference.wolfram_2026_geometricbrownianmotionprocess, organization={Wolfram Research}, title={GeometricBrownianMotionProcess}, year={2017}, url={https://reference.wolfram.com/language/ref/GeometricBrownianMotionProcess.html}, note=[Accessed: 13-June-2026]}