2013-01-06 46 views
0

我試圖使用一個包含不同部分選項數據的熊貓數據框來計算隱含波動率。對於我使用的隱含波動率mibian。下面的代碼:大熊貓DataFrame.apply()和mibian

optionsData.to_dict(): 

    {'callclose': {0: Decimal('4'), 
     1: Decimal('2.62'), 
     2: Decimal('2.64'), 
     3: Decimal('1.7'), 
     4: Decimal('1.35')}, 
    'daystoexpiration': {0: 43L, 1: 43L, 2: 43L, 3: 43L, 4: 43L}, 
    'expiration': {0: datetime.date(2013, 2, 16), 
     1: datetime.date(2013, 2, 16), 
     2: datetime.date(2013, 2, 16), 
     3: datetime.date(2013, 2, 16), 
     4: datetime.date(2013, 2, 16)}, 
    'impvol': {0: nan, 1: nan, 2: nan, 3: nan, 4: nan}, 
    'putclose': {0: Decimal('0.54'), 
     1: Decimal('0.65'), 
     2: Decimal('0.76'), 
     3: Decimal('1.08'), 
     4: Decimal('1.56')}, 
    'strike': {0: Decimal('39'), 
     1: Decimal('40'), 
     2: Decimal('41'), 
     3: Decimal('42'), 
     4: Decimal('43')}, 
    'symbol': {0: 'A', 1: 'A', 2: 'A', 3: 'A', 4: 'A'}, 
    'underlyingclose': {0: Decimal('42.86'), 
     1: Decimal('42.86'), 
     2: Decimal('42.86'), 
     3: Decimal('42.86'), 
     4: Decimal('42.86')}} 

optionsData = optionsData.T 

def calcvol(info): 
    print info.name 
    print 'Starting procedure.' 
    tempmb = mb.BS([info['underlyingclose'], 
      info['strike'], 
      .25, 
      info['daystoexpiration']], 
      callPrice=float(info['callclose']), 
      putPrice=info['putclose']) 
    print 'mb created' 
    impvol = tempmb.impliedVolatility 
    print 'implied vol calculated' 
    info['impvol'] = impvol 
    print 'impvol set' 
    del impvol, tempmb 
    print 'vars deleted' 
    return info 

a = optionsData.apply(calcvol) 

當我經歷了所有的運行,它設置在optionsData的第一個元素的impvol,但似乎後來給我這個錯誤:

--------------------------------------------------------------------------- 
ZeroDivisionError       Traceback (most recent call last) 
<ipython-input-9-116f3c010b9c> in <module>() 
----> 1 a = optionsData.apply(calcvol) 

C:\Python27\lib\site-packages\pandas-0.10.0-py2.7-win32.egg\pandas\core\frame.pyc in apply(self, func, axis, broadcast, raw, args, **kwds) 
    4079      return self._apply_raw(f, axis) 
    4080     else: 
-> 4081      return self._apply_standard(f, axis) 
    4082    else: 
    4083     return self._apply_broadcast(f, axis) 

C:\Python27\lib\site-packages\pandas-0.10.0-py2.7-win32.egg\pandas\core\frame.pyc in _apply_standard(self, func, axis, ignore_failures) 
    4154      # no k defined yet 
    4155      pass 
-> 4156     raise e 
    4157 
    4158   if len(results) > 0 and _is_sequence(results[0]): 

ZeroDivisionError: ('float division by zero', u'occurred at index 1') 

0 
Starting procedure. 
mb created 
implied vol calculated 
impvol set 
vars deleted 
0 
Starting procedure. 
mb created 
implied vol calculated 
impvol set 
vars deleted 
1 
Starting procedure. 

我有缺少一些簡單的東西。我已經嘗試在float()中包含每個值,因爲我將它們傳遞給了mibian,並且仍然遇到同樣的問題。我非常感謝任何指導。另外,如果您知道使用數據框來計算隱含波動率的更有效方法,那麼我就是所有人。

+0

你測試了'calcvol'函數嗎?在申請之前先做好這個練習是很好的做法。 (我不認爲這是一個簡單的遺忘軸參數:'optionsData.apply(calcvol,axis = 1)'? –

回答

1

正如hayden所評論的那樣,我確實嘗試了單獨的函數,但沒有足夠大的樣本量。

顯然對於這些變量的某些值,它將接近於零。我改變了我的calcvol函數,嘗試使用mibian獲取波動率,如果發現ZeroDivisionError,則將impvol設置爲NaN。這將幫助我找出哪些是造成這樣一個騷動。

+0

捕獲錯誤是調試+1的有趣方法,我不會想到這一點! –