분류
공개스크립트
DAA 전략 백테스트
페이지 정보
조회
38,656
본문
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)
관련자료
등록된 댓글이 없습니다.