期权头寸计算

来源:https://uqer.io/community/share/54c846cdf9f06c276f651a50

版本:1.0

作者:李丞

联系:cheng.li@datayes.com

在本篇中,我们假设客户已经拥有了自己的期权头寸,希望利用量化实验室的功能进行风险监控。

数据准备

用户的期权头寸数据保存在期权头寸.csv文件中(请点击链接下载),样例如下:

  1. optionData = pd.read_csv(u'期权头寸.csv', encoding='gbk', parse_dates = [3], dtype = {u'代码':str})
  2. pd.options.display.float_format = '{:,.2f}'.format
  3. print(optionData)
  4. 代码 方向 行权价 到期时间 头寸
  5. 0 000001 C 2.20 2015-02-19 1000
  6. 1 000002 C 2.10 2015-02-19 -500
  7. 2 000003 P 1.90 2015-03-19 1000
  8. 3 000004 P 1.80 2015-03-19 -500

计算方法

这里我们简单展示如何用内置函数,方便的计算基于Black-Scholes模型的价格以及风险值:

  1. def processOptionBook(optionData):
  2. # 由于我们现在还无法获取市场数据,制作一些假的市场数据数据
  3. # 例如波动率水平,利率水平
  4. vol = 0.3 * np.random.random(len(optionData)) + 0.2
  5. spot = 2.0
  6. riskFree = 0.04
  7. dividend = 0.0
  8. evaluationDate = Date.todaysDate()
  9. # 根据用户的输入计算期权的价格以及各种greeks
  10. t2m = (optionData[u'到期时间'].apply(lambda x:Date(x.year,x.month,x.day)) - evaluationDate)/ 365.0
  11. optionType = optionData[u'方向'].apply(lambda x: x=='C' and 1 or -1)
  12. strike = optionData[u'行权价']
  13. calculateResult = BSMPrice(optionType,strike,spot,riskFree,dividend, vol,t2m)
  14. # 整理数据
  15. calculateResult = calculateResult.multiply(optionData[u'头寸'].values, axis = 0)
  16. calculateResult.index = optionData[u'代码']
  17. portfolio = pd.DataFrame(dict(np.sum(calculateResult)), index = ['portfolio'])
  18. calculateResult = calculateResult.append(portfolio)
  19. calculateResult.index.name = u'代码'
  20. calculateResult = calculateResult.reindex_axis(['price', 'delta', 'gamma', 'rho', 'theta', 'vega'], axis = 1)
  21. return calculateResult
  1. res= processOptionBook(optionData)
  2. print(res)
  3. price delta gamma rho theta vega
  4. 代码
  5. 000001 27.36 222.15 1,317.92 26.27 -550.43 149.48
  6. 000002 -5.13 -94.07 -1,326.48 -11.53 116.11 -67.71
  7. 000003 24.81 -238.18 1,822.42 -70.03 -168.14 231.44
  8. 000004 -8.43 71.48 -514.95 21.15 82.48 -84.38
  9. portfolio 38.62 -38.62 1,298.91 -34.13 -519.98 228.84