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.
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", []).