파인스크립트 기본반
분류 공개스크립트

DAA 전략 백테스트

페이지 정보

본문



1. 카나리아 자산이 둘다 플러스일때만 공격 자산 2가지에 투자하는 전략 

//@version=4   
study("Defensive Asset Allocation", "DAA")
 
// * * * 입력 * * * //
// 카나리아 자산 입력
canarySym1 = input("AMEX:VWO", "카나리아 자산1 (신흥국 주식)", input.symbol)
canarySym2 = input("NASDAQ:BND", "카나리아 자산2 (미국 총 채권)", input.symbol)

// 사용할 공수 자산 입력
offenseSym1 = input("AMEX:SPY", "공격 자산1 (S&P500)", input.symbol)
offenseSym2 = input("AMEX:IWM", "공격 자산2 (러셀2000)", input.symbol)
offenseSym3 = input("NASDAQ:QQQ", "공격 자산3 (나스닥100)", input.symbol)
offenseSym4 = input("AMEX:VGK", "공격 자산4 (유럽 주식)", input.symbol)
offenseSym5 = input("AMEX:EWJ", "공격 자산5 (일본 주식)", input.symbol)
offenseSym6 = input("AMEX:VWO", "공격 자산6 (신흥국 주식)", input.symbol)
offenseSym7 = input("AMEX:VNQ", "공격 자산7 (미국 리츠)", input.symbol)
offenseSym8 = input("AMEX:GSG", "공격 자산8 (원자재)", input.symbol)
offenseSym9 = input("AMEX:GLD", "공격 자산9 (금)", input.symbol)
offenseSym10 = input("NASDAQ:TLT", "공격 자산10 (미국 장기채)", input.symbol)
offenseSym11 = input("AMEX:HYG", "공격 자산11 (하이일드 채권)", input.symbol)
offenseSym12 = input("AMEX:LQD", "공격 자산12 (미국 회사채)", input.symbol)
defenseSym1 = input("NASDAQ:SHV", "수비 자산1 (미국 초단기 국채)", input.symbol)
defenseSym2 = input("NASDAQ:IEF", "수비 자산2 (미국 중기국채)", input.symbol)
defenseSym3 = input("AMEX:UST", "수비 자산3 (미국 중기채 레버리지)", input.symbol)

// 백테스트 기간 설정
startYear   = input(1,      "시작 년")
startMonth  = input(1,      "시작 월")
startDay    = input(1,      "시작 일")
endYear     = input(9999,   "종료 년")
endMonth    = input(12,     "종료 월")
endDay      = input(31,     "종료 일")
startPeriod = timestamp(startYear, startMonth, startDay, 0, 0)
endPeriod   = timestamp(endYear, endMonth, endDay, 0, 0)
testPeriod  = time >= startPeriod and time <= endPeriod
 
// 함수 정의 시작
// 종가 가져오기
getClose(sym) => security(sym, timeframe.period, close, barmerge.gaps_off, barmerge.lookahead_on)
 
// 수익률 계산
getYield(src, m) => (src/src[m]-1)*100
 
// 모멘텀 스코어 계산
getScore(src) => 12 * getYield(src, 1) + 4 * getYield(src, 3) + 2 * getYield(src, 6) + 1 * getYield(src, 12)
// 함수 정의 끝
 
// * * * 연산 * * * //
// 카나리아 자산 종가
canary1 = getClose(canarySym1)
canary2 = getClose(canarySym2)

// 카나리아는 죽었나?
canary = (getYield(canary1, 1) > 0 ? 0.5 : 0) + (getYield(canary2, 1) > 0 ? 0.5 : 0)

// 공격적인 자산 종가
off1 = getClose(offenseSym1)
off2 = getClose(offenseSym2)
off3 = getClose(offenseSym3)
off4 = getClose(offenseSym4)
off5 = getClose(offenseSym5)
off6 = getClose(offenseSym6)
off7 = getClose(offenseSym7)
off8 = getClose(offenseSym8)
off9 = getClose(offenseSym9)
off10 = getClose(offenseSym10)
off11 = getClose(offenseSym11)
off12 = getClose(offenseSym12)
 
// 수비적인 자산 종가
def1 = getClose(defenseSym1)
def2 = getClose(defenseSym2)
def3 = getClose(defenseSym3)
 
// 공격적인 자산의 모멘텀 스코어
scoreOff1 = getScore(off1)
scoreOff2 = getScore(off2)
scoreOff3 = getScore(off3)
scoreOff4 = getScore(off4)
scoreOff5 = getScore(off5)
scoreOff6 = getScore(off6)
scoreOff7 = getScore(off7)
scoreOff8 = getScore(off8)
scoreOff9 = getScore(off9)
scoreOff10 = getScore(off10)
scoreOff11 = getScore(off11)
scoreOff12 = getScore(off12)

// 수비적인 자산의 모멘텀 스코어
scoreDef1 = getScore(def1)
scoreDef2 = getScore(def2)
scoreDef3 = getScore(def3)
 
// 모든 종목의 모멘텀 스코어가 존재하는가?
isValue = not( na(scoreOff1[1]) or na(scoreOff2[1]) or na(scoreOff3[1]) or na(scoreOff4[1]) or na(scoreOff5[1]) or na(scoreOff6[1]) or na(scoreOff7[1]) or na(scoreOff8[1]) or na(scoreOff9[1]) or na(scoreOff10[1]) or na(scoreOff11[1]) or na(scoreOff12[1]) or
 na(scoreDef1[1]) or na(scoreDef2[1]) or na(scoreDef3[1]))
 
// 공격 모드 판별
offenseCondition = canary > 0
 
// 공격형 자산 중 최고 모멘텀 스코어
scoreOffense = max(scoreOff1, scoreOff2, scoreOff3, scoreOff4, scoreOff5, scoreOff6, max(scoreOff7, scoreOff8, scoreOff9, scoreOff10, scoreOff11, scoreOff12))

// 두번째로 공격적인 자산을 구하기 위한 두번재 모멘텀 스코어
scoreOff1_2 = scoreOffense==scoreOff1 ? -2300.0 : scoreOff1
scoreOff2_2 = scoreOffense==scoreOff2 ? -2300.0 : scoreOff2
scoreOff3_2 = scoreOffense==scoreOff3 ? -2300.0 : scoreOff3
scoreOff4_2 = scoreOffense==scoreOff4 ? -2300.0 : scoreOff4
scoreOff5_2 = scoreOffense==scoreOff5 ? -2300.0 : scoreOff5
scoreOff6_2 = scoreOffense==scoreOff6 ? -2300.0 : scoreOff6
scoreOff7_2 = scoreOffense==scoreOff7 ? -2300.0 : scoreOff7
scoreOff8_2 = scoreOffense==scoreOff8 ? -2300.0 : scoreOff8
scoreOff9_2 = scoreOffense==scoreOff9 ? -2300.0 : scoreOff9
scoreOff10_2 = scoreOffense==scoreOff10 ? -2300.0 : scoreOff10
scoreOff11_2 = scoreOffense==scoreOff11 ? -2300.0 : scoreOff11
scoreOff12_2 = scoreOffense==scoreOff12 ? -2300.0 : scoreOff12

// 공격형 자산 중 두번째 최고 모멘텀 스코어
scoreOffense2 = max(scoreOff1_2, scoreOff2_2, scoreOff3_2, scoreOff4_2, scoreOff5_2, scoreOff6_2, max(scoreOff7_2, scoreOff8_2, scoreOff9_2, scoreOff10_2, scoreOff11_2, scoreOff12_2))
 
// 수비형 자산 중 최고 모멘텀 스코어
scoreDefense = max(scoreDef1, scoreDef2, scoreDef3)
 
// 공수 자산의 최근 한달간의 수익률(누적 수익률을 구하기 위함)
yieldOff1 = getYield(off1, 1)
yieldOff2 = getYield(off2, 1)
yieldOff3 = getYield(off3, 1)
yieldOff4 = getYield(off4, 1)
yieldOff5 = getYield(off5, 1)
yieldOff6 = getYield(off6, 1)
yieldOff7 = getYield(off7, 1)
yieldOff8 = getYield(off8, 1)
yieldOff9 = getYield(off9, 1)
yieldOff10 = getYield(off10, 1)
yieldOff11 = getYield(off11, 1)
yieldOff12 = getYield(off12, 1)
yieldDef1 = getYield(def1, 1)
yieldDef2 = getYield(def2, 1)
yieldDef3 = getYield(def3, 1)
 
// 투자 종목별 색상
colorScore = offenseCondition
 ? ((scoreOffense2 == scoreOff1) ? color.maroon : 
 (scoreOffense2 == scoreOff2) ? color.purple : 
 (scoreOffense2 == scoreOff3) ? color.fuchsia : 
 (scoreOffense2 == scoreOff4) ? color.green : 
 (scoreOffense2 == scoreOff5) ? color.lime : 
 (scoreOffense2 == scoreOff6) ? color.olive : 
 (scoreOffense2 == scoreOff7) ? color.yellow : 
 (scoreOffense2 == scoreOff8) ? color.navy : 
 (scoreOffense2 == scoreOff9) ? color.blue : 
 (scoreOffense2 == scoreOff10) ? color.teal : 
 (scoreOffense2 == scoreOff11) ? color.aqua : 
 (scoreOffense2 == scoreOff12) ? color.orange : na)
 : ((scoreDefense == scoreDef1) ? color.black :
 (scoreDefense == scoreDef2) ? color.silver :
 (scoreDefense == scoreDef3) ? color.gray : na)
 
// 월말 투자 종목
nextInvestment = offenseCondition
 ? ((scoreOffense == scoreOff1) ? "S&P500" : 
 (scoreOffense == scoreOff2) ? "러셀2000" : 
 (scoreOffense == scoreOff3) ? "나스닥100" : 
 (scoreOffense == scoreOff4) ? "유럽 주식" : 
 (scoreOffense == scoreOff5) ? "일본 주식" : 
 (scoreOffense == scoreOff6) ? "신흥국 주식" : 
 (scoreOffense == scoreOff7) ? "미국 리츠" : 
 (scoreOffense == scoreOff8) ? "원자재" : 
 (scoreOffense == scoreOff9) ? "금" : 
 (scoreOffense == scoreOff10) ? "미국 장기채" : 
 (scoreOffense == scoreOff11) ? "하이일드 채권" : 
 (scoreOffense == scoreOff12) ? "미국 회사채" : "")
 +" & "+
 ((scoreOffense2 == scoreOff1) ? "S&P500" : 
 (scoreOffense2 == scoreOff2) ? "러셀2000" : 
 (scoreOffense2 == scoreOff3) ? "나스닥100" : 
 (scoreOffense2 == scoreOff4) ? "유럽 주식" : 
 (scoreOffense2 == scoreOff5) ? "일본 주식" : 
 (scoreOffense2 == scoreOff6) ? "신흥국 주식" : 
 (scoreOffense2 == scoreOff7) ? "미국 리츠" : 
 (scoreOffense2 == scoreOff8) ? "원자재" : 
 (scoreOffense2 == scoreOff9) ? "금" : 
 (scoreOffense2 == scoreOff10) ? "미국 장기채" : 
 (scoreOffense2 == scoreOff11) ? "하이일드 채권" : 
 (scoreOffense2 == scoreOff12) ? "미국 회사채" : "")
 +"n투자 비중 : "+tostring(canary*100)+"%"
 : ((scoreDefense == scoreDef1) ? "미국 초단기 국채" :
 (scoreDefense == scoreDef2) ? "미국 중기국채" :
 (scoreDefense == scoreDef3) ? "미국 중기채 레버리지" : "")

// 공수 전환으로 인해 선택된 자산의 월별 수익률
monthYield = (offenseCondition[1]
 ? (((scoreOffense[1] == scoreOff1[1]) ? yieldOff1 : 
 (scoreOffense[1] == scoreOff2[1]) ? yieldOff2 : 
 (scoreOffense[1] == scoreOff3[1]) ? yieldOff3 : 
 (scoreOffense[1] == scoreOff4[1]) ? yieldOff4 : 
 (scoreOffense[1] == scoreOff5[1]) ? yieldOff5 : 
 (scoreOffense[1] == scoreOff6[1]) ? yieldOff6 : 
 (scoreOffense[1] == scoreOff7[1]) ? yieldOff7 : 
 (scoreOffense[1] == scoreOff8[1]) ? yieldOff8 : 
 (scoreOffense[1] == scoreOff9[1]) ? yieldOff9 : 
 (scoreOffense[1] == scoreOff10[1]) ? yieldOff10 : 
 (scoreOffense[1] == scoreOff11[1]) ? yieldOff11 : 
 (scoreOffense[1] == scoreOff12[1]) ? yieldOff12 : 0)
 +
 ((scoreOffense2[1] == scoreOff1[1]) ? yieldOff1 : 
 (scoreOffense2[1] == scoreOff2[1]) ? yieldOff2 : 
 (scoreOffense2[1] == scoreOff3[1]) ? yieldOff3 : 
 (scoreOffense2[1] == scoreOff4[1]) ? yieldOff4 : 
 (scoreOffense2[1] == scoreOff5[1]) ? yieldOff5 : 
 (scoreOffense2[1] == scoreOff6[1]) ? yieldOff6 : 
 (scoreOffense2[1] == scoreOff7[1]) ? yieldOff7 : 
 (scoreOffense2[1] == scoreOff8[1]) ? yieldOff8 : 
 (scoreOffense2[1] == scoreOff9[1]) ? yieldOff9 : 
 (scoreOffense2[1] == scoreOff10[1]) ? yieldOff10 : 
 (scoreOffense2[1] == scoreOff11[1]) ? yieldOff11 : 
 (scoreOffense2[1] == scoreOff12[1]) ? yieldOff12 : 0))
 * canary[1] * 0.5
 : ((scoreDefense[1] == scoreDef1[1]) ? yieldDef1 :
 (scoreDefense[1] == scoreDef2[1]) ? yieldDef2 :
 (scoreDefense[1] == scoreDef3[1]) ? yieldDef3 : 0))
  
// 월별 수익률 누적 결과
var yield = 0.0
yield := testPeriod ? (((1+yield/100) * (1+monthYield/100)) - 1) * 100 : 0.0
 
// 백테스트 기간에만 봉 갯수 세기
var barCount = 0
barCount := barCount + (testPeriod ? 1 : 0)
 
// 연 복리 계산
cagr = (pow(1+yield/100, 1/((barCount)/12))-1)*100
 
// 최고 수익률 계산
var maxYield = 0.0
maxYield := max(maxYield, yield)
 
// 손실폭 계산
var drawdown = 0.0
drawdown := (((1+yield/100)/(1+maxYield/100)) - 1) * 100
 
// 최대 손실폭 계산
var mdd = 0.0
mdd := min(mdd, drawdown)
 
// * * * 출력 * * * //
// 1. 공격 자산의 모멘텀 스코어
plot(scoreOff1, "S&P500", color.maroon, 1, plot.style_stepline)
plot(scoreOff2, "러셀2000", color.purple, 1, plot.style_stepline)
plot(scoreOff3, "나스닥100", color.fuchsia, 1, plot.style_stepline)
plot(scoreOff4, "유럽 주식", color.green, 1, plot.style_stepline)
plot(scoreOff5, "일본 주식", color.lime, 1, plot.style_stepline)
plot(scoreOff6, "신흥국 주식", color.olive, 1, plot.style_stepline)
plot(scoreOff7, "미국 리츠", color.yellow, 1, plot.style_stepline)
plot(scoreOff8, "원자재", color.navy, 1, plot.style_stepline)
plot(scoreOff9, "금", color.blue, 1, plot.style_stepline)
plot(scoreOff10, "미국 장기채", color.teal, 1, plot.style_stepline)
plot(scoreOff11, "하이일드 채권", color.aqua, 1, plot.style_stepline)
plot(scoreOff12, "미국 회사채", color.orange, 1, plot.style_stepline) 
 
// 2. 수비 자산의 모멘텀 스코어
plot(scoreDef1, "미국 초단기 국채채", color.black, 1, plot.style_stepline)
plot(scoreDef2, "미국 중기국채", color.silver, 1, plot.style_stepline)
plot(scoreDef3, "미국 중기채 레버리지", color.gray, 1, plot.style_stepline)
 
// 3. 월별 수익률 & 월말 투자 종목
plot(testPeriod and isValue ? monthYield : na, "월별 수익률(%)", colorScore[1], 1, plot.style_columns)
var labelNext = label.new(bar_index, 0, style = label.style_label_lower_left, textalign = text.align_left)
label.set_xy(labelNext, bar_index, 0)
label.set_color(labelNext, colorScore)
label.set_text(labelNext, tostring(month) + "월말 투자 종목 : " + nextInvestment)
 
// 4. 수익률
plot(testPeriod and isValue ? yield : na, "수익률(%)", color.purple)
 
// 5. 연 복리
plot(testPeriod and isValue ? cagr : na, "연 복리(%)", color.green)
 
// 6. 손실폭과 최대 손실폭
plot(testPeriod and isValue ? drawdown : na, "손실폭(%)", color.red)
plot(testPeriod and isValue ? mdd : na, "최대 손실폭(%)", color.orange)

// 7. 카나리아
bgcolor(canary>0.5?color.orange:canary>0?color.yellow:na, 75, 1)


2. 카나리아 자산이 하나만 플러스일때 50% 현금 보유, 50%는 공격 자산 2가지에 투자하는 전략

//@version=4   
study("Defensive Asset Allocation", "DAA")
 
// * * * 입력 * * * //
// 카나리아 자산 입력
canarySym1 = input("AMEX:VWO", "카나리아 자산1 (신흥국 주식)", input.symbol)
canarySym2 = input("NASDAQ:BND", "카나리아 자산2 (미국 총 채권)", input.symbol)

// 사용할 공수 자산 입력
offenseSym1 = input("AMEX:SPY", "공격 자산1 (S&P500)", input.symbol)
offenseSym2 = input("AMEX:IWM", "공격 자산2 (러셀2000)", input.symbol)
offenseSym3 = input("NASDAQ:QQQ", "공격 자산3 (나스닥100)", input.symbol)
offenseSym4 = input("AMEX:VGK", "공격 자산4 (유럽 주식)", input.symbol)
offenseSym5 = input("AMEX:EWJ", "공격 자산5 (일본 주식)", input.symbol)
offenseSym6 = input("AMEX:VWO", "공격 자산6 (신흥국 주식)", input.symbol)
offenseSym7 = input("AMEX:VNQ", "공격 자산7 (미국 리츠)", input.symbol)
offenseSym8 = input("AMEX:GSG", "공격 자산8 (원자재)", input.symbol)
offenseSym9 = input("AMEX:GLD", "공격 자산9 (금)", input.symbol)
offenseSym10 = input("NASDAQ:TLT", "공격 자산10 (미국 장기채)", input.symbol)
offenseSym11 = input("AMEX:HYG", "공격 자산11 (하이일드 채권)", input.symbol)
offenseSym12 = input("AMEX:LQD", "공격 자산12 (미국 회사채)", input.symbol)
defenseSym1 = input("NASDAQ:SHV", "수비 자산1 (미국 초단기 국채)", input.symbol)
defenseSym2 = input("NASDAQ:IEF", "수비 자산2 (미국 중기국채)", input.symbol)
defenseSym3 = input("AMEX:UST", "수비 자산3 (미국 중기채 레버리지)", input.symbol)

// 백테스트 기간 설정
startYear   = input(1,      "시작 년")
startMonth  = input(1,      "시작 월")
startDay    = input(1,      "시작 일")
endYear     = input(9999,   "종료 년")
endMonth    = input(12,     "종료 월")
endDay      = input(31,     "종료 일")
startPeriod = timestamp(startYear, startMonth, startDay, 0, 0)
endPeriod   = timestamp(endYear, endMonth, endDay, 0, 0)
testPeriod  = time >= startPeriod and time <= endPeriod
 
// 함수 정의 시작
// 종가 가져오기
getClose(sym) => security(sym, timeframe.period, close, barmerge.gaps_off, barmerge.lookahead_on)
 
// 수익률 계산
getYield(src, m) => (src/src[m]-1)*100
 
// 모멘텀 스코어 계산
getScore(src) => 12 * getYield(src, 1) + 4 * getYield(src, 3) + 2 * getYield(src, 6) + 1 * getYield(src, 12)
// 함수 정의 끝
 
// * * * 연산 * * * //
// 카나리아 자산 종가
canary1 = getClose(canarySym1)
canary2 = getClose(canarySym2)

// 카나리아는 죽었나?
canary = (getYield(canary1, 1) > 0 and getYield(canary2, 1) > 0) ? true : false

// 공격적인 자산 종가
off1 = getClose(offenseSym1)
off2 = getClose(offenseSym2)
off3 = getClose(offenseSym3)
off4 = getClose(offenseSym4)
off5 = getClose(offenseSym5)
off6 = getClose(offenseSym6)
off7 = getClose(offenseSym7)
off8 = getClose(offenseSym8)
off9 = getClose(offenseSym9)
off10 = getClose(offenseSym10)
off11 = getClose(offenseSym11)
off12 = getClose(offenseSym12)
 
// 수비적인 자산 종가
def1 = getClose(defenseSym1)
def2 = getClose(defenseSym2)
def3 = getClose(defenseSym3)
 
// 공격적인 자산의 모멘텀 스코어
scoreOff1 = getScore(off1)
scoreOff2 = getScore(off2)
scoreOff3 = getScore(off3)
scoreOff4 = getScore(off4)
scoreOff5 = getScore(off5)
scoreOff6 = getScore(off6)
scoreOff7 = getScore(off7)
scoreOff8 = getScore(off8)
scoreOff9 = getScore(off9)
scoreOff10 = getScore(off10)
scoreOff11 = getScore(off11)
scoreOff12 = getScore(off12)

// 수비적인 자산의 모멘텀 스코어
scoreDef1 = getScore(def1)
scoreDef2 = getScore(def2)
scoreDef3 = getScore(def3)
 
// 모든 종목의 모멘텀 스코어가 존재하는가?
isValue = not( na(scoreOff1[1]) or na(scoreOff2[1]) or na(scoreOff3[1]) or na(scoreOff4[1]) or na(scoreOff5[1]) or na(scoreOff6[1]) or na(scoreOff7[1]) or na(scoreOff8[1]) or na(scoreOff9[1]) or na(scoreOff10[1]) or na(scoreOff11[1]) or na(scoreOff12[1]) or
 na(scoreDef1[1]) or na(scoreDef2[1]) or na(scoreDef3[1]))
 
// 공격 모드 판별
offenseCondition = canary
 
// 공격형 자산 중 최고 모멘텀 스코어
scoreOffense = max(scoreOff1, scoreOff2, scoreOff3, scoreOff4, scoreOff5, scoreOff6, max(scoreOff7, scoreOff8, scoreOff9, scoreOff10, scoreOff11, scoreOff12))

// 두번째로 공격적인 자산을 구하기 위한 두번재 모멘텀 스코어
scoreOff1_2 = scoreOffense==scoreOff1 ? -2300.0 : scoreOff1
scoreOff2_2 = scoreOffense==scoreOff2 ? -2300.0 : scoreOff2
scoreOff3_2 = scoreOffense==scoreOff3 ? -2300.0 : scoreOff3
scoreOff4_2 = scoreOffense==scoreOff4 ? -2300.0 : scoreOff4
scoreOff5_2 = scoreOffense==scoreOff5 ? -2300.0 : scoreOff5
scoreOff6_2 = scoreOffense==scoreOff6 ? -2300.0 : scoreOff6
scoreOff7_2 = scoreOffense==scoreOff7 ? -2300.0 : scoreOff7
scoreOff8_2 = scoreOffense==scoreOff8 ? -2300.0 : scoreOff8
scoreOff9_2 = scoreOffense==scoreOff9 ? -2300.0 : scoreOff9
scoreOff10_2 = scoreOffense==scoreOff10 ? -2300.0 : scoreOff10
scoreOff11_2 = scoreOffense==scoreOff11 ? -2300.0 : scoreOff11
scoreOff12_2 = scoreOffense==scoreOff12 ? -2300.0 : scoreOff12

// 공격형 자산 중 두번째 최고 모멘텀 스코어
scoreOffense2 = max(scoreOff1_2, scoreOff2_2, scoreOff3_2, scoreOff4_2, scoreOff5_2, scoreOff6_2, max(scoreOff7_2, scoreOff8_2, scoreOff9_2, scoreOff10_2, scoreOff11_2, scoreOff12_2))
 
// 수비형 자산 중 최고 모멘텀 스코어
scoreDefense = max(scoreDef1, scoreDef2, scoreDef3)
 
// 공수 자산의 최근 한달간의 수익률(누적 수익률을 구하기 위함)
yieldOff1 = getYield(off1, 1)
yieldOff2 = getYield(off2, 1)
yieldOff3 = getYield(off3, 1)
yieldOff4 = getYield(off4, 1)
yieldOff5 = getYield(off5, 1)
yieldOff6 = getYield(off6, 1)
yieldOff7 = getYield(off7, 1)
yieldOff8 = getYield(off8, 1)
yieldOff9 = getYield(off9, 1)
yieldOff10 = getYield(off10, 1)
yieldOff11 = getYield(off11, 1)
yieldOff12 = getYield(off12, 1)
yieldDef1 = getYield(def1, 1)
yieldDef2 = getYield(def2, 1)
yieldDef3 = getYield(def3, 1)
 
// 투자 종목별 색상
colorScore = offenseCondition
 ? ((scoreOffense2 == scoreOff1) ? color.maroon : 
 (scoreOffense2 == scoreOff2) ? color.purple : 
 (scoreOffense2 == scoreOff3) ? color.fuchsia : 
 (scoreOffense2 == scoreOff4) ? color.green : 
 (scoreOffense2 == scoreOff5) ? color.lime : 
 (scoreOffense2 == scoreOff6) ? color.olive : 
 (scoreOffense2 == scoreOff7) ? color.yellow : 
 (scoreOffense2 == scoreOff8) ? color.navy : 
 (scoreOffense2 == scoreOff9) ? color.blue : 
 (scoreOffense2 == scoreOff10) ? color.teal : 
 (scoreOffense2 == scoreOff11) ? color.aqua : 
 (scoreOffense2 == scoreOff12) ? color.orange : na)
 : ((scoreDefense == scoreDef1) ? color.black :
 (scoreDefense == scoreDef2) ? color.silver :
 (scoreDefense == scoreDef3) ? color.gray : na)
 
// 월말 투자 종목
nextInvestment = offenseCondition
 ? ((scoreOffense == scoreOff1) ? "S&P500" : 
 (scoreOffense == scoreOff2) ? "러셀2000" : 
 (scoreOffense == scoreOff3) ? "나스닥100" : 
 (scoreOffense == scoreOff4) ? "유럽 주식" : 
 (scoreOffense == scoreOff5) ? "일본 주식" : 
 (scoreOffense == scoreOff6) ? "신흥국 주식" : 
 (scoreOffense == scoreOff7) ? "미국 리츠" : 
 (scoreOffense == scoreOff8) ? "원자재" : 
 (scoreOffense == scoreOff9) ? "금" : 
 (scoreOffense == scoreOff10) ? "미국 장기채" : 
 (scoreOffense == scoreOff11) ? "하이일드 채권" : 
 (scoreOffense == scoreOff12) ? "미국 회사채" : "")
 +" & "+
 ((scoreOffense2 == scoreOff1) ? "S&P500" : 
 (scoreOffense2 == scoreOff2) ? "러셀2000" : 
 (scoreOffense2 == scoreOff3) ? "나스닥100" : 
 (scoreOffense2 == scoreOff4) ? "유럽 주식" : 
 (scoreOffense2 == scoreOff5) ? "일본 주식" : 
 (scoreOffense2 == scoreOff6) ? "신흥국 주식" : 
 (scoreOffense2 == scoreOff7) ? "미국 리츠" : 
 (scoreOffense2 == scoreOff8) ? "원자재" : 
 (scoreOffense2 == scoreOff9) ? "금" : 
 (scoreOffense2 == scoreOff10) ? "미국 장기채" : 
 (scoreOffense2 == scoreOff11) ? "하이일드 채권" : 
 (scoreOffense2 == scoreOff12) ? "미국 회사채" : "")
 : ((scoreDefense == scoreDef1) ? "미국 초단기 국채" :
 (scoreDefense == scoreDef2) ? "미국 중기국채" :
 (scoreDefense == scoreDef3) ? "미국 중기채 레버리지" : "")

// 공수 전환으로 인해 선택된 자산의 월별 수익률
monthYield = (offenseCondition[1]
 ? (((scoreOffense[1] == scoreOff1[1]) ? yieldOff1 : 
 (scoreOffense[1] == scoreOff2[1]) ? yieldOff2 : 
 (scoreOffense[1] == scoreOff3[1]) ? yieldOff3 : 
 (scoreOffense[1] == scoreOff4[1]) ? yieldOff4 : 
 (scoreOffense[1] == scoreOff5[1]) ? yieldOff5 : 
 (scoreOffense[1] == scoreOff6[1]) ? yieldOff6 : 
 (scoreOffense[1] == scoreOff7[1]) ? yieldOff7 : 
 (scoreOffense[1] == scoreOff8[1]) ? yieldOff8 : 
 (scoreOffense[1] == scoreOff9[1]) ? yieldOff9 : 
 (scoreOffense[1] == scoreOff10[1]) ? yieldOff10 : 
 (scoreOffense[1] == scoreOff11[1]) ? yieldOff11 : 
 (scoreOffense[1] == scoreOff12[1]) ? yieldOff12 : 0)
 +
 ((scoreOffense2[1] == scoreOff1[1]) ? yieldOff1 : 
 (scoreOffense2[1] == scoreOff2[1]) ? yieldOff2 : 
 (scoreOffense2[1] == scoreOff3[1]) ? yieldOff3 : 
 (scoreOffense2[1] == scoreOff4[1]) ? yieldOff4 : 
 (scoreOffense2[1] == scoreOff5[1]) ? yieldOff5 : 
 (scoreOffense2[1] == scoreOff6[1]) ? yieldOff6 : 
 (scoreOffense2[1] == scoreOff7[1]) ? yieldOff7 : 
 (scoreOffense2[1] == scoreOff8[1]) ? yieldOff8 : 
 (scoreOffense2[1] == scoreOff9[1]) ? yieldOff9 : 
 (scoreOffense2[1] == scoreOff10[1]) ? yieldOff10 : 
 (scoreOffense2[1] == scoreOff11[1]) ? yieldOff11 : 
 (scoreOffense2[1] == scoreOff12[1]) ? yieldOff12 : 0))
 * 0.5
 : ((scoreDefense[1] == scoreDef1[1]) ? yieldDef1 :
 (scoreDefense[1] == scoreDef2[1]) ? yieldDef2 :
 (scoreDefense[1] == scoreDef3[1]) ? yieldDef3 : 0))
  
// 월별 수익률 누적 결과
var yield = 0.0
yield := testPeriod ? (((1+yield/100) * (1+monthYield/100)) - 1) * 100 : 0.0
 
// 백테스트 기간에만 봉 갯수 세기
var barCount = 0
barCount := barCount + (testPeriod ? 1 : 0)
 
// 연 복리 계산
cagr = (pow(1+yield/100, 1/((barCount)/12))-1)*100
 
// 최고 수익률 계산
var maxYield = 0.0
maxYield := max(maxYield, yield)
 
// 손실폭 계산
var drawdown = 0.0
drawdown := (((1+yield/100)/(1+maxYield/100)) - 1) * 100
 
// 최대 손실폭 계산
var mdd = 0.0
mdd := min(mdd, drawdown)
 
// * * * 출력 * * * //
// 1. 공격 자산의 모멘텀 스코어
plot(scoreOff1, "S&P500", color.maroon, 1, plot.style_stepline)
plot(scoreOff2, "러셀2000", color.purple, 1, plot.style_stepline)
plot(scoreOff3, "나스닥100", color.fuchsia, 1, plot.style_stepline)
plot(scoreOff4, "유럽 주식", color.green, 1, plot.style_stepline)
plot(scoreOff5, "일본 주식", color.lime, 1, plot.style_stepline)
plot(scoreOff6, "신흥국 주식", color.olive, 1, plot.style_stepline)
plot(scoreOff7, "미국 리츠", color.yellow, 1, plot.style_stepline)
plot(scoreOff8, "원자재", color.navy, 1, plot.style_stepline)
plot(scoreOff9, "금", color.blue, 1, plot.style_stepline)
plot(scoreOff10, "미국 장기채", color.teal, 1, plot.style_stepline)
plot(scoreOff11, "하이일드 채권", color.aqua, 1, plot.style_stepline)
plot(scoreOff12, "미국 회사채", color.orange, 1, plot.style_stepline) 
 
// 2. 수비 자산의 모멘텀 스코어
plot(scoreDef1, "미국 초단기 국채", color.black, 1, plot.style_stepline)
plot(scoreDef2, "미국 중기국채", color.silver, 1, plot.style_stepline)
plot(scoreDef3, "미국 중기채 레버리지", color.gray, 1, plot.style_stepline)
 
// 3. 월별 수익률 & 월말 투자 종목
plot(testPeriod and isValue ? monthYield : na, "월별 수익률(%)", colorScore[1], 1, plot.style_columns)
var labelNext = label.new(bar_index, 0, style = label.style_label_lower_left, textalign = text.align_left)
label.set_xy(labelNext, bar_index, 0)
label.set_color(labelNext, colorScore)
label.set_text(labelNext, tostring(month) + "월말 투자 종목 : " + nextInvestment)
 
// 4. 수익률
plot(testPeriod and isValue ? yield : na, "수익률(%)", color.purple)
 
// 5. 연 복리
plot(testPeriod and isValue ? cagr : na, "연 복리(%)", color.green)
 
// 6. 손실폭과 최대 손실폭
plot(testPeriod and isValue ? drawdown : na, "손실폭(%)", color.red)
plot(testPeriod and isValue ? mdd : na, "최대 손실폭(%)", color.orange)

// 7. 카나리아
bgcolor(canary?color.yellow:na, 75, 1)

관련자료

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

+ 최근글


+ 새댓글


통계