파인스크립트 기본반
분류 예제

날짜를 설정해서 특정 기간의 결과값만 보기

페이지 정보

본문

백테스트할때 특정한 기간의 결과값만 보려면 어떻게 해야할까요?

예를 들어 2년전부터 1년전까지 딱 1년간의 결과가 궁금하다면요?

기본적으로 백테스트는 전체 기간을 대상으로 하기때문에 특정 기간의 결과를 보려면 추가로 스크립트를 작성해야합니다.


트레이딩뷰에서는 시간을 년, 월, 일, 시, 분으로 나타낼 수 있습니다.

그래서 시작 시간부터 끝나는 시간까지 년, 월, 일, 시, 분을 비교하여 특정 기간을 나타낼 수 있습니다.

그런데, 이렇게 년, 월, 일, 시, 분을 모두 비교하는 것 보다 효율적인 방법이 있습니다.

바로, 유닉스 시간을 이용하는 것입니다.



[유닉스 시간]


1970년 1월 1일 0시 0분 0초를 0으로 보고, 그 이후로 몇초나 지났는지를 나타내는 수입니다.

대부분의 프로그래밍에서 시간을 다룰때 사용됩니다.


timestamp(year, month, day, hour, minute, second)


timestamp 함수를 이용하면 트레이딩뷰에서도 유닉스 시간을 알 수 있습니다.

예를 들어, 2020년 5월 12일 2시 31분 12초가 어떤 유닉스 시간을 갖는지 알아보려면 아래 스크립트를 차트에 넣어보면 됩니다.



//@version=4
strategy("Time rage")
utime = timestamp(2020, 5, 12, 2, 31, 12)
plot(utime)


3a5c522ef4c5d051c8839bd346cdcd37_1589214352_57.png
1589250672000.0 이라는 값이 나왔습니다.

밀리 초로 나오기 때문에 뒤에 0 3개를 없애면 1970년 1월 1일 부터 1,589,250,672초 지난 시간이라는 것을 알 수 있습니다.



그러면, 1970년 1월 1일 0시 0분 0초를 넣어보면 어떨까요?



//@version=4
strategy("Time rage")
utime = timestamp(1970, 1, 1, 0, 0, 0)
plot(utime)


3a5c522ef4c5d051c8839bd346cdcd37_1589214352_33.png
예상대로 0이 나왔습니다.


각 봉마다의 유닉스 시간을 나타내려면 이렇게 하면 됩니다.



//@version=4
strategy("Time rage")
utime = timestamp(year, month, dayofmonth, hour, minute, second)
plot(utime)


3a5c522ef4c5d051c8839bd346cdcd37_1589214352_46.png
일봉차트 이므로 각 봉 마다 86,400,000(24시간 * 60분 * 60초 * 1000) 만큼 차이나는 직선모양으로 나옵니다.



//@version=4
strategy("Time rage")
plot(time)


특별히 time이라는 내장 변수가 현재의 유닉스 시간을 저장하고 있습니다.

바로 위처럼 plot(time)을 하게 되면 앞선 결과와 같게 나옵니다.

따라서 내장 변수 time은 timestamp(year, month, dayofmonth, hour, minite, second)와 같다고 보시면 되곗습니다.



[기간 설정하기]


그러면, 특정 기간을 고르려면 어떻게 해야할까요?

유닉스 시간과 조건문을 적절히 이용하면 됩니다.


예를 들어, 2019년 5월 20일부터 2020년 3월 15일까지 기간을 선택하는 스크립트를 작성해봅시다.



startYear = 2019
startMonth = 5
startDay = 20
endYear = 2020
endMonth = 3
endDay = 15


변수는 시작년, 시작월, 시작일, 끝년, 끝월, 끝일 이렇게 6개가 됩니다.



startPeriod = timestamp(startYear, startMonth, startDay, 0, 0)
endPeriod = timestamp(endYear, endMonth, endDay, 0, 0)


시작 날짜와 끝 날짜의 유닉스 시간을 구합니다.
timestamp의 second 인자는 필수 인자가 아니므로 생략할 수 있습니다.
시, 분은 필수 인자이므로 0시 0분이 기준이 되도록 0, 0을 넣습니다.


이렇게 구한 시작과 끝 날짜의 유닉스 시간과 현재의 유닉스 시간을 비교하면 됩니다.
현재의 시간이 시작과 끝 사이에 있다면, 시작보다는 큰 값을, 끝보다는 작은 값을 가지게 될겁니다.


설정한 기간의 시작이 10초이고, 끝이 20초라고 해봅니다.

현재 시간이 15초 이면, 기간 안에 있는 것입니다.

현재 시간이 5초나 25초라면 기간 밖에 있는 것입니다.
이 조건을 수식으로 나타내면



time >= startPeriod and time <= endPeriod


이렇게 됩니다.
현재 시간(time)은 시작 시간(startPeriod)보다 커야(>=)하고, 동시에(and) 현재 시간은 끝 시간(endPeriod)보다는 작아야(<=)합니다.


거의 다왔습니다. 이 조건을 이용해서 if문을 작성합니다.


testPeriod = time >= startPeriod and time <= endPeriod
if (testPeriod)
    ...


... 부분에 특정 기간에서만 실행하고자 하는 코드를 입력하면 됩니다.

if에 속하는 코드는 반드시 앞에 탭으로 들여쓰거나 4칸 공백을 줘야합니다.



[예제]


//@version=4
strategy("내 전략", overlay=true)

longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(sma(close, 14), sma(close, 28))
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)


빈 전략 스크립트를 만들면 나오는 기본 스크립트 입니다.

여기에 위에서 만든 기간을 설정하는 조건문을 넣어보겠습니다.


//@version=4
strategy("내 전략", overlay=true)
 
startYear = 2019
startMonth = 5
startDay = 20
startPeriod = timestamp(startYear, startMonth, startDay, 0, 0)
endYear = 2020
endMonth = 3
endDay = 15
endPeriod = timestamp(endYear, endMonth, endDay, 0, 0)
testPeriod = time >= startPeriod and time <= endPeriod
if (testPeriod)
    longCondition = crossover(sma(close, 14), sma(close, 28))

    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)

    shortCondition = crossunder(sma(close, 14), sma(close, 28))
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)


3a5c522ef4c5d051c8839bd346cdcd37_1589219350_25.png
스크립트를 차트에 넣은 후 차트 기간을 길게 보면, 2019년 5월 부터 2020년 3월 그 사이에만 신호가 나오고 그 외 기간에는 신호가 나오지 않았습니다.

당연히 전략테스터의 결과도 설정간 기간 사이의 결과만 보여줍니다.



[날짜 입력 받기]


input 함수를 이용해 날짜를 입력 받으면, 매번 스크립트를 수정해서 날짜를 바꾸지 않아도 됩니다.


startYear = 2019
startMonth = 5
startDay = 20
startPeriod = timestamp(startYear, startMonth, startDay, 0, 0)
endYear = 2020
endMonth = 3
endDay = 15
endPeriod = timestamp(endYear, endMonth, endDay, 0, 0)


이 부분을 아래처럼 고치면 됩니다.


startYear = input(1, "Start year")
startMonth = input(1, "Start month")
startDay = input(1, "Start day")
startPeriod = timestamp(startYear, startMonth, startDay, 0, 0)
endYear = input(9999, "End year")
endMonth = input(12, "End month")
endDay = input(31, "End day")
endPeriod = timestamp(endYear, endMonth, endDay, 0, 0)


input의 첫번째 인자는 기본값, 두번재 인자는 입력받는 값의 이름입니다.


//@version=4
strategy("내 전략", overlay=true)

startYear   = input(1,      "Start year")
startMonth  = input(1,      "Start month")
startDay    = input(1,      "Start day")
startPeriod = timestamp(startYear, startMonth, startDay, 0, 0)

endYear     = input(9999,   "End year")
endMonth    = input(12,     "End month")
endDay      = input(31,     "End day")
endPeriod   = timestamp(endYear, endMonth, endDay, 0, 0)

testPeriod = time >= startPeriod and time <= endPeriod

if (testPeriod)
    longCondition = crossover(sma(close, 14), sma(close, 28))
    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)

    shortCondition = crossunder(sma(close, 14), sma(close, 28))
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)

 

전체 스크립트입니다.


3a5c522ef4c5d051c8839bd346cdcd37_1589221609_01.png
전략 속성을 열어보면 시작 년월일, 끝 년월일을 입력받는 곳이 생겼습니다.

날짜를 입력하면 해당 기간에만 전략의 매매가 이루어지는 것을 볼 수 있습니다.


큰 하락이 시작됐을때 부터의 결과는 어땠을까?
큰 상승이 시작됐을때 부터의 결과는 어땠을까?
경제위기 전 후로 전략의 양상은 달라질까?

이렇게 어떤 전략이 특정 기간에서 어떤 성과를 냈는지 알아볼 수 있습니다.



[배경색]


설정한 기간을 좀더 명확하게 알아보기 위해 배경색을 설정해보겠습니다.


bgcolor(color, transp, offset, editable, show_last, title)


bgcolor 함수를 쓰면 차트에 배경색을 표현할 수 있습니다.

설정한 기간에만 배경색을 지정하고, 그 외의 기간에는 색을 지정하지 않으면(na) 됩니다.


testBgColor = testPeriod ? color.green : na
bgcolor(testBgColor, 95, title="Backtest BG")


testBgColor에 배경색이 들어갑니다.

현재 봉이 설정한 기간(testPeriod)에 포함된다면 녹색(color.green), 아니라면 아무런(na)색도 지정하지 않습니다.

그리고, bgcolor의 첫번째 인자로 이 색을 넣습니다. 두번째 인자는 투명도입니다.

배경색은 전략 속성창에서 바꿀 수 있는데, 쉽게 알아보게 하기 위해 Backtest BG라는 이름을 지정해줬습니다.


아래에 전체 코드입니다.


//@version=4
strategy("내 전략", overlay=true)

startYear   = input(1,      "Start year")
startMonth  = input(1,      "Start month")
startDay    = input(1,      "Start day")
startPeriod = timestamp(startYear, startMonth, startDay, 0, 0)

endYear     = input(9999,   "End year")
endMonth    = input(12,     "End month")
endDay      = input(31,     "End day")
endPeriod   = timestamp(endYear, endMonth, endDay, 0, 0)

testPeriod  = time >= startPeriod and time <= endPeriod
testBgColor = testPeriod ? color.green : na

if (testPeriod)
    longCondition = crossover(sma(close, 14), sma(close, 28))
    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)

    shortCondition = crossunder(sma(close, 14), sma(close, 28))
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)

bgcolor(testBgColor, 95, title="Backtest BG")


3a5c522ef4c5d051c8839bd346cdcd37_1589224171_29.png
날짜를 지정하면 해당 기간에 녹색 배경색이 지정된 것을 볼 수 있습니다.


전략의 매매는 시작 날짜 부터 바로 되는 것은 아니고, 시작 날짜 이후로 매매 조건이 달성된 날부터 매매가 이루어집니다.
따라서 전략 신호는 설정한 시작 날짜 보다 약간 더 뒤에 나올 수 있습니다.

관련자료

등록된 댓글이 없습니다.
전체 25건 / 1페이지

+ 최근글


+ 새댓글


통계