# Simulating a Stochastic Process within certain bounds

I would like to simulate paths of a Geometric Brownian Motion till it hits one of two barriers, say 10 or 200.

data2 = RandomFunction[
GeometricBrownianMotionProcess[0.05, .15, 100], {0, 10, .01}, 1]
ListLinePlot[data2]


data3 = %69["Path"]

data4 = {}

j = 1; While[data3[[j, 2]] < 200 && data3[[j, 2]] > 10,
data4 = Append[data4, {data3[[j, 1]], data3[[j, 2]]}]; j++]

ListLinePlot[data4]


This works but is clunky and inelegant. Is there someway I can do it better or maybe run the simulation till some barrier is hit instead of truncating the data post simulation?

• Please don't use %69 — your %69 is not the same for anyone else and they will not be able to run it (also, I save only 1 previous output)... – rm -rf May 11 '13 at 0:25
• No time to try this, but I wonder if Rescale or RescalingTransform might help? – Jagra May 11 '13 at 0:25
• @rm-rf I have no clue what %69 even is. When I Shift Enter data2, MMA-9 prints: Temporaldata[1]. Then MMA-9 gives this window right below Temporaldata[1]. That window gave a drop down menu called properties which had path as an option. When I clicked on path, it ran the command %69["path"] and spat out the data. So I just re-used that command to catch that data. The documentation for % doesn't explain what it is so perhaps you can shed some light on it. – Amatya May 11 '13 at 2:43
• @Amatya % is the previous input, %% 2 inputs prior, %n n inputs prior (all, as indicated by the In[n] and not by your current position) – rm -rf May 11 '13 at 2:45
• To be slightly more precise: %n is the nth input not n inputs before current. – Sjoerd C. de Vries May 11 '13 at 6:48

I am not aware of possibilities to set up RandomFunction with barriers. However, your after-the-fact selection of data can be done somewhat more elegantly indeed:

data4 = TakeWhile[data3, 10 < #[[2]] < 200 &];


I didn't manage to make it work with RandomFunction, but if you would consider running simulations without it you could use TruncatedDistribution.

Define the parameters :

mu = 5/100; sigma = 15/100; x0 = 100;

xmin = 80; xmax = 200;

tmin = 1/100; tmax = 10; dt = 1/100;


Define the truncated distribution :

trDist[xmin_, xmax_, mu_, sigma_, x0_, t_] := TruncatedDistribution[{xmin, xmax},
LogNormalDistribution[Log[x0] + (mu - 1/2 sigma^2) t, sigma Sqrt[t]]]

d = Transpose[RandomVariate[LogNormalDistribution[Log[x0] + (mu - 1/2 sigma^2) #,
sigma Sqrt[#]], 2] & /@ Range[tmin, tmax, dt]];
paths = Transpose[{Range[tmin, tmax, dt], #}] & /@ d;

d2 = Transpose[RandomVariate[trDist[xmin,xmax,mu,sigma,x0,#], 2] & /@ Range[tmin,tmax,dt]];
paths2 = Transpose[{Range[tmin, tmax, dt], #}] & /@ d2;


Check :

ListLinePlot[paths, PlotRange -> {0, All}, Epilog -> {Black, Line[{{tmin, xmin}, {tmax, xmin}}], Line[{{tmin, xmax}, {tmax, xmax}}]}]


ListLinePlot[paths2, PlotRange -> {0, All}, Epilog -> {Black, Line[{{tmin, xmin}, {tmax, xmin}}], Line[{{tmin, xmax}, {tmax, xmax}}]}]