This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/CLPQR/clpqr/examples/monash/option
vsc e5f4633c39 This commit was generated by cvs2svn to compensate for changes in r4,
which included commits to RCS files with non-trunk default branches.


git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@5 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
2001-04-09 19:54:03 +00:00

163 lines
3.4 KiB
Plaintext

/*
**********************************************************************
*
* CLP(R) Version 2.0 (Example Programs Release)
* (C) Copyright, March 1986, Monash University
*
**********************************************************************
*/
%
% Algebraic combinations of options: see [Lassez, McAloon & Yap].
%
% Note that buy and sell are the negation of each other
% heaviside function
h(X,Y,Z) :- Y < X , Z = 0.
h(X,Y,Z) :- Y >= X, Z = 1.
% ramp function
r(X,Y,Z) :- Y < X , Z = 0.
r(X,Y,Z) :- Y >= X, Z = Y - X.
% option valuation
% Variables are as previously described
value(Type,Buy_or_Sell,S,C,P,I,X,B,Value) :-
check_param(S,C,P,I,X,B),
get_sign(Buy_or_Sell,Sign),
lookup_option(Type,S,C,P,I,X,B,
B1,B2,H1,H2,R1,R2),
h(B1,S,T1),h(B2,S,T2),r(B1,S,T3),r(B2,S,T4),
Value = Sign*(H1*T1 + H2*T2 + R1*T3 + R2*T4).
% safety check
check_param(S,C,P,I,X,B) :-
S >= 0, C >= 0, P >= 0,
I >= 0, X >= 0, B >= 0 .
% Buy or sell are just opposite
get_sign(buy,-1).
get_sign(sell,1).
% lookup option vector
lookup_option(Type,S,C,P,I,X,B,B1,B2,H1,H2,R1,R2) :-
table(Type,S,C,P,I,X,B,B1,B2,H1,H2,R1,R2).
% Table of values for B1,B2,H1,H2,R1,R2
% generic format - lookup_table(Type,Pos_neg,S,C,P,I,X,B,B1,B2,H1,H2,R1,R2).
% where K to R21 are obtained from the table
% M is a multiplier which is -1 or 1 depending on whether one
% is buying or selling the option
table( stock, S, C, P, I, X, B, 0, 0, S*(1+I), 0, -1, 0).
table( call, S, C, P, I, X, B, 0, X, C*(1+I), 0, 0, -1).
table( put, S, C, P, I, X, B, 0, X, P*(1+I)-X, 0, 1, -1).
table( bond, S, C, P, I, X, B, 0, 0, B*(1+I), 0, 0, 0).
% A straightforward query is finding the
% value of selling a call option where
% the call price is 5, exercise price 50,
% interest rate 5% and current stock price 60.
% Note that this query assigns variables just
% to make the query look more readable
go1(Value) :-
Call=5,Exercise=50,Interest=0.05,Stock=60 ,
value(call,sell,Stock,Call,_,Interest,Exercise,_,Value).
% Answer:
% W = -4.75
% If we just the the question upside down and
% ask what should the stock price be in order that
% my wealth is more than 5. Then we have
go2(Stock,W) :-
Call=5,Exercise=50,Interest=0.05 ,
W > 5,
value(call,sell,Stock,Call,_,Interest,Exercise,_,W).
% Answer 1:
% W = 5.25
% 50 > S
% S >= 0
% Answer 2:
% W = 55.25 - S
% 50.25 > S
% S >= 50
% straddle
% The general query is
% ?- Wealth=W1+W2,....
% value(call,buy,S,C,_,I,X,_,W1),
% value(put,buy,S,_,P,I,X,_,W2).
go3(Stock,W) :-
Call=5,Int=0.05,X=50,Put=7,
W >= 10,
value(put,buy,Stock,_,Put,Int,X,_,W1),
value(call,buy,Stock,Call,_,Int,X,_,W2),
W=W1+W2.
% Answer 1:
% S = 37.4 - W
% W >= 10
% S >= 0
% Answer 2:
% S = 62.6 + W
% W >= 10
% S >= 0
go4(S,W) :-
I=0.1,P1=10,X1=20,
value(put,sell,S,_,P1,I,X1,_,W1),
P2=18,X2=40,
value(put,buy,S,_,P2,I,X2,_,W2),
C3=15,X3=60,
value(call,buy,S,C3,_,I,X3,_,W3),
C4=10,X4=80,
value(call,sell,S,C4,_,I,X4,_,W4),
W=W1+W2+W3+W4.
% Answer 1:
% W = 5.7
% 20 > S
% S >= 0
% Answer 2:
% S = 25.7 - W
% 5.7 >= W
% 14.3 + W > 0
% S >= 0
% Answer 3:
% W = -14.3
% S >= 40
% 60 > S
% Answer 4:
% S = 74.3 + W
% 14.3 + W >= 0
% 5.7 > W
% S >= 0
% Answer 5:
% W = 5.7
% S >= 80
go5(S,W) :-
Put=5,Exercise=20,Interest=0.1,
S >= 0,
W > 100,
value(put,buy,S,_,Put,Interest,Exercise,_,W).
% No solution.
?- printf("\n>>> Sample goals (some with multiple answers):\n", []),
printf(" go1(W), go2(S, W), go3(S, W), go4(S, W), go5(S, W)\n", []).