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