问题描述
我正在开始实施二项式期权定价模型。在此模型下,股票的价格建模如下。在初始时间,价格由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。该模型可以可视化为一种“树”:
我发现该模型的所有实现都会生成这些价格,并将它们存储在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 = 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 (将#修改为@)