我試圖使用一個包含不同部分選項數據的熊貓數據框來計算隱含波動率。對於我使用的隱含波動率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,並且仍然遇到同樣的問題。我非常感謝任何指導。另外,如果您知道使用數據框來計算隱含波動率的更有效方法,那麼我就是所有人。
你測試了'calcvol'函數嗎?在申請之前先做好這個練習是很好的做法。 (我不認爲這是一個簡單的遺忘軸參數:'optionsData.apply(calcvol,axis = 1)'? –