Swing Option: Linear vs. Dynamic Programming II

In order to get an improved impression on the differences between Monte-Carlo/linear programming and  finite difference methods/dynamic programming  a more realistic swing option with hourly payoff profile is evaluated based on a German hourly forward curve. The forward curve is taken from the Kyos example download page. The parameterization of the Kluge model is outlined in [1].

With maturity of twelve weeks the example swing option provides 12*7*24=2016 exercise opportunities. The number of overall exercised swing opportunities is constraint by

100 \le \sum_{i=1}^{2016} \beta_i \le 500.

The size of two dimensions of the finite difference method (dynamic programming) is therefore already been given. 2016 steps are needed in time direction and 500 steps are needed in the “consumed exercises” direction. Together with the two other directions – one for the power price and one dimension for the jump process – and without further simplidsfications this forms a pretty large finite difference problem. The Monte-Carlo based linear programming approach reduces the computational burden but will lead to an upper bound of the swing option price. The diagram below shows the corresponding results.

The code is available here. It depends on the GNU Linear Programming Kit, the Boost Thread library for parallelization and at the time of writing on the latest QuantLib version from the SVN trunk. If you want to generate the plot directly out of the C++ program you also need R, RCPP and RInside. To utilize all CPU cores please use the -DNTHREADS=(number of CPU cores)  compiler switch. In addition to run the program you have to download the forward curve German power from the Kyos web page and convert it into a text file EEX_2010-2013.txt of the folliwing format

4-Oct-2010 36.73 32.09 27.32 23.22 25.71 35.60 47.32 …

5-Oct-2010 38.12 31.12 22.76 25.65 27.87 34.60 50.01 …

[1] T. Kluge, Pricing Swing Options and other Electricity Derivatives


4 thoughts on “Swing Option: Linear vs. Dynamic Programming II

  1. How long does this code run? I finally make the code running but I cannot tell if the code is making any progress facing the black cmd window …

    • Depends on how many threads you are using. But you need a powerful machine and even then it can take hours because the number of Monte-Carlo scenarios and the grid for FDM are chosen to be pretty large to get very accurate results. If you want to increase the speed it up please change nrTrails in line 147 to 250 and line 229ff towards
      boost::shared_ptr swingEngine(
      new FdSimpleExtOUJumpSwingEngine(jumpProcess, rTS, 1, 25, 10, shape_));

  2. Thanks and I got the following results. Can you help confirm the option value for strike of 70 and 80?
    For strike of 70: -91.903115 1030.508428 43.331651
    For strike of 80: -1091.903115 -273.818882 34.896562

  3. No, unfortunately not, I’m getting
    Strike 70: 2085.482875 5341.918128 505.220760
    Strike 80: 676.994699 3024.298155 420.527542
    I guess we are using different market data. My power prices are starting with
    28-Sep-2010 43.58 37.99 33.41 29.20 31.99 39.87 48.83 57.79 61.48 63.68 65.88 71.82 66.85 63.83 61.15 57.75 54.89 54.85 56.53 58.21 59.40 58.70 56.67 48.92
    29-Sep-2010 31.99 27.89 24.53 21.43 23.49 29.27 38.26 46.21 56.98 60.35 64.15 69.93 65.09 62.16 59.55 56.24 53.44 53.41 54.38 54.13 45.90 43.09 41.60 35.91

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s