RSI

 RSI

RSI [ Relative Strength Index ]는 가격의 상승 압력과 하락 압력간의 상대적인 강도를 나타내는 대표적 반추세지표(Countertrend Oscillator)이다.

1978년 J. Welles Wilder, Jr는 그의 저서인 "New Concepts inTechnical Trading Systems" 에서 RSI를 소개했는데 "Relative StrengthIndex" 즉 "상대 강도 지수"로 번역할 수 있을 것이다. ( 이 "상대 강도 지수"라는 용어 때문에 혼동이 오는 경우가 많은데, 이 상대 강도라 함은 가격변동 중 상승의 강도를 나타내는 용어이지 흔히 쓰이는 종목과 업종간 상대 강도 등과는 다른 개념임을 유의하여야 한다.)

즉, RSI는 일정한 기간을 기준으로 그 기간의 가격 변동분 중 상승분이 어떤 비중을 차지하고 있느냐를 나타내는 것으로서, RSI가 "0"에 가깝다는 것은 그 일정기간 중 하락 강도가 강하다는 것이고 반대로 RSI가 "100"에 가깝다는 것은 그 일정기간 중 상승 강도가 강하다는 것을나타내는 것이다
[ 계 산 법 ]

RSI(상대강도지수, Relative Strength Index)는 주식 시장에서 주가의 상승과 하락의 강도를 나타내는 지표 중 하나입니다. RSI를 계산하는 수식은 다음과 같습니다:

=1001001+

여기서 는 상대강도(Relative Strength)이며, 다음과 같이 계산됩니다:

=평균 상승일 동안의 평균 수익평균 하락일 동안의 평균 손실

이제 이 수식을 C# 언어로 구현해 보겠습니다. 아래는 간단한 RSI 계산 함수의 예시입니다:

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 주식 가격 데이터 예시
        List<double> prices = new List<double> { /* 여기에 주식 가격 데이터 입력 */ };

        // RSI 계산
        double rsi = CalculateRSI(prices, 14); // 14일 기간을 예시로 사용

        Console.WriteLine($"RSI: {rsi}");
    }

    static double CalculateRSI(List<double> prices, int period)
    {
        if (prices.Count < period + 1)
        {
            throw new ArgumentException("데이터 포인트의 수가 기간보다 적습니다.");
        }

        double averageGain = 0;
        double averageLoss = 0;

        // 초기값 설정
        for (int i = 1; i <= period; i++)
        {
            double priceDiff = prices[i] - prices[i - 1];
            if (priceDiff > 0)
            {
                averageGain += priceDiff;
            }
            else
            {
                averageLoss += Math.Abs(priceDiff);
            }
        }

        averageGain /= period;
        averageLoss /= period;

        for (int i = period + 1; i < prices.Count; i++)
        {
            double priceDiff = prices[i] - prices[i - 1];
            if (priceDiff > 0)
            {
                averageGain = (averageGain * (period - 1) + priceDiff) / period;
                averageLoss = (averageLoss * (period - 1)) / period;
            }
            else
            {
                averageLoss = (averageLoss * (period - 1) + Math.Abs(priceDiff)) / period;
                averageGain = (averageGain * (period - 1)) / period;
            }
        }

        double rs = averageGain / averageLoss;

        // RSI 계산
        double rsi = 100 - (100 / (1 + rs));

        return rsi;
    }
}




댓글

이 블로그의 인기 게시물

글래스 스킨(GLASS SKIN)

봄의 꽃내음을 한 병에 담다

악의 평범함