2017-04-11 6 views
0

Ich benutze Mibian-Modul, um Anrufoptionen zu berechnen. Ich habe eine Liste von drei verschachtelten Listen. Jede geschachtelte Liste repräsentiert die Ausübungspreise. Jede verschachtelte Liste hat ihre eigenen jeweiligen Tage bis zum Ablauf, d. H. My_list [2] hat noch 30 Tage.Wie verschachtelte Listen mit einer anderen Liste iterieren, um ein Wörterbuch mit Listen zu erstellen 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 

Die Struktur eines Code Mibian Black-Scholes der Call-Option für die Berechnung.

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) 

Das gibt einen Ausgang eines Wörterbuchs mit 3 Listen, die Gesprächspreise basieren auf jeder der drei verschachtelten Listen von 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]} 

Was ich versuche die beiden verschachtelten Listen für zu bekommen und die Termine iteriert wird zusammen

Ich mag das gleiche wie oben zu schaffen, mit einem Wörterbuch, aber das iteriert nicht nur my_list, aber auch the days_left in order.

Ich habe versucht, eine Zip-Liste von new_list = Liste (zip (days_left, my_list)), aber es gab mir einen Fehler. Kann mir bitte jemand helfen? Danke vielmals.

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) 

Für eine einzelne verschachtelte Liste wie my_list [2]. Die Ausgabe ist:

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] 

Die Werte sind ähnlich, aber nicht die gleichen wie in data1 [2]. Die ideale Ausgabe sollte die gleiche Struktur wie data1 mit drei Wörterbüchern haben, aber die Werte aufgrund der days_left geringfügig abweichen. Die Unterschiede mögen trivial erscheinen, aber später muss ich sie mit 100 multiplizieren, also bauen sich diese Unterschiede auf.

+0

Wie sollte die Ausgabe aussehen? –

+0

Hallo Austin, sollte es wie das Wörterbuch in data1 oben aussehen, und die Werte sollten ähnlich aussehen, aber mit der days_left berücksichtigt. So zum Beispiel 'range_list = Liste (Bereich (1)) Daten2 = dict() für x in range_list: Daten2 [x] = option2 = [] für i in my_list [2]: c = mb.BS ([120, i, 1, 30], 10) option2.append (c.callPrice) option2' Die Ausgabewerte sehen ähnlich wie data1 [2], '[90.024647403788975, 80.032863205051967, 70.041079006314973, 60.049294807577965] ' – MichaelRSF

Antwort

1

Ich denke, das macht was du willst. Bitte beachten Sie, dass das meiste versucht, Ihre Umgebung zu simulieren - Sie interessieren sich nur für die letzten paar Zeilen.

Eine Datenstruktur, die mit fortlaufenden Nummern indiziert ist, sollte kein Diktat sein, sondern eine Liste. ;-)

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) 

Die Ausgabe sieht wie folgt aus:

{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

Danke für den coolen Code, Austin. Leider gibt es die gleichen Werte wie die, die ich ursprünglich gemacht habe. So Art von verwirrt, warum das der Fall ist: S Die letzten 4 Zeilen sollten exakt die gleichen Werte wie die 'option2' von' haben [90,024647403788975, 80,032863205051967, 70,041079006314973, 60,049294807577965] ' – MichaelRSF

+0

Der Code, den ich schrieb nur verwendet Zahlen das ich kopiert und von dir eingefügt habe. Benutzt du es mit deiner "echten" mb.BS Funktion oder der falschen, die ich zur Verfügung gestellt habe? –

+0

Hey Austin, ich habe Ihren Code erneut überprüft und die von Ihnen erstellte Funktion nicht verwendet. Ich habe nur die Codezeile verwendet, die mit data99 beginnt, und es hat funktioniert! Wirklich gut! :) Danke für die Hilfe Austin! – MichaelRSF

0

ich die Antwort vielleicht denken, wie so einfach sein:

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) 

Da die Ausgabe von enumerate in Form sein (i, x), wobei in diesem Fall x ein Tupel ist (dh (i, (x, y))).

+0

Hey ocasbranson, danke für die Eingabe, macht Sinn, aber es scheint nicht zu funktionieren. Erhalten Sie immer 'TypeError: float() - Argument muss eine Zeichenfolge oder eine Zahl sein, nicht eine 'Liste'. Seit fast 3 Tagen daran gearbeitet, so kann nur das Handtuch werfen und weitermachen. Schätzen Sie die Hilfe jedoch. – MichaelRSF

+0

Klingt wie das Problem in einer der Eingaben zu 'cm.BS' ist? Aber unmöglich, von dieser Information zu erzählen. Versuchen Sie, Ihre Schleife auseinander zu nehmen und sie dazu zu bringen, Parameter zu drucken, bevor sie ausgeführt wird. Dann können Sie herausfinden, wo sie fehlschlägt und welche Parameter sie an die Funktion übergibt. – oscarbranson

Verwandte Themen