微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于执行二项式期权定价模型的树数据结构

如何解决用于执行二项式期权定价模型的树数据结构

我正在开始实施二项式期权定价模型。在此模型下,股票的价格建模如下。在初始时间,价格由S_0给出。在时间n = 1时,价格上涨或下跌。在向上状态下,价格在n = 1时为u * S_0,在向下状态下,价格为d * S_0。在时间n = 2时,这两个价格中的每一个“分裂”为上/下状态。对应于第一价格,在时间n = 2处,我们处于上升状态u ^ 2 * S_0,而处于下降状态u * d * S_0。对应于第二价格,我们处于上升状态d * u * S_0,而处于下降状态d ^ 2 * S_0。由于u * d * S_0 = d * u * S_0,因此在时间n = 2时,我们有三个可能的价格:u ^ 2 * S_0,u * d * S_0 = S_0(我们可以假设u * d = 1),以及d ^ 2 * S_0。该模型可以可视化为一种“树”:

enter image description here

我发现该模型的所有实现都会生成这些价格,并将它们存储在numpy数组中作为上三角矩阵。一切都很好,我敢肯定,我能弄清楚,但是当我开始考虑这个项目时,我的直觉是使用树数据结构并实现各种期权定价公式,例如递归方法。但是,我不认为上面的“树”在数据结构术语中是二叉树,因为子树似乎具有“多个根”。

我有以下二叉树类:

class BinaryTree: 
    class Node: 
        def __init__(self,val,left=None,right=None):
            self.val = val
            self.left = left
            self.right = right

    def __init__(self):
        self.size = 0
        self.root = None

    def pprint(self,width=64):
        height = self.height()
        nodes  = [(self.root,0)]
        prev_level = 0
        repr_str = ''
        while nodes:
            n,level = nodes.pop(0)
            if prev_level != level:
                prev_level = level
                repr_str += '\n'
            if not n:
                if level < height-1:
                    nodes.extend([(None,level+1),(None,level+1)])
                repr_str += '{val:^{width}}'.format(val='-',width=width//2**level)
            elif n:
                if n.left or level < height-1:
                    nodes.append((n.left,level+1))
                if n.right or level < height-1:
                    nodes.append((n.right,level+1))
                repr_str += '{val:^{width}}'.format(val=n.val,width=width//2**level)
        print(repr_str)

    def __len__(self):
        return self.size

    def height(self):
        def height_rec(t):
            if not t:
                return 0
            else:
                return 1 + max(height_rec(t.left),height_rec(t.right))

        return height_rec(self.root)
    
    def add(self,val):
        assert(val not in self)
        def add_rec_notin(node):
            if not node: 
                return BinaryTree.Node(val)
            elif val < node.val: # adding to the left
                return BinaryTree.Node(node.val,left=add_rec_notin(node.left),right=node.right)
            else: # val > node.val,adding to the right
                return BinaryTree.Node(node.val,left=node.left,right=add_rec_notin(node.right))
            
        self.root = add_rec(self.root)
        self.size += 1
    
    def __iter__(self):
        def iter_rec(node):
            if node: 
                for x in iter_rec(node.left):
                    yield x
                for x in iter_rec(node.right):
                    yield x
        for x in iter_rec(self.root):
            yield x

我尝试在每个时间t生成价格,并使用add方法来构建价格树

T = 2     # time periods
S0 = 2    # initial stock prie
d = 0.9   # down factor
u = 1.1   # up factor

stock_tree = BinaryTree() 

stock_prices = []
for t in range(T+1): 
    lst = []
    for r in range(t+1):
        lst.append(S0 * (u ** r) * (d **(t-r)))
    stock_prices.append(lst)
    
for p in stock_prices: 
    for i in range(len(p)):
        stock_tree.add(round(p[i],3))
        
stock_tree.pprint()



                          2.0                               
          1.8                             2.2               
  1.62            1.98             -              2.42 

我不认为有一种方法可以使用二叉树数据结构。即使我尝试将重复值1.98添加到树上,它也不会进入上方的空白点:它将作为1.98的右子元素添加到左子树上。

这里还有另一个有用的数据结构吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。