如何根据 MATLAB 中的唯一日期循环 table
How to loop through table based on unique date in MATLAB
我有一个名为 BondData
的 table,其中包含以下内容:
Settlement Maturity Price Coupon
8/27/2016 1/12/2017 106.901 9.250
8/27/2019 1/27/2017 104.79 7.000
8/28/2016 3/30/2017 106.144 7.500
8/28/2016 4/27/2017 105.847 7.000
8/29/2016 9/4/2017 110.779 9.125
对于table中的每一天,我都将执行一项特定任务,即为变量分配多个值并执行必要的计算。逻辑是这样的:
do while Settlement is the same
m_settle=current_row_settlement_value
m_maturity=current_row_maturity_value
and so on...
my_computation_here...
end
这就像我想循环我的结算日期并执行任务,只要日期相同。
编辑: 只是为了澄清我的问题,我正在使用 Nelson-Siegel 和 Svensson 实施收益率曲线拟合 models.Here 是我目前的代码:
function NS_SV_Models()
load bondsdata
BondData=table(Settlement,Maturity,Price,Coupon);
BondData.Settlement = categorical(BondData.Settlement);
Settlements = categories(BondData.Settlement); % get all unique Settlement
for k = 1:numel(Settlements)
rows = BondData.Settlement==Settlements(k);
Bonds.Settle = Settlements(k); % current_row_settlement_value
Bonds.Maturity = BondData.Maturity(rows); % current_row_maturity_value
Bonds.Prices=BondData.Price(rows);
Bonds.Coupon=BondData.Coupon(rows);
Settle = Bonds.Settle;
Maturity = Bonds.Maturity;
CleanPrice = Bonds.Prices;
CouponRate = Bonds.Coupon;
Instruments = [Settle Maturity CleanPrice CouponRate];
Yield = bndyield(CleanPrice,CouponRate,Settle,Maturity);
NSModel = IRFunctionCurve.fitNelsonSiegel('Zero',Settlements(k),Instruments);
SVModel = IRFunctionCurve.fitSvensson('Zero',Settlements(k),Instruments);
NSModel.Parameters
SVModel.Parameters
end
end
同样,我的主要 objective 是每天获取每个模型的参数(beta0、beta1、beta2 等)。我在 Instruments = [Settle Maturity CleanPrice CouponRate];
中收到错误,因为 Settle 仅包含一条记录 (8/27/2016),它应该有两条,因为此日期有两行。此外,我注意到 Maturity、CleanPrice 和 CouponRate 包含所有记录。它们应该只包含每天的相应数据。
希望我现在让我的问题更清楚了。顺便说一下,我使用的是 MATLAB R2015a。
使用分类数组。这是你的功能(没有它的标题,我不能 运行 的所有行都被注释了):
BondData = table(datetime(Settlement),datetime(Maturity),Price,Coupon,...
'VariableNames',{'Settlement','Maturity','Price','Coupon'});
BondData.Settlement = categorical(BondData.Settlement);
Settlements = categories(BondData.Settlement); % get all unique Settlement
for k = 1:numel(Settlements)
rows = BondData.Settlement==Settlements(k);
Settle = BondData.Settlement(rows); % current_row_settlement_value
Mature = BondData.Maturity(rows); % current_row_maturity_value
CleanPrice = BondData.Price(rows);
CouponRate = BondData.Coupon(rows);
Instruments = [datenum(char(Settle)) datenum(char(Mature))...
CleanPrice CouponRate];
% Yield = bndyield(CleanPrice,CouponRate,Settle,Mature);
%
% NSModel = IRFunctionCurve.fitNelsonSiegel('Zero',Settlements(k),Instruments);
% SVModel = IRFunctionCurve.fitSvensson('Zero',Settlements(k),Instruments);
%
% NSModel.Parameters
% SVModel.Parameters
end
请记住以下几点:
- 您不能像在以下尝试中那样连接不同类型的变量:
Instruments = [Settle Maturity CleanPrice CouponRate];
- 结构
Bond
中不需要,你不用它(如Settle = Bonds.Settle;
)。
- 使用相关函数在
datetime
object 和字符串或数字之间进行转换。例如,在上面的代码中:datenum(char(Settle))
。我不知道你需要向以下函数传递什么样的输入。
我有一个名为 BondData
的 table,其中包含以下内容:
Settlement Maturity Price Coupon
8/27/2016 1/12/2017 106.901 9.250
8/27/2019 1/27/2017 104.79 7.000
8/28/2016 3/30/2017 106.144 7.500
8/28/2016 4/27/2017 105.847 7.000
8/29/2016 9/4/2017 110.779 9.125
对于table中的每一天,我都将执行一项特定任务,即为变量分配多个值并执行必要的计算。逻辑是这样的:
do while Settlement is the same
m_settle=current_row_settlement_value
m_maturity=current_row_maturity_value
and so on...
my_computation_here...
end
这就像我想循环我的结算日期并执行任务,只要日期相同。
编辑: 只是为了澄清我的问题,我正在使用 Nelson-Siegel 和 Svensson 实施收益率曲线拟合 models.Here 是我目前的代码:
function NS_SV_Models()
load bondsdata
BondData=table(Settlement,Maturity,Price,Coupon);
BondData.Settlement = categorical(BondData.Settlement);
Settlements = categories(BondData.Settlement); % get all unique Settlement
for k = 1:numel(Settlements)
rows = BondData.Settlement==Settlements(k);
Bonds.Settle = Settlements(k); % current_row_settlement_value
Bonds.Maturity = BondData.Maturity(rows); % current_row_maturity_value
Bonds.Prices=BondData.Price(rows);
Bonds.Coupon=BondData.Coupon(rows);
Settle = Bonds.Settle;
Maturity = Bonds.Maturity;
CleanPrice = Bonds.Prices;
CouponRate = Bonds.Coupon;
Instruments = [Settle Maturity CleanPrice CouponRate];
Yield = bndyield(CleanPrice,CouponRate,Settle,Maturity);
NSModel = IRFunctionCurve.fitNelsonSiegel('Zero',Settlements(k),Instruments);
SVModel = IRFunctionCurve.fitSvensson('Zero',Settlements(k),Instruments);
NSModel.Parameters
SVModel.Parameters
end
end
同样,我的主要 objective 是每天获取每个模型的参数(beta0、beta1、beta2 等)。我在 Instruments = [Settle Maturity CleanPrice CouponRate];
中收到错误,因为 Settle 仅包含一条记录 (8/27/2016),它应该有两条,因为此日期有两行。此外,我注意到 Maturity、CleanPrice 和 CouponRate 包含所有记录。它们应该只包含每天的相应数据。
希望我现在让我的问题更清楚了。顺便说一下,我使用的是 MATLAB R2015a。
使用分类数组。这是你的功能(没有它的标题,我不能 运行 的所有行都被注释了):
BondData = table(datetime(Settlement),datetime(Maturity),Price,Coupon,...
'VariableNames',{'Settlement','Maturity','Price','Coupon'});
BondData.Settlement = categorical(BondData.Settlement);
Settlements = categories(BondData.Settlement); % get all unique Settlement
for k = 1:numel(Settlements)
rows = BondData.Settlement==Settlements(k);
Settle = BondData.Settlement(rows); % current_row_settlement_value
Mature = BondData.Maturity(rows); % current_row_maturity_value
CleanPrice = BondData.Price(rows);
CouponRate = BondData.Coupon(rows);
Instruments = [datenum(char(Settle)) datenum(char(Mature))...
CleanPrice CouponRate];
% Yield = bndyield(CleanPrice,CouponRate,Settle,Mature);
%
% NSModel = IRFunctionCurve.fitNelsonSiegel('Zero',Settlements(k),Instruments);
% SVModel = IRFunctionCurve.fitSvensson('Zero',Settlements(k),Instruments);
%
% NSModel.Parameters
% SVModel.Parameters
end
请记住以下几点:
- 您不能像在以下尝试中那样连接不同类型的变量:
Instruments = [Settle Maturity CleanPrice CouponRate];
- 结构
Bond
中不需要,你不用它(如Settle = Bonds.Settle;
)。 - 使用相关函数在
datetime
object 和字符串或数字之间进行转换。例如,在上面的代码中:datenum(char(Settle))
。我不知道你需要向以下函数传递什么样的输入。