码迷,mamicode.com
首页 > 其他好文 > 详细

写论文第九天:MATLAB之rsindex函数

时间:2016-05-07 10:06:41      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:

function rsi = rsindex(closep, nperiods)
%输入价格向量、期限(默认为14日),输出rsi值
%RSINDEX Relative Strength Index (RSI).
%   RSINDEX calculates the Relative Strength Index (RSI). The RSI is calculated
%   based on a default 14-period period.
%
%   RSI = rsindex(CLOSEP)
%   RSI = rsindex(CLOSEP, NPERIODS)
%
%   Optional Inputs: NPERIODS
%
%   Inputs:
%     CLOSEP - Nx1 vector of closing prices.
%
%   Optional Inputs:
%   NPERIODS - Scalar value of the number of periods. The default is period
%   is 14.
%
%   Outputs:
%        RSI - Nx1 vector of the relative strength index
%
%   Note: The RS factor is calculated by dividing the average of the gains by
%   the average of the losses within a specified period.
%
%     RS = (average gains) / (average losses)
%
%   Also, the first value of RSI, RSI(1), is a NaN in order to preserve the
%   dimensions of CLOSEP.
%
%   Example:
%      load disney.mat
%      dis_RSI = rsindex(dis_CLOSE);
%      plot(dis_RSI);
%
%   See also NEGVOLIDX, POSVOLIDX.

%   Reference: Murphy, John J., Technical Analysis of the Futures Market,
%              New York Institute of Finance, 1986, pp. 295-302

%   Copyright 1995-2006 The MathWorks, Inc.
%   $Revision: 1.1.6.3 $   $Date: 2006/03/21 07:01:38 $

% Check input arguments.
switch nargin
    case 1
        nperiods = 14;

    case 2
        if numel(nperiods) ~= 1 || mod(nperiods, 1) ~= 0
            error('Ftseries:rsindex:NPERIODSMustBeScalar', ...
                'NPERIODS must be a scalar integer.');

        elseif nperiods > length(closep)
            error('Ftseries:rsindex:NPERIODSTooLarge1', ...
                'NPERIODS is too large for the number of data points.');
        end

    otherwise
        error('Ftseries:rsindex:InvalidNumberOfInputArguments', ...
            'Invalid number of input arguments.');
end

% Check to make sure closep is a column vector
if size(closep, 2) ~= 1
    error('Ftseries:rsindex:ClosepMustBeColumnVect', ...
        'Closing prices must be a column vector.');
end

% Check for data sufficiency.
if length(closep) < nperiods
    error('Ftseries:rsindex:NPERIODSTooLarge2', ...
        'NPERIODS is too large for the number of data points.');
end

% Calculate the Relative Strength index (RSI).
if (nperiods > 0) && (nperiods ~= 0)
    % Determine how many nans are in the beginning
    nanVals = isnan(closep);
    firstVal = find(nanVals == 0, 1, 'first');
    numLeadNans = firstVal - 1;

    % Create vector of non-nan closing prices
    nnanclosep = closep(~isnan(closep));

    % Take a diff of the non-nan closing prices
    diffdata = diff(nnanclosep);
    priceChange = abs(diffdata);

    % Create '+' Delta vectors and '-' Delta vectors
    advances = priceChange;
    declines = priceChange;

    advances(diffdata < 0) = 0;
    declines(diffdata >= 0) = 0;

    % Calculate the RSI of the non-nan closing prices. Ignore first non-nan
    % closep b/c it is a reference point. Take into account any leading nans
    % that may exist in closep vector.
    trsi = nan(size(diffdata, 1)-numLeadNans, 1);
    for didx = nperiods:size(diffdata, 1)
        % Gains/losses
        totalGain = sum(advances((didx - (nperiods-1)):didx));
        totalLoss = sum(declines((didx - (nperiods-1)):didx));

        % Calculate RSI
        rs         = totalGain ./ totalLoss;
        trsi(didx) = 100 - (100 / (1+rs));
    end

    % Pre allocate vector taking into account reference value and leading nans.
    % length of vector = length(closep) - # of reference values - # of leading nans
    rsi = nan(size(closep, 1)-1-numLeadNans, 1);

    % Populate rsi
    rsi(~isnan(closep(2+numLeadNans:end))) = trsi;

    % Add leading nans
    rsi = [nan(numLeadNans+1, 1); rsi];

elseif nperiods < 0
    error('Ftseries:rsindex:NPERIODSMustBePosScalar', ...
        'NPERIODS must be a positive scalar.');

else
    rsi = closep;
end


% [EOF]

写论文第九天:MATLAB之rsindex函数

标签:

原文地址:http://blog.csdn.net/liangzuojiayi/article/details/51330602

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!