Application Center - Maplesoft

App Preview:

Perpetual Options

You can switch back to the summary page by clicking here.

Learn about Maple
Download Application


 

Image 

 

Perpetual Options 

 

Igor Hlivka 

MUFG Securities International, LONDON 

 

Standard financial options are always expressed in terms of pre-determined maturity. Option's contract life can be as short as few days and can run up to several years. On the other hand, perpetual options, as the name suggests, have no fixed maturity and no exercise limits. This makes perpetual options an interesting class of non-standard financial contracts that is worth examining from both theoretical and practical perspectives. 

 

By construction, perpetual options have to be American [European = exercise only at the option's maturity; American = exercise allowed any time during the life of the contract]. 

 

Recall that the value of a standard financial option U(S, t) i.e. a solution to a PDE:
                                                   
 

However, in perpetual option case, the time factor disappears (so does the time-derivative), so PDE becomes an ordinary differential equation 

 

> restart; -1; `:=`(ode, `+`(`*`(`+`(r, `-`(q)), `*`(S, `*`(diff(u(S), S)))), `*`(`/`(1, 2), `*`(`^`(sigma, 2), `*`(`^`(S, 2), `*`(diff(u(S), S, S))))), `-`(`*`(r, `*`(u(S))))) = 0); 1
 

`+`(`*`(`+`(r, `-`(q)), `*`(S, `*`(diff(u(S), S)))), `*`(`/`(1, 2), `*`(`^`(sigma, 2), `*`(`^`(S, 2), `*`(diff(diff(u(S), S), S))))), `-`(`*`(r, `*`(u(S))))) = 0 (1)
 

where S denotes the stock price, risk-free interest rate, q = dividend yield and stock's volatility. 

We will ask Maple to solve this ODE in the generic mode: 

 

> `:=`(soln, dsolve(ode)); 1
 

u(S) = `+`(`*`(_C1, `*`(`^`(S, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(sigma, 2)), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*...
u(S) = `+`(`*`(_C1, `*`(`^`(S, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(sigma, 2)), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*...
(2)
 

Maple returns the general solution with two constants that need to be determined.  

Let's take the coefficients of each parameter: 

> `:=`(r1, coeff(rhs(soln), _C1)); 1; `:=`(r2, coeff(rhs(soln), _C2)); 1
 

 

`^`(S, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(sigma, 2)), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(sigma, 2)))), `*`(...
`^`(S, `+`(`-`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `-`(`*`(`^`(sigma, 2))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(sigma, 2)... (3)
 

We use these coefficients together with boundary conditions to determine the value of (i) Perpetual Call and (ii) Perpetual Put 

  • Call boundary condition:    `implies`(u(S), infinity)when `implies`(S, infinity)
 

  • Put boundary condition:     u(S) implies 0when `implies`(S, infinity)
 

> plot(eval(r1, [r = 0.5e-1, q = 0.3e-1, sigma = .2]), S = 1 .. 10, title = [
 

Plot_2d
 

As graph suggests, the `*`(_C1, `*`(`^`(S, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(sigma, 2)), sqrt(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(sigma, 2... part of the returned solution is associated with the Perpetual Call Option  

> plot(eval(r2, [r = 0.5e-1, q = 0.3e-1, sigma = .2]), S = 1 .. 10, title = [
 

Plot_2d
 

On the other hand, `*`(_C2, `*`(`^`(S, `+`(`-`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `-`(`*`(`^`(sigma, 2))), sqrt(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`... is clearly associated with the Perpetual Put Option 

 

We may also see that the exponent of S is identical in both call and put, just put has an opposite sign. This allows us simplifying the formula for further manipulation. 

Perpetual Call 

 

> `:=`(C, proc (S) options operator, arrow; `*`(Y, `*`(`^`(S, w))) end proc); 1
 

proc (S) options operator, arrow; `*`(Y, `*`(`^`(S, w))) end proc (1.1)
 

This is the generic Perpetual Call Option formula with w as a generic exponent in the Call Option formula above. Since the call is American, we can exercise it any time. We can reasonably assume that the holder of this option will exercise it when the stock price in the future S[t] will rise above level S with Our task is to determine the value of S[t]

We know that when S[t] = Sand the holder exercises the option, the option's value will become   C(S[t]) = `+`(S[t], `-`(K))where K is the strike price in the standard option notation. From this equation we can determine the value of coefficient Y
 

> `:=`(YSol, solve(C(S[t]) = `+`(S[t], `-`(K)), Y)); 1
 

`+`(`-`(`/`(`*`(`+`(`-`(S[t]), K)), `*`(`^`(S[t], w))))) (1.2)
 

We can use this result to determine the value of C(S) 

> `:=`(CSol, simplify(subs(Y = YSol, C(S)))); 1
 

`+`(`-`(`*`(`+`(`-`(S[t]), K), `*`(`^`(S[t], `+`(`-`(w))), `*`(`^`(S, w)))))) (1.3)
 

Our objective is to select the value S[t]such that the option value is maximized before its exercise.  

  • Take the derivative diff(C(S), S[t])
 

  • Set it to zero and solve for S[t]
 

> `:=`(StSol, S[t] = solve(diff(CSol, S[t]) = 0, S[t])); 1
 

S[t] = `/`(`*`(w, `*`(K)), `*`(`+`(`-`(1), w))) (1.4)
 

This is the desired value of S[t]. The reader can see that the exercise value S[t] is stock price-independent and is the function of option's strike K and the exponent. 

> `:=`(wval, simplify(`/`(`*`(log(r1)), `*`(log(S))), symbolic)); -1; `:=`(St, simplify(subs(w = wval, rhs(StSol)))); 1; plot(eval(St, [r = 0.5e-1, q = 0.3e-1, sigma = .2]), K = 1 .. 10, title = [
`:=`(wval, simplify(`/`(`*`(log(r1)), `*`(log(S))), symbolic)); -1; `:=`(St, simplify(subs(w = wval, rhs(StSol)))); 1; plot(eval(St, [r = 0.5e-1, q = 0.3e-1, sigma = .2]), K = 1 .. 10, title = [
`:=`(wval, simplify(`/`(`*`(log(r1)), `*`(log(S))), symbolic)); -1; `:=`(St, simplify(subs(w = wval, rhs(StSol)))); 1; plot(eval(St, [r = 0.5e-1, q = 0.3e-1, sigma = .2]), K = 1 .. 10, title = [
`:=`(wval, simplify(`/`(`*`(log(r1)), `*`(log(S))), symbolic)); -1; `:=`(St, simplify(subs(w = wval, rhs(StSol)))); 1; plot(eval(St, [r = 0.5e-1, q = 0.3e-1, sigma = .2]), K = 1 .. 10, title = [
 

 

`/`(`*`(`+`(`-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(sigma, 2)), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(sigma, 2)))), `*`(4, `*`(`^`(q, 2))), `*`(4,...
Plot_2d
 

Once  S[t]  has been determined, we can substitute it into YSol 

> `:=`(YRes, simplify(subs(S[t] = rhs(StSol), YSol))); 1
 

`/`(`*`(K, `*`(`^`(`/`(`*`(w, `*`(K)), `*`(`+`(`-`(1), w))), `+`(`-`(w))))), `*`(`+`(`-`(1), w))) (1.5)
 

This is the value of coefficient Y from the generic Perpetual Call Option formula. With this substitution, the call option will now become: 

> simplify(subs(Y = YRes, C(S)), symbolic); 1
 

`*`(`^`(K, `+`(1, `-`(w))), `*`(`^`(`+`(`-`(1), w), `+`(`-`(1), w)), `*`(`^`(w, `+`(`-`(w))), `*`(`^`(S, w))))) (1.6)
 

This is the optimal value of S[t]  that maximizes the value of the Perpetual Call Option for all `>=`(S[t], S).  With substitutions, the final formula then becomes: 

> `:=`(CPerp, simplify(`*`(subs(w = wval, YRes), `*`(r1)), symbolic)); 1
 

`+`(`*`(2, `*`(`^`(K, `+`(`-`(`/`(`*`(`/`(1, 2), `*`(`+`(`-`(`*`(`^`(sigma, 2))), `-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*...
`+`(`*`(2, `*`(`^`(K, `+`(`-`(`/`(`*`(`/`(1, 2), `*`(`+`(`-`(`*`(`^`(sigma, 2))), `-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*...
`+`(`*`(2, `*`(`^`(K, `+`(`-`(`/`(`*`(`/`(1, 2), `*`(`+`(`-`(`*`(`^`(sigma, 2))), `-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*...
`+`(`*`(2, `*`(`^`(K, `+`(`-`(`/`(`*`(`/`(1, 2), `*`(`+`(`-`(`*`(`^`(sigma, 2))), `-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*...
`+`(`*`(2, `*`(`^`(K, `+`(`-`(`/`(`*`(`/`(1, 2), `*`(`+`(`-`(`*`(`^`(sigma, 2))), `-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*...
`+`(`*`(2, `*`(`^`(K, `+`(`-`(`/`(`*`(`/`(1, 2), `*`(`+`(`-`(`*`(`^`(sigma, 2))), `-`(`*`(2, `*`(r))), `*`(2, `*`(q)), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*...
(1.7)
 

> plot3d(eval(CPerp, [r = 0.5e-1, q = 0.3e-1, sigma = .2]), S = 1 .. 10, K = 10 .. 1, title = [
plot3d(eval(CPerp, [r = 0.5e-1, q = 0.3e-1, sigma = .2]), S = 1 .. 10, K = 10 .. 1, title = [
 

Plot
 

How about the exercise strategy in practice? Is is worth exercising Perpetual Call Option? 

  • When option is exercised, the holder will receive `+`(S, `-`(K))
 

  • The value of the option will always be equal to CPerp
 

  • We can compare two strategies in dynamic setting - by varying S and K
 

> `:=`(CPay, `+`(S, `-`(K))); -1; plot3d({CPay, eval(CPerp, [r = 0.5e-1, q = 0.3e-1, sigma = .2])}, S = 1 .. 10, K = 1 .. 10, title = [
`:=`(CPay, `+`(S, `-`(K))); -1; plot3d({CPay, eval(CPerp, [r = 0.5e-1, q = 0.3e-1, sigma = .2])}, S = 1 .. 10, K = 1 .. 10, title = [
`:=`(CPay, `+`(S, `-`(K))); -1; plot3d({CPay, eval(CPerp, [r = 0.5e-1, q = 0.3e-1, sigma = .2])}, S = 1 .. 10, K = 1 .. 10, title = [
 

Plot
 

As option's payoff is linear, one can easily see that the value of the option will always be worth at the least the same as the immediate exercise:  
`>=`(CPerp, `+`(S, `-`(K)))
 

This simply confirms that it is never optimal to exercise the Perpetual Call Option 

Perpetual Put 

 

> `:=`(P, proc (S) options operator, arrow; `*`(Z, `*`(`^`(S, w))) end proc); 1
 

proc (S) options operator, arrow; `*`(Z, `*`(`^`(S, w))) end proc (2.1)
 

This is the generic Perpetual Put Option formula. Again, we want to find the value S[t] that will trigger an exercise when the stock price falls below that level: `<=`(S[t], S) 

> `:=`(ZSol, solve(P(S[t]) = `+`(K, `-`(S[t])), Z)); 1
 

`/`(`*`(`+`(`-`(S[t]), K)), `*`(`^`(S[t], w))) (2.2)
 

> `:=`(PSol, simplify(subs(Z = ZSol, P(S)))); 1
 

`*`(`+`(`-`(S[t]), K), `*`(`^`(S[t], `+`(`-`(w))), `*`(`^`(S, w)))) (2.3)
 

The level of S[t] has to be determined s.t. the option value is maximized prior to exercise. 

> `:=`(StSol2, S[t] = solve(diff(PSol, S[t]) = 0, S[t])); 1
 

S[t] = `/`(`*`(w, `*`(K)), `*`(`+`(`-`(1), w))) (2.4)
 

> `:=`(ZRes, simplify(subs(S[t] = rhs(StSol2), ZSol))); 1
 

`+`(`-`(`/`(`*`(K, `*`(`^`(`/`(`*`(w, `*`(K)), `*`(`+`(`-`(1), w))), `+`(`-`(w))))), `*`(`+`(`-`(1), w))))) (2.5)
 

Similar to the Call Option case, this is the the value of S[t] that maximizes the value of Perpetual Put Option for `>=`(S, S[t]) 

> `:=`(PPerp, simplify(`*`(subs(w = simplify(`/`(`*`(log(r2)), `*`(log(S))), symbolic), ZRes), `*`(r2)), symbolic)); 1
 

`+`(`*`(2, `*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(sig...
`+`(`*`(2, `*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(sig...
`+`(`*`(2, `*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(sig...
`+`(`*`(2, `*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(sig...
`+`(`*`(2, `*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(sig...
`+`(`*`(2, `*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(sig...
(2.6)
 

> plot3d(eval(PPerp, [r = 0.5e-1, q = 0.3e-1, sigma = .2]), S = 1 .. 10, K = 10 .. 1, title = [
plot3d(eval(PPerp, [r = 0.5e-1, q = 0.3e-1, sigma = .2]), S = 1 .. 10, K = 10 .. 1, title = [
 

Plot
 

This is the Perpetual Put Option value as function of Sand K. As expected, the put value is the highest when strike is high and stock price is low. 

 

Closed-from solution allows sensitivities to be computed analytically. Let Maple calculate the Perpetual Put Delta: 

> `:=`(PPdelta, diff(PPerp, S)); 1; plot(eval(PPdelta, [K = 7, r = 0.5e-1, q = 0.3e-1, sigma = .2]), S = 1 .. 10, title = [
`:=`(PPdelta, diff(PPerp, S)); 1; plot(eval(PPdelta, [K = 7, r = 0.5e-1, q = 0.3e-1, sigma = .2]), S = 1 .. 10, title = [
`:=`(PPdelta, diff(PPerp, S)); 1; plot(eval(PPdelta, [K = 7, r = 0.5e-1, q = 0.3e-1, sigma = .2]), S = 1 .. 10, title = [
 

 

`+`(`-`(`/`(`*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(si...
`+`(`-`(`/`(`*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(si...
`+`(`-`(`/`(`*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(si...
`+`(`-`(`/`(`*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(si...
`+`(`-`(`/`(`*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(si...
`+`(`-`(`/`(`*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(si...
`+`(`-`(`/`(`*`(`^`(K, `+`(`/`(`*`(`/`(1, 2), `*`(`+`(`*`(`^`(sigma, 2)), `*`(2, `*`(r)), `-`(`*`(2, `*`(q))), `*`(`^`(`+`(`*`(4, `*`(`^`(r, 2))), `-`(`*`(8, `*`(r, `*`(q)))), `*`(4, `*`(r, `*`(`^`(si...
Plot_2d
 

We can also compare the option value and the option payoff when S = S[t] 

  • Take the difference between the two
 

  • Differentiate it w.r.t S[t]
 

  • Substitute it back into S[t] definition
 

> `:=`(ValDiff, `+`(PSol, `+`(`-`(K), S))); 1; `:=`(DDiff, simplify(diff(ValDiff, S[t]))); 1; simplify(subs(S[t] = rhs(StSol2), DDiff)); 1
 

 

 

`+`(`*`(`+`(`-`(S[t]), K), `*`(`^`(S[t], `+`(`-`(w))), `*`(`^`(S, w)))), S, `-`(K))
`+`(`-`(`*`(`^`(S, w), `*`(`+`(`^`(S[t], `+`(`-`(w))), `-`(`*`(`^`(S[t], `+`(`-`(w))), `*`(w))), `*`(`^`(S[t], `+`(`-`(w), `-`(1))), `*`(w, `*`(K))))))))
0 (2.7)
 

What is the point of this? 

  • When S[t] = S, the option's delta and option's payoff delta are identical. This implies that the Perpetual Put Option value is maximized by the exercise strategy where delta at S[t] exists and is continuous.
 

> `:=`(wval2, simplify(`/`(`*`(log(r2)), `*`(log(S))), symbolic)); -1; `:=`(DDiff2, simplify(subs({w = wval2, S[t] = S}, DDiff))); -1; `:=`(p1, plot(eval(DDiff2, [r = 0.5e-1, q = 0.3e-1, sigma = .2, K =...
`:=`(wval2, simplify(`/`(`*`(log(r2)), `*`(log(S))), symbolic)); -1; `:=`(DDiff2, simplify(subs({w = wval2, S[t] = S}, DDiff))); -1; `:=`(p1, plot(eval(DDiff2, [r = 0.5e-1, q = 0.3e-1, sigma = .2, K =...
`:=`(wval2, simplify(`/`(`*`(log(r2)), `*`(log(S))), symbolic)); -1; `:=`(DDiff2, simplify(subs({w = wval2, S[t] = S}, DDiff))); -1; `:=`(p1, plot(eval(DDiff2, [r = 0.5e-1, q = 0.3e-1, sigma = .2, K =...
`:=`(wval2, simplify(`/`(`*`(log(r2)), `*`(log(S))), symbolic)); -1; `:=`(DDiff2, simplify(subs({w = wval2, S[t] = S}, DDiff))); -1; `:=`(p1, plot(eval(DDiff2, [r = 0.5e-1, q = 0.3e-1, sigma = .2, K =...
`:=`(wval2, simplify(`/`(`*`(log(r2)), `*`(log(S))), symbolic)); -1; `:=`(DDiff2, simplify(subs({w = wval2, S[t] = S}, DDiff))); -1; `:=`(p1, plot(eval(DDiff2, [r = 0.5e-1, q = 0.3e-1, sigma = .2, K =...
`:=`(wval2, simplify(`/`(`*`(log(r2)), `*`(log(S))), symbolic)); -1; `:=`(DDiff2, simplify(subs({w = wval2, S[t] = S}, DDiff))); -1; `:=`(p1, plot(eval(DDiff2, [r = 0.5e-1, q = 0.3e-1, sigma = .2, K =...
`:=`(wval2, simplify(`/`(`*`(log(r2)), `*`(log(S))), symbolic)); -1; `:=`(DDiff2, simplify(subs({w = wval2, S[t] = S}, DDiff))); -1; `:=`(p1, plot(eval(DDiff2, [r = 0.5e-1, q = 0.3e-1, sigma = .2, K =...
 

Plot_2d
 

As we can see, the delta is continuous at various strike levels, so the conditions for optimal strategy are satisfied. 

Conclusion 

Perpetual options are unusual in terms of specification as the key attribute - maturity is absent. Being American, perpetual options present additional complexity in terms of determining the optimal execution strategy. As researchers and market practitioners alike tend to point out, the American options create an undetermined boundary problem that is unknown and needs to be solved as a part of finding general / particular solution. 

 

The demonstration application shows that Maple is perfectly suited for this task and can return the desired solution quickly and efficiently. 

 

Legal Notice: The copyright for this application is owned by the authors. Neither Maplesoft nor the authors are responsible for any errors contained within and are not liable for any damages resulting from the use of this material.  This application is intended for non-commercial, non-profit use only. Contact the authors for permission if you wish to use this application in for-profit activities.