1

我有证券代码清单。我想下载收盘价并将它们存储到变量中。我写了这个脚本:

function y=fetchDataFromYahoo()
    ticker={'ABFS','TCB','NE','FGP'};%,'IMO','CAJ','CAG','GMCR','HSH','HAIN','SIM'};
    c=yahoo;
    for i=1:4
        Price.(ticker{i})=fetch(c,ticker(i),'Adj Close','Jan 1 00','Apr 19 13','d');
        temp=Price.(ticker{i});
        ClosePrice(:,i)=temp(:,2);
    end
    y=ClosePrice;
end

当我在数组中有三个证券时它可以工作,但是当数组中有超过 3 个证券时它会抛出错误。错误消息如下:

Subscripted assignment dimension mismatch.

    Error in fetchDataFromYahoo (line 7)
            ClosePrice(:,i)=temp(:,2);

你能帮我解决这个问题吗?

4

1 回答 1

2

您假设所有系列的长度相同。只需将其保存在一个结构中:

fetchDataFromYahoo({'ABFS','TCB','NE','FGP'})

我将您的功能修改为:

function Price = fetchDataFromYahoo(ticker)
    c = yahoo;
    for i = 1:numel(ticker)
        Price.(ticker{i}) = fetch(c,ticker(i),'Adj Close','Jan 1 00','Apr 19 13','d');
    end
end

调用结果(第一行代码):

ans = 
    ABFS: [3337x2 double]
     TCB: [3337x2 double]
      NE: [3337x2 double]
     FGP: [3343x2 double]

编辑以解决评论

为了在矩阵中容纳不同长度的金融时间序列,您需要在缺少特定日期数据的地方填充 NaN。您将需要rude()和我的Pivot()

% Use the modified function that returns a structure
D   = fetchDataFromYahoo({'ABFS','TCB','NE','FGP'});

% Convert to cell
C   = struct2cell(D);

% Count how many rows each cell
len = cellfun('size',C,1);

% Expand id to match each series length
Out = Pivot([rude(len,1:numel(C))', cat(1,C{:})]);

您可以看到OutABFS、TCB 和 NE 缺少对应于第 37 行的日期(您也可以在 D 中再次检查,缺少日期 730539)。

于 2013-04-19T14:31:10.427 回答