e5f4633c39
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
163 lines
3.4 KiB
Plaintext
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", []).
|