Greeks: option sensitivies, formula proofs and Python scripts – Part 2

Option greeks: formula proofs and python implementation – Part 2

This documents is the second part of a general overview of vanilla options partial sensitivities (option greeks). In a first article we had covered 1st generation greeks, their formula, mathematical proof, and suggested an implementation in Python.

In this post we add some second order greeks such as Vanna and Charm.


Vanna is the option’s Delta sensitivity to small changes in the underlying volatility. This measure is actually tantamount to sensitivity of the option’s Vega to small changes in the underlying asset price.


Let’s remind the Black-Scholes-Merton formula for Vega:

(1)   \begin{equation*} \nu_{c} = \nu_{p} = e^{-qT} N(d_{1}) \end{equation*}

The call/put option Vanna will be:

(2)   \begin{equation*} \frac{\partial^2 c}{\partial S \partial \sigma} = \frac{\partial^2 p}{\partial S \partial \sigma} = N'(d_{1}) \frac{-e^{-qT} d_{2}}{\sigma} \end{equation*}



(3)   \begin{equation*} \begin{split} \begin{aligned} \frac{\partial^2 c}{\partial S \partial \sigma} = \frac{\partial\Delta}{\partial\sigma} = {} & \frac{\partial\nu}{\partial S} \\ & {=} \frac{\partial (e^{-qT} N(d_{1}))}{\partial \sigma} \\ & {=} e^{-qT} \frac{\partial N(d_{1})}{\partial d_{1}} \frac{\partial d_{1}}{\partial \sigma} \\ & {=} e^{-qT} N'(d_{1}) \frac{\partial d_{1}}{\partial \sigma} \\ & {=} e^{-qT} N'(d_{1}) \frac{\partial \frac{\ln \frac{S}{X} + (r-q + \frac{\sigma^2}{2})T}{\sigma \sqrt T}}{\partial \sigma} \\ & {=} e^{-qT} N'(d_{1}) \frac {\sigma \sqrt T - d_{1}}{\sigma} \\ & {=} N'(d_{1}) \frac{-e^{-qT} d_{2}}{\sigma} \end{aligned} \end{split} \end{equation*}


Below you have the python script for Vanna calculation for a 1% change in the unerlying asset volatility.

Here is the piece of code that you can use to calculate and chart the Vanna surface displayed above (the python file that contains the Delta calculation above is called “”). This sample was already available in the first part of this overview of BS greeks.



When we run our script, this is the Vanna shape that we obtain:

Options Greeks Python Vanna

Options Greeks Python Vanna

This is the shape of the Charm sensitivity (Delta variation for a 1-day change in the time to expiry):

Options Greeks Python Charm

Options Greeks Python Charm


← Previous post

Next post →


  1. Karan Pillai

    Thanks for the proof and codes, super helpful! I was wondering if you’d ever consider doing the same for Vomma and DvegaDtime?

  2. Hi – nice website! Just trying to follow some of your derivations and interested to know what you mean by the N'() operator (i.e. what does the hash mark ‘ mean) and how does this differ from the regular pmf of a standard normal distribution, that appears as just N() in your notation (no dash).

    • Team Smile of Thales

      Hi Tim!
      Thanks for your comment.
      N() stands for the cumulative distribution function (CDF) of the standard normal distribution N(0,1).

      (1)   \begin{equation*} N(x)= \frac {1}{\sqrt{2\pi}} \int_{-\propto}^x \! {e ^{\frac{-t^2}{2}}} \, \mathrm{d}t \end{equation*}

      N'() is the probability density function of the standard normal distribution N(0,1).

      (2)   \begin{equation*} N'(x)= \frac {e ^{\frac{-1}{2}x^2}}{\sqrt{2\pi}} \end{equation*}

      Hope this clarifies
      Best Regards
      Team Smile of Thales

      • Thanks, that’s great. (I worked through the derivations by hand, taking the derivatives myself and eventually realised that’s what they must have been). Good luck with the site.

Leave a Reply

Your email address will not be published. Required fields are marked *