66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
수익률이 맞는지 코드 문의 드립니다.
안녕하세요 수강을 하여 만족스러운 강의를 들었습니다. 개인적으로 궁금한 것을 구현했는데 소스가 맞는지 검증 부탁드려도 될까 합니다. 생각해 본 부분을 짜보긴 했지만 수익률이 잘못 나온 듯하여 오류를 아무리 검증해보려고해도 알 수가 없어서 문의드립니다. 추가로 다른 분에게도 도움이 되길 바라고, 또한 제 코드에서도 최적화 할 부분이 보일 듯하니 조언 부탁드립니다. 강의에서 나온 부분이 많기에 주석과 맥락등은 일부 제거 했습니다. [조건] 종목 TQQQ, SCHDadj_close 값TQQQ RSI<30 : TQQQ 3% 비중 증가 , SCHD 3%비중 감소리밸런싱 5:5 매 반기마다 실행 !apt-get update -qq !pip install yfinance import yfinance as yf import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.font_manager as fm import numpy as np # 수정종가 def getAdjCloseData(ticker, end=None): return yf.download(ticker, period='12y')['Adj Close'] # RSI 데이터 def getRSIData(closeDataSet, periods=""): average_periods = 14 # 이평 초기에 값은 나오지 않기 때문에 더 계산하고 자름 delta = closeDataSet.diff() # closeDataSet - closeDataSet.shift(1) # 변화량 if periods != "": delta = delta.iloc[(periods + average_periods) * -1:] AU = pd.DataFrame(np.where(delta>=0, delta, 0), delta.index, delta.columns) AD = pd.DataFrame(np.where(delta<0, delta.abs(), 0), delta.index, delta.columns) # SMA AU_MA = getSimpleMovingAverage(AU, average_periods) AD_MA = getSimpleMovingAverage(AD, average_periods) rsi = AU_MA / (AU_MA + AD_MA) * 100 # RSI Signal rsiSignal = getSimpleMovingAverage(rsi, 9) if periods != "": rsi = rsi[average_periods:] rsiSignal = rsiSignal[average_periods:] return rsi, rsiSignal # RSI 값에 따른 리밸런싱 날짜 def getRSIRebalancingDate(closeDataSet, RSI = 30): rsi, rsiSignal = getRSIData(closeDataSet) data = rsi.copy() data = pd.DataFrame(data) dataIndex = data[data.iloc[:, 0] <= RSI].index return dataIndex def getWeightByRSI(closeDataSet): RSIrebalancingDate = getRSIRebalancingDate(closeDataSet, 30) # RSI가 30이하일 때 리밸런싱 날짜 rebalancingDate = getRebalancingDate(closeDataSet, 'half') # 동일비중 리밸런싱 할 날짜 rebal = pd.DataFrame([[1/len(closeDataSet.columns)] * len(closeDataSet.columns)] * len(rebalancingDate), index=rebalancingDate, columns=closeDataSet.columns) rebal['period'] = 1 # 기간에 따른 리밸런싱 rsiRebal = pd.DataFrame([[1/len(closeDataSet.columns)] * len(closeDataSet.columns)] * len(RSIrebalancingDate), index=RSIrebalancingDate, columns=closeDataSet.columns) rsiRebal['period'] = 0 # RSI에 따른 리밸런싱 weightDf = pd.concat([rebal, rsiRebal], axis=0) weightDf = weightDf.sort_index() # 리밸런싱 날짜 별 for i in range(1, len(weightDf)): if weightDf.iloc[i]['period'] == 1: # 기간에 따른 리밸런싱 weightDf.iloc[i, weightDf.columns.get_loc("TQQQ")] = weightDf.iloc[0, weightDf.columns.get_loc("TQQQ")] weightDf.iloc[i, weightDf.columns.get_loc("SCHD")] = weightDf.iloc[0, weightDf.columns.get_loc("SCHD")] else: # RSI에 따른 리밸런싱 weightDf.iloc[i, weightDf.columns.get_loc("TQQQ")] = weightDf.iloc[i-1, weightDf.columns.get_loc("TQQQ")] * 1.03 weightDf.iloc[i, weightDf.columns.get_loc("SCHD")] = weightDf.iloc[i-1, weightDf.columns.get_loc("SCHD")] * 0.97 return weightDf def getRSIPortfolioResult(closeDataSet): weight = getWeightByRSI(closeDataSet) weightDf = pd.DataFrame(weight) rebalancingDate = weightDf.index portfolio = pd.DataFrame() # 빈 데이터 프레임 생성 totalAsset = 1 # 총 자산, 초기값 1 start = rebalancingDate[0] # 리밸런싱 날짜, 초기값 첫 투자일 for end in rebalancingDate[1:]: weight = weightDf.loc[start] # 당월 리밸런싱 비율 weight = weight.drop('period') priceData = closeDataSet.loc[start:end] # 당월 가격 데이터 cumReturn = getCumulativeReturn(priceData) # 당월 누적 수익률 weightedCumReturn = weight * cumReturn # 당월 리밸런싱 비율이 반영된 누적 수 netCumReturn = totalAsset * weightedCumReturn # 전월 투자 결과 반영 (이전 블록의 누적 수익을 포함시킴) start = end # start 갱신 totalAsset = netCumReturn.iloc[-1].sum() # 총 자산 갱신 portfolio = pd.concat([portfolio, netCumReturn]) # 매월 데이터 추가 portfolio = portfolio.loc[~portfolio.index.duplicated(keep='last')] # 중복 데이터 제거 portfolioCumulativeReturn = portfolio.sum(axis=1) # 포트폴리오 누적 수익률 portfolioDayReturn = (portfolioCumulativeReturn / portfolioCumulativeReturn.shift(1)).fillna(1) # 포트폴리오 일간 수익률 return portfolioDayReturn, portfolioCumulativeReturn closeDataSet = pd.DataFrame() TQQQ = getAdjCloseData("TQQQ") # TQQQ SCHD = getAdjCloseData("SCHD") # SCHD closeDataSet = pd.concat([TQQQ , SCHD ], axis=1) closeDataSet.columns = asset closeDataSet.dropna(inplace=True) _, rsiCumReturn = getRSIPortfolioResult(closeDataSet) rsiMomentumCAGR, rsiMomentumDD, rsiMomentumMDD = getEvaluation(rsiCumReturn)
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
리밸런싱에서 주기와 가중치 변경시 오류 현상
안녕하세요. 이전 맛집지도 프로젝트부터 이번 강의까지 재미있게 수강하고 있습니다. 다음 강좌도 재미있는 콘텐츠 내주시면 수강하려고 합니다.다름이 아니라, [2-5. 리밸런싱 기법]에서 강의에서는 weight를 1:1로 설정하고, Month 단위 리밸런싱만 다루는데요. 리밸런싱 주기를 quarter 또는 year로 하고 가중치를 달리 먹이면 오류가 발생합니다.closeDateSet의 날짜와 rebalancingDate의 날짜가 일치하지 않기 때문인 것 같은데요. 나름대로 열심히 손대봐도 답을 못찾아서 도움을 부탁드립니다. weight를 어떻게 집어 넣는지 다뤄주시면 좋을 것 같습니다. 감사합니다.# 데이터 로드 stockETF = getCloseData("SPY", "2002", "2022-6-17") # 주식 ETF bondETF = getCloseData("IEF", "2002", "2022-6-17") # 채권 ETF # kodex200 = 069500 # kodex10Bond = 152380 # S&P500 = SPY # 미국 7-10 국채 = IEF closeDataSet = pd.concat([stockETF, bondETF], axis=1) closeDataSet.columns = ['stockETF', 'bondETF'] closeDataSet.dropna(inplace=True) closeDataSet # 종목의 상장일을 기준으로 리밸런싱 날짜 선별 # rebalancingDate = getRebalancingDate(closeDataSet) rebalancingDate = getRebalancingDate(closeDataSet, "quarter") rebalancingDate # 리밸런싱 날짜에 맞춰서 가중치 설정 weightSet1 = pd.DataFrame({ 'stockETF': [0.7] * len(rebalancingDate), 'bondETF': [0.3] * len(rebalancingDate) }, index=rebalancingDate) # 모든 리밸런싱 날짜에 대한 가중치 지정 rebalPortfolioDayReturn, rebalPortfolioCumulativeReturn = getRebalancingPortfolioResult(closeDataSet, weightDf=weightSet1)
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
리밸런싱 포트폴리오 구현 원리 질문있습니다.
안녕하세요.리밸런싱 포트폴리오 구현 원리에서 리밸런싱 일자(노란색) 비중을 리밸런싱 기간이 아닌 모든 행에 곱해주면 곱하는 날 모두 리밸런싱이 적용되는 것이 아닌가요? 리밸런싱 일자에만 비중을 곱해주고 나머지는 그대로 누적수익률을 구해야하는 것이 아닌지 이해가 잘 가지 않아서 질문드립니다.
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
FAA 전략에서 상관성
안녕하세요 강좌를 듣던중 궁금증이 생겨서 글 남깁니다.FAA 전략을 보면 상관성이 낮은 종목들의 순위를 높게 주려는거 같은데요.해당 수치를 계산할때 합산을 해버리면 '상관성이 낮다'의 의미는 아닌거 같습니다.abs나 **2 해서 합산을 하고 그 수치가 작은 것이 자산간의 상관관계가 낮은게 아닌가 생각됩니다.예를 들어 1과 -1 은 둘다 상관관계는 높습니다.
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
일별 수익률 계산 시
일별 수익률 계산시pct_change() 가 아닌 (종가 / 전일종가)로 하는 이유가 무엇인가요?pct_change()로 하면 (종가 - 전일종가)/전일종가 로 계산되어 이해가 가는데 종가/전일종가로 하는 이유를 잘 모르겠습니다 ㅠㅠ
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
분산투자 중 다수종목수익률계산방법 질문
섹션1 분산투자 : 다수종목수익률계산방법 수업 중 뒤쪽 그래프 작성에서 이해가 안가는 부분이 있어 질문 드립니다. plt.figure(figsize=(20, 8))cumReturn[stock].plot()portCumReturn.plot(label = "porfolio", linestyle="dotted", linewidth=3)이렇게만 하면 표가 제대로 안나오더라구요.. plt.figure(figsize=(20, 8))for stock in cumReturn.columns: cumReturn[stock].plot()portCumReturn.plot(label = "porfolio", linestyle="dotted", linewidth=3) 저기서 왜 for 구문을 사용하는 것에 대해서 잘 모르겠습니다ㅠㅠㅠ
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
퍼포먼스 지표로 샤프지수와 표준편차
안녕하세요 강사님목소리가 좋으셔서 듣기편한거 같네요. 아직 완강은 하지 못했지만요..퍼포먼스 지표로 샤프지수와 표준편차도 있으면 좋을거 같은데. 본 강의에선 없어서 좀 아쉽네요혹시 구할려면 어떻게 해야하는지 알려주실수 있나요?
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
강의 직접 관련은 아니지만 재무제표 크롤링 관련
안녕하세요^^강의 내용에 직접적인 관련은 없지만...마땅히 질문할데가 없어 여기 남겨봅니다!저는 가격 뿐 아니라 재무제표도 활용하고 싶어서요..데이터 수집 방법은 크롤링이든 수작업이든 한다고 치고.. 엑셀로 저장만 되어있으면 처리는 강의 내용 참고해서 하면 될거 같은데요..과거 데이터에서 상장기업 목록이 조금씩 다를거 같은데 (상폐, 신규상장 등)백테스트를 할때 해마다 그 해에 상장된 기업에 대해 분석해야 하는거죠?보통 dart api 사용해서 크롤링 하는듯 한데 그럼 비상장까지 다 가져오는거 같고.. 기간도 15년 이후부터 제공한다던데.. 그 이전 데이터, 그리고 그 해 상장 기업만 재무제표 수집을 하고 싶은데 이 부분에 대한 조언을 해주실수 있을까요?
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
2-5 리밸런싱 기법 강의자료 오류 질문
안녕하세요2-5 리밸런싱 기법에서 실전데이터 적용할때 getCloseData 함수 활용해서 spy와 ief 데이터 불러오는 부분이 오류가 발생합니다.
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
No module named 'FinanceDataReader' 이거 어떻게 해결하나요?
위처럼 뜹니다 ㅠ ㅠ
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
동일비중인경우 포트 일별수익률
동일비중 포트에서 일별수익률을 구하는 방법저는 처음에 아래 처럼 생각했는데, 그래프의 그림은 맞지만 스케일이 틀리게 나오더라고요. 어떤 통계적오류를 범했는지 잘 파악이 안되어서 질문드려요!1) 개별 종목들을 동일비중으로 매수할때, (리밸런싱이 없이)개별종목의 일별수익률의 산술평균이 포트의 일별수익률임이 성립할까요?
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
강의 내에 파이썬 버전과 패키지들 버전이 어떻게 되나요?
강의에 맞는 가상환경을 만들려는데파이썬 버전, 기타 패키지들의 버전은 어떻게 되나요?혹시 패키지 목록을 requirements.txt로 만들어주실 수 있을까요?
- 미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
수업자료 관련
수업자료가 다운로드시 제대로 보이지 않네요~