📄 treedemonew.m
字号:
function treedemonew(Command, Trees,Port,RS)
%TREEDEMONEW Display all four price tree models: BDT, HW, HJM nad BK
%
%Mayeda Reyes-Kattar
%Define Colors for tree viewer actions (used by more than one switch case)
ColorOne = [1 .15 0]; %Path One
ColorTwo = [.6 0 .6]; %Path Two
ColorThree = [1 0 0]; %Node and Children
if nargin == 0
Command = 'init';
end
switch lower(Command)
case 'update'
%View instrument price tree
Tree = getappdata(gcf,'HJMTREE');
% ---------------------------------------------------
% Determine the type of tree, and obtain information
% appropriately.
% ---------------------------------------------------
if isafin(Tree, 'HJMPriceTree')
[NLevels, NChild, NInstTree] = bushshape(Tree.PBush);
elseif isafin(Tree, 'BDTPriceTree')
[NLevels, NInstTree] = treeshape(Tree.PTree);
NChild = 2;
elseif isafin(Tree, 'HWPriceTree')
[NLevels, NP] = trintreeshape(Tree);
NInstTree = NP(1);
NChild = 3;
elseif isafin(Tree, 'BKPriceTree')
[NLevels, NP] = trintreeshape(Tree);
NInstTree = NP(1);
NChild = 3;
else
error('finderiv:treedemonew:InvalidTree','Input argument ''Tree'' not recognized as a valid tree')
end
ha = findobj(gcf, 'Tag', 'Chooser');
delete(ha);
if isafin(Tree, 'BDTFwdTree')
AxesHandle = treeguistate(Tree.FwdTree);
elseif isafin(Tree, 'BDTRateTree')
AxesHandle = treeguistate(Tree.RateTree);
elseif isafin(Tree, 'BDTPriceTree')
AxesHandle = treeguistate(Tree.PTree);
elseif isafin(Tree, 'BDTCFTree')
AxesHandle = treeguistate(Tree.CFTree);
elseif isafin(Tree, 'BDTMmktTree')
AxesHandle = treeguistate(Tree.MMktTree);
elseif isafin(Tree, 'BinStockTree')
AxesHandle = treeguistate(Tree.STree);
elseif isafin(Tree, 'BinPriceTree')
AxesHandle = treeguistate(Tree.PTree);
elseif isafin(Tree, 'HWFwdTree') || isafin(Tree, 'HWRateTree')
AxesHandle = trintreeguistate(Tree);
elseif isafin(Tree, 'BKFwdTree') || isafin(Tree, 'BKRateTree')
AxesHandle = trintreeguistate(Tree);
elseif isafin(Tree, 'BKPriceTree') || isafin(Tree, 'HWPriceTree')
AxesHandle = trintreeguistate(Tree);
else
AxesHandle = bushguistate(NChild);
end
%start x-axis labels at zero
xlab = get(gca,'Xtick')-1;
%reposition axis
p = get(AxesHandle,'Position');
set(AxesHandle,'Position',[p(1)/8 p(2) p(3)/2+p(1)/2 p(4)],'Tag','Chooser',...
'Xticklabel',xlab,'Color',[1 1 1])
%Set highlightmode to path to root
setappdata(AxesHandle,'HighlightMode','path')
%Define callbacks for tree elements
trobj = findobj(gcf,'Tag','StateMark');
set(trobj,'Buttondownfcn','treeviewercallbacks(''treeaction'')')
%Set colors for paths, (taken from bushguistate)
ColorOrder = get(gca,'ColorOrder');
ColorOrder(3:4,:) = [ColorOne;ColorTwo];
ColorOrder(5:end,:) = [];
ColorState = ColorOrder(1,:); % Color of state markers
ColorLine = ColorOrder(2,:); % Color of unselected lines connecting states
ColorSelectOrder = ColorOrder(3:end,:); % Colors available for selection
ColorSelectInd = 1; % Location of next color in ColorSelectOrder
ChooserH = findobj(gcf,'Tag','Chooser');
setappdata(ChooserH, 'ColorState', ColorState);
setappdata(ChooserH, 'ColorLine', ColorLine);
setappdata(ChooserH, 'ColorSelectOrder', ColorSelectOrder);
setappdata(ChooserH, 'ColorSelectInd', ColorSelectInd);
setappdata(ChooserH,'CurrentPathNumber',0);
case 'init'
% Initialize the tree and the portfolio here.
if nargin == 0
load treedemonew
% Build tree list and pick default (HJM)
Trees = {'Black-Derman-Toy', BDTPriceTree; ...
'Black-Karasinski', BKPriceTree; ...
'Heath-Jarrow-Morton', HJMPriceTree; ...
'Hull-White', HWPriceTree};
treedemonew('init',Trees,Port,HWTree.RateSpec)
return;
else
Tree = Trees{3,2};
end
%Define Colors for tree viewer actions (used by more than one switch case)
ColorOne = [1 .15 0]; %Path One
ColorTwo = [.6 0 .6]; %Path Two
ColorThree = [1 0 0]; %Node and Children
fnt = get(0,'Fixedwidthfont'); %Font to use for all listboxes
% ---------------------------------------------------
% Determine the type of tree, and obtain information
% appropriately.
% ---------------------------------------------------
if isafin(Tree, 'HJMFwdTree')
[NLevels, NChild] = bushshape(Tree.FwdTree);
elseif isafin(Tree, 'HJMRateTree')
[NLevels, NChild] = bushshape(Tree.RateTree);
elseif isafin(Tree, 'HJMPriceTree')
[NLevels, NChild, NInstTree] = bushshape(Tree.PBush);
elseif isafin(Tree, 'HJMCFTree')
[NLevels, NChild, NInstTree] = bushshape(Tree.CFBush);
elseif isafin(Tree, 'HJMMmktTree')
[NLevels, NChild, NInstTree] = bushshape(Tree.MMktTree);
elseif iscell(Tree)
[NLevels, NChild, NInstTree] = bushshape(Tree);
elseif isafin(Tree, 'BDTFwdTree')
[NLevels, NInstTree] = treeshape(Tree.FwdTree);
NChild = 2;
elseif isafin(Tree, 'BDTRateTree')
[NLevels, NInstTree] = treeshape(Tree.RateTree);
NChild = 2;
elseif isafin(Tree, 'BDTPriceTree')
[NLevels, NInstTree] = treeshape(Tree.PTree);
NChild = 2;
elseif isafin(Tree, 'BDTCFTree')
[NLevels, NInstTree] = treeshape(Tree.CFTree);
NChild = 2;
elseif isafin(Tree, 'BDTMmktTree')
[NLevels, NInstTree] = treeshape(Tree.MMktTree);
NChild = 2;
elseif isafin(Tree, 'BinStockTree')
[NLevels, NInstTree] = treeshape(Tree.STree);
NChild = 2;
elseif isafin(Tree, 'BinPriceTree')
[NLevels, NInstTree] = treeshape(Tree.PTree);
NChild = 2;
elseif isafin(Tree, 'HWFwdTree') || isafin(Tree, 'BKFwdTree')
[NLevels, NInstTree] = trintreeshape(Tree);
NChild = 3;
elseif isafin(Tree, 'HWPriceTree')
[NLevels, NP] = trintreeshape(Tree);
NInstTree = NP(1);
NChild = 3;
elseif isafin(Tree, 'HWRateTree') || isafin(Tree, 'BKRateTree')
[NLevels, NInstTree] = trintreeshape(Tree);
NChild = 3;
elseif isafin(Tree, 'BKPriceTree')
[NLevels, NP] = trintreeshape(Tree);
NInstTree = NP(1);
NChild = 3;
else
error('finderiv:treedemonew:InvalidTree','Input argument ''Tree'' not recognized as a valid tree')
end
% -----------------------------------------------
% Determine how portfolio was passed in. If a portfolio
% was passed in, pull out the names of the instruments.
% -----------------------------------------------
instnames = [];
if nargin >= 3
if isafin(Port, 'Instruments')
try
instnames = cellstr(instget(Port,'FieldName',{'Name'}));
catch
errordlg('finderiv:treedemonew:InvalidPortfolio','Portfolio must contain at least one instrument to open tree viewer.')
set(findobj('Type','figure'),'Pointer','arrow')
return
end
elseif iscell(Port)
instnames = Port;
end
NInstSet = length(instnames);
instval = 1; %Default to first instrument
elseif(~isafin(Tree, 'HJMFwdTree') && ~isafin(Tree, 'HJMRateTree') && ...
~isafin(Tree, 'HJMMmktTree') && ~isafin(Tree, 'BDTMmktTree') && ...
~isafin(Tree, 'BDTFwdTree') && ~isafin(Tree, 'BDTRateTree') && ...
~isafin(Tree, 'HWFwdTree') && ~isafin(Tree, 'HWRateTree') && ...
~isafin(Tree, 'BKFwdTree') && ~isafin(Tree, 'BKRateTree') && ...
~isafin(Tree, 'BinStockTree'))
% ---------------------------------------------
% If no PortFolio was passed in, and the tree is
% not a rate tree, default instrument names to
% instrument numbers.
% ---------------------------------------------
instnames = cellstr(num2str((1:NInstTree(1))'));
NInstSet = NInstTree(1);
instval = 1;
end
% ---------------------------------------------------
% Verify that the number of instruments in InstSet
% corresponds to the number of instruments represented
% in the tree.
% ---------------------------------------------------
if nargin >= 3
CName = [];
if isafin(Tree, 'HJMFwdTree')
CName = 'HJMFwdTree';
instnames = [];
elseif isafin(Tree, 'HJMRateTree')
CName = 'HJMRateTree';
instnames = [];
elseif isafin(Tree, 'HJMMmktTree')
CName = 'HJMMmktTree';
instnames = [];
elseif isafin(Tree, 'BDTFwdTree')
CName = 'BDTFwdTree';
instnames = [];
elseif isafin(Tree, 'BDTRateTree')
CName = 'BDTRateTree';
instnames = [];
elseif isafin(Tree, 'BDTMmktTree')
CName = 'BDTMmktTree';
instnames = [];
elseif isafin(Tree, 'BinStockTree')
CName = 'BinStockTree';
instnames = [];
elseif isafin(Tree, 'HWFwdTree')
CName = 'HWFwdTree';
instnames = [];
elseif isafin(Tree, 'HWRateTree')
CName = 'HWRateTree';
instnames = [];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -