首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas DataFrame.apply()和mibian

Pandas DataFrame.apply()和mibian
EN

Stack Overflow用户
提问于 2013-01-07 00:25:19
回答 1查看 1.1K关注 0票数 0

我正在尝试使用包含不同期权数据的pandas数据框架来计算隐含波动率。对于隐含波动率,我使用mibian。代码如下:

代码语言:javascript
复制
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,但随后似乎给出了这个错误:

代码语言:javascript
复制
---------------------------------------------------------------------------
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.

我一定遗漏了一些简单的东西。我尝试在将每个值传递给mibian时将它们包装在float()中,但仍然得到相同的问题。如果您能给我指导,我将不胜感激。

此外,如果你知道使用数据框计算隐含波动率的更有效的方法,我洗耳恭听。

EN

回答 1

Stack Overflow用户

发布于 2013-01-07 01:50:49

正如海登评论的那样,我确实单独尝试了这个函数,但样本量不够大。

显然,对于这些变量的某些值,它将近似为零。我更改了我的calcvol函数,尝试使用mibian来获取波动性,如果捕获到ZeroDivisionError,则将impvol设置为NaN。这会帮我找出是谁引起了这么大的骚动。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14184115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档