如何在表上执行返回(Matlab)

3j86kqsm  于 2023-10-23  发布在  Matlab
关注(0)|答案(2)|浏览(213)

我想知道你是否可以帮助这个Matlab编程问题。我有一个类似的表:

31/01/2023    01/02/2023    02/02/2023     03/02/2023 
02/01/2023   202,00     228,5   219 198
03/01/2023   195,00     215     206 206
04/01/2023   182,00     196     191 185
05/01/2023   185,00     202     200 198
06/01/2023   184,00     206     200 198
07/01/2023   182,00     207     207 199
08/01/2023   180,00     199     195 192
09/01/2023   179,00     192     189 184

我想计算每一列的回报率,所以(195/202),(182/195),(185/182).所以基本上对于每一列,行的值/行的值为-1。
你能帮帮我吗?
我在Matlab中试过这段代码,但不起作用(表的名称是“ret_table”)。

for col = 2:size(ret_table, 2)
    for row = 2:size(ret_table, 2)
        current_value = ret_table{row, col};
        previous_value = ret_table{row-1, col};
            if isnumeric(current_value) && isnumeric(previous_value)
                ret_table{row, col} = (current_value / previous_value);
            end
    end
end

它会变成这样:

31/01/2023   01/02/2023  02/02/2023  03/02/2023
02/01/2023  NaN NaN NaN NaN
03/01/2023  -0,04   -0,06   -0,06    0,04 
04/01/2023  -0,07   -0,09   -0,08   -0,11 
05/01/2023   0,02    0,03    0,05    0,07 
06/01/2023  -0,01    0,02    -       -   
07/01/2023  -0,01    0,00    0,03    0,01 
08/01/2023  -0,01   -0,04   -0,06   -0,04 
09/01/2023  -0,01   -0,04   -0,03   -0,04

但我一直得到这个错误:使用/参数时出错,参数必须是数字、字符或逻辑。
如果使用“./”:使用./时出错,两个输入必须具有相同的行标签。
编辑:我是这样解决的:

ret_table = array2table(PUN_fwd);

for col = 2:size(ret_table, 2)
    for row = 2:size(ret_table, 1) 
        current_value = table2array(ret_table{row, col});
        previous_value = table2array(ret_table{row-1, col});
        Returns{row, col} = log1p(current_value / previous_value);
    end
end
zsbz8rwp

zsbz8rwp1#

代码中有两件事值得注意。
第一个是在row = 2:size(ret_table, 2)行上,你应该在维度1而不是2上循环,以遍历所有的行,这意味着“row = 2:size(ret_table,1)”。只有当你有一个正方形表时,在2上循环才能令人满意地工作,这是一个不安全的假设。
第二,你没有得到预期的结果,因为在ret_table{row, col} = (current_value / previous_value);行,你在每次循环中都修改了表本身。所以每次你都不是使用原始的ret_table元素,而是在前一次迭代中使用它进行的计算。解决这个问题的方法是创建一个表的副本,并在解析原始表的同时修改副本(参见代码中的注解)。

ret_table_cpy=ret_table; %create copy
for col = 2:size(ret_table, 2)
    for row = 2:size(ret_table, 1) %loops using rows
        current_value = ret_table{row, col};
        previous_value = ret_table{row-1, col};
            if isnumeric(current_value) && isnumeric(previous_value)
                ret_table_cpy{row, col} = (current_value / previous_value); %edit copy
            end
    end
end

ret_table=ret_table_cpy; %reassign to original
clear ret_table_cpy %delete copy

这将得到以下结果:

02/01/2023        202      228.5        219        198
03/01/2023    0.96535    0.94092    0.94064     1.0404
04/01/2023    0.93333    0.91163    0.92718    0.89806
05/01/2023     1.0165     1.0306     1.0471     1.0703
06/01/2023    0.99459     1.0198          1          1
07/01/2023    0.98913     1.0049      1.035     1.0051
08/01/2023    0.98901    0.96135    0.94203    0.96482
09/01/2023    0.99444    0.96482    0.96923    0.95833

最后,您需要为第一行建立一个规则,因为显然不能在第一行执行操作,因为没有可供使用的先例元素。

z2acfund

z2acfund2#

我是这样解决的:

ret_table = array2table(PUN_fwd);

for col = 2:size(ret_table, 2)
    for row = 2:size(ret_table, 1) 
        current_value = table2array(ret_table{row, col});
        previous_value = table2array(ret_table{row-1, col});
        Returns{row, col} = log1p(current_value / previous_value);
    end
end

相关问题