Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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]

enter image description here

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]

enter image description here

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?

share
    
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
1  
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

2 Answers 2

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 &];
share

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}}]}]

without

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

with

share

This site is currently not accepting new answers.

Not the answer you're looking for? Browse other questions tagged .