Hi Christopher,

There may be a better way (and I'm sure my Julia code sucks), but in terms 
of fitting a binary tree into a matrix (and n-tree into an n-array), this 
is what I meant:

julia> function build_tree(S0::Float64,pu::Float64,pd::Float64,N::Int64)
         stockTree = zeros(N,N)

         u = 1 + pu
         d = 1 - pd
         for i = 1:N
           for j = 1:N
             stockTree[i,j] = S0 * u ^ (j-1) * d ^ (i-1)
           end
         end

         return stockTree
       end
build_tree (generic function with 2 methods)

julia> build_tree(50.0,.2,.2,5)
5x5 Array{Float64,2}:
 50.0   60.0    72.0     86.4     103.68
 40.0   48.0    57.6     69.12     82.944
 32.0   38.4    46.08    55.296    66.3552
 25.6   30.72   36.864   44.2368   53.0842
 20.48  24.576  29.4912  35.3894   42.4673

 
If you look at this with your head tilted sideways, you will see a binary 
tree :)

As a sidenote, I've considered (time permitting - and it is never 
permitting) to develop a discrete stochastic calculus Julia package 
following ideas from automatic differentiation, e.g. ForwardDiff.jl, that 
can solve these tree pricing problems automatically following the "meta" 
concepts in the paper I linked to. More generally, there is a unique 
"calculus" (abstract differential algebra 
<https://en.wikipedia.org/wiki/Differential_algebra>) associated with every 
directed graph and conversely, given a differential algebra it is a fun 
problem to find a directed graph that gives rise to that algebra. For both 
exterior calculus and stochastic calculus, it turns out that the binary 
tree is "unreasonably effective".

On Saturday, October 24, 2015 at 11:48:26 PM UTC+8, Christopher Alexander 
wrote:
>
> Eric, thanks for the response and pointers!  In terms of constructing a 
> Matrix, are you talking about something like this?
>
> *3x3 Array{Float64,2}:*
>
> * 50.0  40.0  32.0*
>
> *  0.0  60.0  48.0*
>
> *  0.0   0.0  72.0*
>
>
> The graph option is interesting too, I hadn't thought about that.  Thanks 
> for the link to the paper, this is extremely helpful!
>
> Thanks!
>
> Chris
>
>
> On Friday, October 23, 2015 at 8:35:53 PM UTC-4, Eric Forgy wrote:
>>
>> Hi Christopher,
>>
>> I am just learning then Julian way myself, but one thing that "might" be 
>> better than an array of growing arrays is to note that a binary tree can be 
>> laid into a matrix, i.e. Array{Float64,2}, by rotating it. This is nice in 
>> case you ever need a ternary tree, which could be represented by 
>> Array{Float64,3}, etc.
>>
>> Another thing you might consider is to treat the tree as a directed graph 
>> and look at incorporating one of the Julia graph theory packages.
>>
>> On the topic, I have a paper (shameless plug alert!) you might be 
>> interested in:
>>
>>    - *Financial Modelling Using Discrete Stochastic Calculus* 
>>    <http://phorgyphynance.files.wordpress.com/2008/06/discretesc.pdf>
>>    
>> More papers here <https://phorgyphynance.wordpress.com/my-papers/>.
>>
>>
>> On Saturday, October 24, 2015 at 7:50:59 AM UTC+8, Christopher Alexander 
>> wrote:
>>>
>>> Hello all,
>>>
>>> I am trying to write a method that builds a binomial tree for option 
>>> pricing.  I am trying to set up my tree like this:
>>>
>>> function build_tree(s_opt::StockOption)
>>>   u = 1 + s_opt.pu
>>>   d = 1 - s_opt.pd
>>>   # qu = (exp((s_opt.r - s_opt.div) * s_opt.dt) - d) / (u - d)
>>>   # qd = 1 - qu
>>>
>>>   # init array
>>>    stockTree = Vector{Float64}[ zeros(m) for m = 1:s_opt.N + 1]
>>>
>>>   for i = 1:s_opt.N + 1
>>>     for j = 1:i
>>>       stockTree[i][j] = s_opt.S0 * u ^ (j-1) * d ^ (i - j)
>>>     end
>>>   end
>>>
>>>   return stockTree
>>> end
>>>
>>> Is this the most "Julian" way to do this (I didn't find really any 
>>> modules that would suit this purpose)?
>>>
>>> Here is what prints out:
>>>
>>> *3-element Array{Array{Float64,1},1}:*
>>>
>>> * [50.0]                       *
>>>
>>> * [40.0,60.0]                  *
>>>
>>> * [32.00000000000001,48.0,72.0]*
>>>
>>> I suppose also I could default the [1][1] state to the spot price (S0), 
>>> so then I don't need to alter the looping range and instead start the range 
>>> at 2.
>>>
>>> Thanks!
>>>
>>> Chris
>>>
>>

Reply via email to