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.

excuse me, I think I have here a technical problem with Mathematica yesterday I posted the question with the title: Forecast Future Stock Prices - Brownian Motion I am still not very experienced but when I copied your code and entered it, it worked perfectly. Today I reopened the Wolfram Finance Platform Quickstart Notebook, and tried to work further in a new notebook. Again it didn’t work. And when I opened the notebook with the code you sent me, and refreshed it, also the one that worked perfectly didn’t work anymore. Could it be that Mathenatica cannot distinguish between the two notebook, although they weren’t open at the same time? Or what could be the problem? Thank you for your help.

So the whole code is here:

BrownianMotion[period_, "steps_Integer:" 1000, "init_:" 0] := 
 Accumulate[Prepend[RandomVariate[NormalDistribution[0, Sqrt[period⁄steps]], steps], init]]
ListLinePlot[BrownianMotion[1, 1000], AxesLabel \[RightArrow] {"Time", B_t}, 
 PlotLabel \[RightArrow] Style["Stochastic Brownian Motion", Bold]]

BrownianMotionPaths[period_, "steps_Integer:" 1000, paths_Integer, 
  init_List] /; (Length[init] == paths) ≔Transpose[
   Accumulate[Prepend[
     RandomVariate[NormalDistribution[0, Sqrt[period/steps]], {steps, paths}], init]]]
brownianPath = 
 ListLinePlot[BrownianMotionPaths[1, 1000, 50, ConstantArray[0.5, 50]], 
  AxesLabel \[RightArrow] {"Time", B_t}, 
  PlotLabel \[RightArrow] Style["Stochastic Brownian Motion", Bold]]
GOOGExpRet = Mean[FinancialData["GOOG", "Return", DatePlus[-365], "Value"]]
GOOGPrice = FinancialData["GOOG"]
GOOGVol = FinancialData["GOOG", "Volatility50Day"]

ListLinePlot[
 GOOGPrice*(1 + GOOGExpRetConstantArray[1, 251] + BrownianMotion[1, 250]*GOOGVol), 
 AxesLabel \[RightArrow] {"Time", B_t}, 
 PlotLabel \[RightArrow] Style["Simulated Google Price", Bold]]
ListLinePlot[
 GOOGPrice*(1 + GOOGExpRetConstantArray[1, {50, 251}] + 
    BrownianMotionPaths[1, 250, 50, ConstantArray[0.5, 50]]*GOOGVol), 
 AxesLabel \[RightArrow] {"Time", "St"}, 
 PlotLabel \[RightArrow] Style["Simulated Google Price", Bold], 
 ImageSize \[RightArrow] 400]
Mean[(GOOGPrice (1 + GOOGExpRetConstantArray[1, {50, 251}] + 
       BrownianMotionPaths[1, 250, 50] GOOGVol))[[All, -1]]];

GOOGBMPlot = 
 Block[{meanGOOGPrice = 
    Mean[(GOOGPrice (1 + GOOGExpRetConstantArray[1, {50, 251}] + 
          BrownianMotionPaths[1, 250, 50] GOOGVol))[[All, -1]]]}, "
    " simulatedGOOGPaths = 
   ListLinePlot[
    GOOGPrice (1 + GOOGExpRetConstantArray[1, {50, 251}] + 
       BrownianMotionPaths[1, 250, 50] GOOGVol), AxesLabel \[RightArrow] {"Time", S_t}, 
    PlotLabel \[RightArrow] Style["Simulated Google Prices\n(Brownian Motion)", Bold], 
    BaseStyle \[RightArrow] style, PlotRange \[RightArrow] {{0, 260}, {0, 1200}}, 
    PlotStyle \[RightArrow] Directive[{Thin, Lighter@Gray}], 
    Epilog \[RightArrow] {{m8red[1], Point[{250, meanGOOGPrice}]}, 
      Text[Style["Mean\n$" <> ToString[PaddedForm[meanGOOGPrice, {5, 2}]], m8red[1], Bold,
         FontFamily \[RightArrow] "Verdana"], {215, meanGOOGPrice}], {m8red[1], 
       Line[{{245, meanGOOGPrice}, {255, meanGOOGPrice}}]}}]]

Hope you guys can help me. And one more question: how can I copy the mathematica code into a word file without having it in the formulae format? Thanks

share|improve this question
    
You also have to be careful of copying pasting bits of code from notebooks like this. Although it looks like a series of slides, there may well be definitions in previous slides that have to be evaluated in order. Also, there may be initialization cells that have to be evaluated at the outset (and you can't always see them). Plus all the Unicode translation problems... Caveat copier! –  cormullion May 23 '13 at 14:50
1  
@Milan Ivica I don't think you need to define a new BrownianMotion function once you can use GeometricBrownianMotionProcess from Mathematica... Try, for instance, example[trend_] := RandomFunction[ GeometricBrownianMotionProcess[trend, .4, 1], {0, 10, .01}]["Path"] and then use ListLinePlot[Table[example[trend],{trend,{0,.3,.5}}]]... –  Rod May 23 '13 at 15:27

2 Answers 2

up vote 9 down vote accepted

Maybe this question will be closed again. Anyway I'll try to answer the question not correcting the original code, but using a new one with some basic explanations...

First of all, you can basically divide stocks in two big groups: growth stocks and value stocks. This is important, because the way you simulate growth stocks is completely different from that of value stocks. So let me start with growth stocks...


Growth stocks

Historical example: Microsoft from 1986 to 2000

DateListLogPlot[FinancialData["MSFT",{{1986},{2000}}],Joined->True]

enter image description here

Now consider a Geometric Brownian Motion with drift.

ListLogPlot[Table[RandomFunction[GeometricBrownianMotionProcess[0.5, .4, 1], {0, 14, .003}]["Path"], {1}], Joined -> True]

enter image description here


Value stocks

Historical example: Microsoft from 2000 until 2012

DateListLogPlot[FinancialData["MSFT", {{2000}, {2012}}],Joined -> True]

enter image description here

Now consider a Geometric Brownian Motion without drift:

ListLogPlot[Table[RandomFunction[GeometricBrownianMotionProcess[0.1, .4, 1], {0, 14, .003}]["Path"], {1}], Joined -> True]

enter image description here

So if you want to forecast future stock prices you have to keep in mind what kind of stock you're trying to forecast/simulate in order to use the right Geometric Brownian Motion: with or without drift.

EDITED

Now consider 1000 simulations for a growth stock (i.e., 1000 Geometric Brownian Motions with drift):

ListLogPlot[Table[RandomFunction[GeometricBrownianMotionProcess[0.5, .4, 1], {0, 14, .003}]["Path"], {1000}], Joined -> True]

enter image description here

And, finally, consider 1000 simulations for a value stock (i.e., 1000 Geometric Brownian Motions withouth drift):

ListLogPlot[Table[RandomFunction[GeometricBrownianMotionProcess[0.1, .4, 1], {0, 14, .003}]["Path"], {1000}], Joined -> True]

enter image description here

P.S.: please keep in mind that $\mu$ in the function GeometricBrownianMotionProcess[μ, σ, x0] represents exactly the drift of the process. If you set it too high, you get a process with drift. If you set it close to zero, you get a process without drift.

P.S.2: you can also compute historical volatility and use it as $\sigma$ in the function GeometricBrownianMotionProcess[μ, σ, x0].

share|improve this answer
    
Thank you a lot for the explanation –  Milan Ivica May 23 '13 at 16:21
    
Thank you a lot, I will post a question here and I hope you can also help me again. –  Milan Ivica May 24 '13 at 14:31

You have a bunch of \[RightArrow] symbols where you should have -> or \[Rule] (which -> automatically converts to in typing). I think this is the result of copying code from HTML where these characters were converted to a generic Unicode symbol. Try replacing every \[RightArrow] with \[Rule] and try again.


Second try:

I missed a key paragraph I think:

Again it didn’t work. And when I opened the notebook with the code you sent me, and refreshed it, also the one that worked perfectly didn’t work anymore. Could it be that Mathenatica cannot distinguish between the two notebook, although they weren’t open at the same time?

Notebooks using the same symbols sure will interfere if they are not configured to use separate contexts. Please read this and report any progress:

Is there a way to separate variables between multiple notebooks?

share|improve this answer
    
Thanks, I already did it, and it didn't work. I used -> instead of of [RightArrow]. So that is not the problem. I seriously do not know why it is not working. –  Milan Ivica May 23 '13 at 14:11
    
@MilanIvica I missed a key paragraph I think. Answer updated. –  Mr.Wizard May 23 '13 at 14:25
    
Hi, thank you, I figured out why it is not working. I downloaded the original code from: wolfram.com/training/courses/fin021.html and the guy uses the following code: ListLinePlot[ GOOGPrice (1 + GOOGExpRet ConstantArray[1, {50, 251}] + BrownianMotionPaths[1, 250, 50] GOOGVol), AxesLabel -> {"Time", "\!(*SubscriptBox[(S), (t)])"}, PlotLabel -> Style["Simulated Google Prices", Bold], BaseStyle -> style] ... but if you add BrownianMotionPaths[1, 250, 50, ConstantArray[0.5, 50]] it works perfectly. thank you. –  Milan Ivica May 23 '13 at 15:44
    
@MilanIvica That's the same error that I mentioned in yesterday's answer... –  Sjoerd C. de Vries May 23 '13 at 19:39
    
@ Sjoerd C. de Vries, yes thats true, thank you again for your help –  Milan Ivica May 24 '13 at 12:31

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.