2017-04-11 20 views
0

我正在使用Mibian模块来计算调用选项。我有一个三个嵌套列表的列表。每个嵌套列表都代表行使价格。每个嵌套列表都有其各自的到期日期,即my_list [2]还剩30天。如何迭代嵌套列表与另一个列表以创建列表字典Python

 import mibian as mb 
    import pandas as pd 

    my_list = [[20, 25, 30, 35, 40, 45], 
     [50, 52, 54, 56, 58, 60, 77, 98, 101], 
     [30, 40, 50, 60]] 

    days_left = [5, 12, 30] 

    my_list[2] 
    [30, 40, 50, 60] 

    days_left[2] 
    30 

用于计算看涨期权的Mibian Black-Scholes代码的结构。

mb.BS([stock price, strike price, interest rate, days to maturity], volatility) 

    data1 = dict() 
    for x, sublist in enumerate(my_list): 
     data1[x] = option3 = [] 
     for i in sublist: 
      c = mb.BS([120, i, 1, 20], 10) 
      option3.append(c.callPrice) 

的给出了一个字典的3名名单的基础上,分别从my_list三个嵌套列表的通话价格的输出。

 data1 

     {0: [100.01095590221843, 
       95.013694877773034, 
       90.016433853327641, 
       85.019172828882233, 
       80.021911804436854, 
       75.024650779991447], 
     1: [70.027389755546068, 
      68.028485345767905, 
      66.029580935989742, 
      64.030676526211579, 
      62.03177211643343, 
      60.032867706655267, 
      43.042180223540925, 
      22.05368392087027, 
      19.055327306203068], 
     2: [90.016433853327641, 
      80.021911804436854, 
      70.027389755546068, 
      60.032867706655267]} 

我想要得到的是两个嵌套表和日期进行迭代在一起

我想创建上面一样,用字典,但没有迭代只有my_list,还有days_left。

我尝试了一个zip列表new_list = list(zip(days_left,my_list)),但它给了我一个错误。任何人都可以帮忙吗?非常感谢。

new_list = list(zip(my_list, days_left)) 

    [([20, 25, 30, 35, 40, 45], 5), 
    ([50, 52, 54, 56, 58, 60, 77, 98, 101], 12), 
    ([30, 40, 50, 60], 30)] 

    data5 = dict() 
    for x, days_left, my_list in enumerate(new_list): 
      data5[x] = option5 = [] 
      for days_left, my_list in new_list: 
          c = mb.BS([120, my_list, 1, days_left ], 10) 
          option5.append(c.callPrice) 

对于像my_list [2]这样的单个嵌套列表。输出是:

range_list = list(range(1)) 

data2 = dict() 
for x in range_list: 
data2[x] = option2 = [] 

for i in my_list[2]: 

    c = mb.BS([120, i, 1, 30 ], 10) 

    option2.append(c.callPrice) 

option2 


[90.024647403788975, 
80.032863205051967, 
70.041079006314973, 
60.049294807577965] 

这些值与data1 [2]中的值相似但不相同。理想的输出应该与data1具有相同的结构,包含三个字典,但由于days_left,这些值略有不同。差异可能看起来微不足道,但稍后,我将不得不将它们乘以100,因此这些差异会增加。

+0

输出应该是什么样子? –

+0

嗨奥斯汀,它应该看起来像上面的data1中的字典,值应该看起来相似,但考虑到days_left。因此,例如,'range_list =列表(范围(1)) DATA2 =字典() 对于x在range_list: DATA2 [X] =选项2 = [] 对于i在my_list [2]: Ç = mb.BS([120,i,1,30],10) option2.append(c.callPrice) option2输出值看起来类似于data1 [2],[90。024647403788975, 80.032863205051967, 70.041079006314973, 60.049294807577965]' – MichaelRSF

回答

1

我认为这是做你想做的。请注意,其中大部分是试图模拟你的环境 - 你只关心最后几行。

也就是说,按顺序编号索引的数据结构不应该是字典,它应该是一个列表。 ;-)

Magic_numbers = [ 
    100.01095590221843, 
    95.013694877773034, 
    90.016433853327641, 
    85.019172828882233, 
    80.021911804436854, 
    75.024650779991447, 
    70.027389755546068, 
    68.028485345767905, 
    66.029580935989742, 
    64.030676526211579, 
    62.03177211643343, 
    60.032867706655267, 
    43.042180223540925, 
    22.05368392087027, 
    19.055327306203068, 
    90.016433853327641, 
    80.021911804436854, 
    70.027389755546068, 
    60.032867706655267, 
] 

Magic_index = 0 

def mb(details, volatility): 
    class C: 
     def __init__(self, n): 
      self.callPrice = n 

    global Magic_index 
    result = C(Magic_numbers[Magic_index]) 
    Magic_index += 1 
    return result 

mb.BS = mb 

strike_prices = [ 
    [20, 25, 30, 35, 40, 45], 
    [50, 52, 54, 56, 58, 60, 77, 98, 101], 
    [30, 40, 50, 60] 
] 

days_left = [5, 12, 30] 

data99 = {} # This is silly. A dict indexed by sequential numbers should be a list. 

for i, (days, prices) in enumerate(zip(days_left, strike_prices)): 
    data99[i] = [mb.BS([120, price, 1, days], 10).callPrice for price in prices] 

import pprint 
pprint.pprint(data99) 

输出看起来是这样的:

{0: [100.01095590221843, 
    95.01369487777303, 
    90.01643385332764, 
    85.01917282888223, 
    80.02191180443685, 
    75.02465077999145], 
1: [70.02738975554607, 
    68.0284853457679, 
    66.02958093598974, 
    64.03067652621158, 
    62.03177211643343, 
    60.03286770665527, 
    43.042180223540925, 
    22.05368392087027, 
    19.05532730620307], 
2: [90.01643385332764, 
    80.02191180443685, 
    70.02738975554607, 
    60.03286770665527]} 
+0

感谢酷代码,Austin。不幸的是,它的价值与我原来所做的一样。这么好心,为什么是这样的困惑:这是最后4行应该有相同的值的'的'option2' [90.024647403788975, 80.032863205051967, 70.041079006314973, 60.049294807577965]' – MichaelRSF

+0

我写的代码只是使用数字我复制并粘贴你。你是否在使用“真正的”mb.BS功能或我提供的虚假功能? –

+0

嘿,奥斯汀,我重新检查了你的代码,并没有使用你创建的函数。我刚刚使用了以data99开头的代码行,它工作正常!真的很棒! :)感谢您的帮助奥斯汀! – MichaelRSF

0

我想答案可能是简单的:

for x, (days_left, my_list) in enumerate(new_list): 
    data5[x] = option5 = [] 
    for days_left, my_list in new_list: 
      c = mb.BS([120, my_list, 1, days_left ], 10) 
        option5.append(c.callPrice) 

由于enumerate输出将在形式(i, x),在这种情况下,x是一个元组(即(i, (x, y)))。

+0

嗨ocasbranson,感谢您的意见,这很有道理,但它似乎并不奏效。继续获取'TypeError:float()参数必须是字符串或数字,而不是'list''在这工作了近3天,所以可能只是扔在毛巾上,继续前进。请欣赏帮助。 – MichaelRSF

+0

这个问题的声音是在'cm.BS'的输入之一吗?但不可能从这些信息中知道。试着选择你的循环并在运行之前先打印参数,然后你可以找出它失败的地方,以及它传递给函数的参数。 – oscarbranson