커뮤니티

포트폴리오 매매

프로필 이미지
몬스터
2020-08-18 00:39:32
2328
글번호 225299
답변완료
안녕하세요. 아래의 포트폴리오 매매 전략이 예스랭귀지나 예스스팟으로 구현 가능한지 검토바랍니다. 제 생각에는 예스랭귀지로는 불가능하고 스팟으로만 가능할 것 같은데요... 1. 계좌 총 평가자산 조회 2. 두종목(A종목과 B종목) 70% : 30% 비율로 매수 3. 특정기간(예: 한달)이후 계좌 총 평가자산 조회 : (A종목x수량)+(B종목x수량)+현금 4. 계좌 총 평가자산을 기초로 다시 두종목에 대한 70% : 30% 비율계산 5. 비율 초가분은 매도 청산하고 비율 부족분은 매수 : 리밸런싱 예를들어, 100을 투자자산으로 A종목 70 / B종목 30 매수 진입이후 한달뒤에 총 평가자산이 110으로 A종목 74 / B종목 36 이 되었을때 B종목 3을 매도 청산하고 A종목 3을 매수하여 A종목 77 / B종목 33 으로 매달 리밸런싱하는 전략입니다.
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2020-09-17 17:17:31

안녕하세요 예스스탁입니다. 1 스팟은 저희가 가이드 정도만 작성해 드립니다. 아래식 참고하셔서 수정보완해 사용하시기 바랍니다. 2 모든 주문은 15시에 처리가 되게 작성되었고 주문되면 30일 뒤에 리벨런싱됩니다. 계좌에는 주문날짜가 없습니다. Main.SetUserValue, Main.GetUserValue를 이용해 별도로 내부파일에 적어서 이용하게 작성되었습니다. 4 스크립트 객체설정 계좌객체 추가 --> 속성에서 객체명은 Account1, 주문낼 계좌번호지정 종목객체 추가 --> 속성에서 객체명은 MarketData1, A종목으로 지정 종목객체 추가 --> 속성에서 객체명은 MarketData2, B종목으로 지정 var step,TA,M1,M2,V1,V2,D1,D2; var SID1,SID2; var SNUM1,SNUM2; //스팟 첫 실행시 function Main_OnStart() { var d = new Date(); var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); var JD = dateToJulianNumber(d); var lastJD = Main.GetUserValue("LastJD"); Main.MessageList(YYYYMMDD," : Spot Start :",JD,lastJD); if (lastJD == "" || JD >= lastJD+30) { Main.MessageList("거래일"); Main.SetTimer(1, 5000); step = 0; } else { step = 99; Main.MessageList("거래일 아님"); } } function Main_OnTimer(nEventID) { if (step == 0 && nEventID == 1) { var d = new Date(); var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); var JD = dateToJulianNumber(d); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); Main.MessageList(YYYYMMDD,HHMMSS); if (HHMMSS >= 150000) //15시가 되면 { step = 1; Main.KillTimer(1); //계좌순자산액 TA = Account1.GetBalanceETCinfo(100); //계좌순자산의 70% M1 = TA*0.7; //계좌순자산의 30% M2 = TA*0.3; //MarketData1의 수량*현재가 저장(보유수량이 없으면 0) Account1.SetBalance(MarketData1.code, 0); V1 = Account1.Balance.count*MarketData1.current; //MarketData2의 수량*현재가 저장(보유수량이 없으면 0) Account1.SetBalance(MarketData2.code, 0); V2 = Account1.Balance.count*MarketData1.current; //70%금액과 MarketData1종목 평가금액과의 차 D1 = M1-V1; //30%금액과 MarketData2종목 평가금액과의 차 D2 = M2-V2; S1 = false; if (D1 < 0) { var vol1 = Math.floor(Math.abs(D1)/MarketData1.current); if (vol1 > 0) { SID1 = Account1.OrderSell(MarketData1.code,vol1,MarketData1.Bid(5), 0); } else { S1 = true; } } else { S1 = true; } S2 = false; if (D2 < 0) { var vol2 = Math.floor(Math.abs(D2)/MarketData2.current); if (vol2 > 0) { SID2 = Account2.OrderSell(MarketData2.code,vol2,MarketData2.Bid(5), 0); } else { S2 = true; } } else { S2 = true; } Main.SetTimer(2,1000); } } if (step == 1 && nEventID == 2) { var d = new Date(); var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate(); var JD = dateToJulianNumber(d); if (S1 == true && S2 == true) { step = 2; Main.KillTimer(2); if (D1 > 0) { var vol1 = Math.floor(Math.abs(D1)/MarketData1.current); if (vol1 > 0) { Account1.OrderBuy(MarketData1.code,vol1,MarketData1.Ask(5), 0); } } if (D2 > 0) { var vol2 = Math.floor(Math.abs(D2)/MarketData2.current); if (vol2 > 0) { Account1.OrderBuy(MarketData2.code,vol2,MarketData2.Ask(5), 0); } } Main.SetUserValue("LastJD",JD); } } } function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == SID1) { SNUM1 = OrderResponse.orderNum; } if (OrderResponse.orderID == SID2) { SNUM2 = OrderResponse.orderNum; } } function Main_OnNotifyFill(NotifyFill) { if (NotifyFill.orderNum == SNUM1) { Account1.SetUnfill(SNUM1); if (Account1.Unfill.count == 0) { S1 = true; } } if (NotifyFill.orderNum == SNUM2) { Account1.SetUnfill(SNUM2); if (Account1.Unfill.count == 0) { S2 = true; } } } //날짜를 줄리안데이트로 변경 function dateToJulianNumber(d) { var year = d.getFullYear(); var month = d.getMonth()+1; var day = d.getDate(); var a = Math.floor((14-month)/12); var y = Math.floor(year+4800-a); var m = month+12*a-3; var JDN = day + Math.floor((153*m+2)/5)+(365*y)+Math.floor(y/4)-Math.floor(y/100)+Math.floor(y/400)-32045; return JDN; } 즐거운 하루되세요 > 몬스터 님이 쓴 글입니다. > 제목 : 포트폴리오 매매 > 안녕하세요. 아래의 포트폴리오 매매 전략이 예스랭귀지나 예스스팟으로 구현 가능한지 검토바랍니다. 제 생각에는 예스랭귀지로는 불가능하고 스팟으로만 가능할 것 같은데요... 1. 계좌 총 평가자산 조회 2. 두종목(A종목과 B종목) 70% : 30% 비율로 매수 3. 특정기간(예: 한달)이후 계좌 총 평가자산 조회 : (A종목x수량)+(B종목x수량)+현금 4. 계좌 총 평가자산을 기초로 다시 두종목에 대한 70% : 30% 비율계산 5. 비율 초가분은 매도 청산하고 비율 부족분은 매수 : 리밸런싱 예를들어, 100을 투자자산으로 A종목 70 / B종목 30 매수 진입이후 한달뒤에 총 평가자산이 110으로 A종목 74 / B종목 36 이 되었을때 B종목 3을 매도 청산하고 A종목 3을 매수하여 A종목 77 / B종목 33 으로 매달 리밸런싱하는 전략입니다.