묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결파이썬(Python)으로 데이터 기반 주식 퀀트 투자하기 Part2
물타기(매월 일부 투자금액 증액 효과)
좋은 강의 잘들었습니다. 이제서야 거의 완강에 앞두고 있습니다. 수업의 후반부 내용중 7.12 실전투입관련 part1 부분에서 궁금한점이 생겼습니다. 물타기(매월 100달러씩 투자금액을 증액)하는 경우 아래 코드와 같이 반영하는 방법을 제안해주셨는데요.cum_rtn_at_last_month_end = (total_port_cum_rtn_series.iloc[-1] * 0.999) + 100 이렇게 코드를 짜서 실행을 하면 포트폴리오의 개별 종목이나 전체 금액의 추이를 잘 계산해낼 수 있는 것으로 보입니다. 그런데 여기서 구해진 rtn_df 등을 바탕으로 수업에서 계산했던 sharpe ratio나 CAGR을 그대로 구해도 될지에 대한 의문이 생깁니다.매월 말 리밸런싱때 투자금액을 추가한다고 가정하면 시장 상황에 관계없이 매월 말마다 100달러씩이 자동으로 증가하는데 이 부분이 sharpe ratio나 CAGR을 과대평가하는 효과가 생길 수 있다고 생각하기 때문입니다. 혹시 이 부분에 대해 제가 잘못 생각하고 있거나 추가적으로 참고할만한 자료가 있다면 알려주시면 감사하겠습니다.
-
미해결퀀트 투자를 위한 파이썬 트레이딩룸 만들기 - Part 1
StockListing 함수 직접 만들기 (22년 1월 이후 FinanceDataReader의 StockListing 함수 결과값이 달라짐) 강의편에서 크롤링 함수 오류가 납니다.
알려주신대로,def StockListing() : import requests import pandas as pd import json try : from pandas import json_normalize except importError: from pandas.io.json import json_normalize data = {'bld':'dbms/comm/finder/finder_stkisu', 'locale':'ko_KR',} r = requests.post('http://data.krx.co.kr/comm/bldAttendant/getjsondata.cmd', data=data) jo = json.loads(r.text) df = json_normalize(jo,'block1') df_info = df[['short_code', 'codeName']] df_info.columns = ['Symbol','Name'] return df_infodf = StockListing()JSONDecodeError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_3876\2969629370.py in <module> 19 df_info.columns = ['Symbol','Name'] 20 return df_info ---> 21 df = StockListing() ~\AppData\Local\Temp\ipykernel_3876\2969629370.py in StockListing() 13 14 r = requests.post('http://data.krx.co.kr/comm/bldAttendant/getjsondata.cmd', data=data) ---> 15 jo = json.loads(r.text) 16 df = json_normalize(jo,'block1') 17 df_info = df[['short_code', 'codeName']] ~\anaconda3\lib\json\__init__.py in loads(s, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw) 344 parse_int is None and parse_float is None and 345 parse_constant is None and object_pairs_hook is None and not kw): --> 346 return _default_decoder.decode(s) 347 if cls is None: 348 cls = JSONDecoder ~\anaconda3\lib\json\decoder.py in decode(self, s, _w) 335 336 """ --> 337 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 338 end = _w(s, end).end() 339 if end != len(s): ~\anaconda3\lib\json\decoder.py in raw_decode(self, s, idx) 353 obj, end = self.scan_once(s, idx) 354 except StopIteration as err: --> 355 raise JSONDecodeError("Expecting value", s, err.value) from None 356 return obj, end JSONDecodeError: Expecting value: line 16 column 3 (char 36)이런 오류가 나는데, 어떻게 해결해야 할까요?
-
해결됨파이썬 알고리즘 트레이딩 파트1: 알고리즘 트레이딩을 위한 파이썬 데이터 분석
안녕하세요 선생님! 왜 Log를 취해주는지 궁금합니다.
선생님 안녕하세요! 앞에서, 하루 단위의 종목의 ratio같은 경우는 Log를 씌어주지 않았는데, 5분 단위의 data는 왜 log를 씌어주는지 궁금합니다! (scale이 큰것도 아닌데 왜 앞이랑 차이가 나는지 궁금하네요!)
-
해결됨파이썬 알고리즘 트레이딩 파트2: Interactive Brokers API를 활용한 실시간 알고리즘 트레이딩
타임시리즈 데이터 가져오기에서 에러원인이 무엇인가요?
stock-trading-eda-scheduled.ipynb 파일에서데이트 타임을 당겨오면 아래와 같은 에러메세지가 출력됩니다. 어떤 현상인가요?
-
해결됨파이썬 알고리즘 트레이딩 파트2: Interactive Brokers API를 활용한 실시간 알고리즘 트레이딩
환경세팅에서 막히네요....
수업에 업로드된 yml파일로 환경을 복원해도 위와 같은 오류가 나타나서 진도를 못나갑니다.ㅠ PairTrading 임포트도 안되구여...ib_insync 는 개별설치하여 해결했구여...
-
해결됨파이썬 알고리즘 트레이딩 파트2: Interactive Brokers API를 활용한 실시간 알고리즘 트레이딩
api연결하기 영상이 재생이 안되네요
다른강의는 재생이 되는데 api연결하기 영상이 재생이 안됩니다
-
해결됨파이썬 알고리즘 트레이딩 파트1: 알고리즘 트레이딩을 위한 파이썬 데이터 분석
선생님 ㅠㅠ 뭐가 문제일까요 spot검색후.ㅠ
선생님.. 이렇게 떠서 연필모양 클릭이 안되요 ㅠㅠ..뭐가 문제일까요
-
해결됨파이썬 알고리즘 트레이딩 파트1: 알고리즘 트레이딩을 위한 파이썬 데이터 분석
선생님 안녕하세요!.. 오류 문의드립니다.
승인된 LowPriorityCores 할당량을 초과하므로 작업을 완료할 수 없습니다. 추가 세부 정보 - 배포 모델: Resource Manager, 위치: KoreaCentral, 현재 제한: 3, 현재 사용량: 0, 추가 필요: 16, (최소) 새 제한 필요: 16. 할당량이 임계값에 도달할 때 경고를 설정합니다. https://aka.ms/quotamonitoringalerting에서 자세히 알아보세요. 배포가 성공할 수 있도록 '세부 정보' 섹션에 나열된 매개 변수를 지정하여 https://aka.ms/ProdportalCRP/#blade/Microsoft_Azure_Capacity이게.. 저도 클라우딩 컴퓨터가 처음이라 익숙하지가 않는데 ㅠ 이렇게 오류가 뜹니다.. 계정이 유료?로 전환되었는지도 모르겠고요 ㅠㅠ 일단 앞의 강의 에서 spot이게 검색해도 아무것도 뜨지 않아서 지금 강의 부터 진행 하는데 역시 안되네요 ㅠㅠ 뭐가 문제일까요
-
미해결금융데이터 분석을 위한 판다스 활용법
21년 12월 말일 데이터 관련
안녕하세요.21년 12월 마지막 데이터는 28일이지만 이 날짜가 12월 마지막 데이타 라고 생각합니다.그래서 22년 1월 2일 데이터를 더미로 넣는게 좋다고 생각합니다.감사합니다.
-
해결됨파이썬 알고리즘 트레이딩 파트1: 알고리즘 트레이딩을 위한 파이썬 데이터 분석
강의 영상중에 음성이 빨라지더니 몇 초 누락 되는 부분이 있습니다.
안녕하세요 수업 매우 만족하며 듣고 있습니다...강의중에섹션 5. 파이썬으로 페어 트레이딩 백테스팅 시작하기객체지향 trading_summary() 메서드 추가하기수업중 4:14 부터 음성이 빨라지더니 중간 몇 초 누락이 조금 있습니다. 감사합니다...
-
해결됨파이썬 알고리즘 트레이딩 파트1: 알고리즘 트레이딩을 위한 파이썬 데이터 분석
변동성이 너무 크면, 통계적으로 접근하기 어려운 데이터가 되는 이유
안녕하세요 수업 너무 잘 듣고 있습니다.수업중에 "변동성이 너무 크면, 통계적으로 접근하기 어려운 데이터가 된다"는 말씀을 주셨는데 왜 그런지 직관적으로 이해가 되지 않아서 질문드립니다.변동성이 너무 큰 상황에서도 많은 반복을 하면 예상하는 margin을 기대할 수 있는 것이 아닌가 싶은 생각이 들기도 합니다.설명 기다리겠습니다. 감사합니다.
-
해결됨파이썬 알고리즘 트레이딩 파트1: 알고리즘 트레이딩을 위한 파이썬 데이터 분석
Quotas 리스트에 아무것도 나오지 않습니다.
계정을 Paid 계정으로 신용카드로 인증하여 업그레이드 하였는데 계정은 Azure 구독1 으로 설정되어있습니다.설정에 들어가서 기본 구독 필터를 확인해보니 Azure 구독1으로 설정 되어있고 변경 할 수 없게 고정 값으로 되어있습니다.감사합니다...
-
미해결평생 써먹는 데이터 기반 투자법 with 파이썬 퀀트 투자
강의 자료 다운로드
안녕하세요. 파이썬/판다스 입문 관련 자료 이외에 본 강의 자료는 어떻게 다운로드 받을 수 있는지 궁금합니다. 강의에서 사용하신 파일이 따로 있는 것 같은데 어디서 다운로드 해야 할지 찾을 수가 없어서요 ㅜㅜ
-
미해결퀀트 투자를 위한 파이썬 트레이딩룸 만들기 - Part 2
사이트 주소가 나오질 않습니다.
강의 영상 7:00을 보면 제시된 코드를 실행하면 "Running on http://127.0.0.1:8050"가 출력이 되어야 할텐데, 계속 runcell('Section3 Div1', 'C:/Users/user/Downloads/Section3Dash_Div.py')<IPython.lib.display.IFrame at 0x1a139de5010>이것만 출력됩니다.아래 다른 질문글에 대한 답변을 다 시도해봤는데도, 좀처럼 해결이 되지 않습니다. 사용한 코드입니다. dash랑 dash_html_components는 다 설치되어 있는 상태입니다. 코드를 수정하지도 않았습니다. #%% Section3 _ Div1# Dash 모듈 불러오기import dashimport dash_html_components as html# app 객체생성app = dash.Dash()# app 레이아웃 설정app.layout = html.Div([ html.Div(['Div1']), html.Div(['Div2']) ])# app 실행if name=='__main__': app.run_server()
-
해결됨파이썬 알고리즘 트레이딩 파트2: Interactive Brokers API를 활용한 실시간 알고리즘 트레이딩
IBKR Desktop Global Configuration 설정
안녕하세요 강사님 IBKR Desktop 다운로드 이후 api 설정을 해주려고 했는데요 뭔가 버전이 다른 건지 화면이 달라서 어디서 설정을 할 수 있는지가 잘 안보여서 문의드립니다!감사합니다!
-
해결됨파이썬 알고리즘 트레이딩 파트2: Interactive Brokers API를 활용한 실시간 알고리즘 트레이딩
환경설정
yml 파일을 통한 윈도우 환경 셋팅을 진행하였는데 위와 같은 오류가 나옵니다.추가적으로 설치가 필요한 환경이 있으면 정리 부탁드립니다.
-
해결됨파이썬 알고리즘 트레이딩 파트1: 알고리즘 트레이딩을 위한 파이썬 데이터 분석
하이레벨 오버뷰 관점이란 용어 뜻 문의
하이레벨 오버뷰 관점이란 말이 무슨 뜻인지 설명 부탁드립니다.
-
미해결파이썬 알고리즘 트레이딩 파트1: 알고리즘 트레이딩을 위한 파이썬 데이터 분석
Qouta 리스트에 아무것도 안나옵니다.
spot이라고 검색을 하면 머라고 나와야하는데 아무것도 안나옵니다.. 제가 빠트린 작업이 있을까요?
-
해결됨파이썬 알고리즘 트레이딩 파트1: 알고리즘 트레이딩을 위한 파이썬 데이터 분석
하드웨어 용량 사용 승인 요청 거부
안녕하세요. 강의 영상을 보면서 Korea Central 지역에 Quotas 요청을 보냈는데 아래와 같이 나오면서 승인이 안되네요QMS Update - Status: ResourceType: crpCores { Quota Bucket: TotalLowPriorityCores Status Description: Due to very high rates of Spot consumption, Microsoft is unable to approve additional quota at this time State: SpotVMNotAllowedForPayGCustomer Current Quota: 3 New Quota: 16 } Properties: [location, koreacentral] } Korea South 지역에 요청해도 동일하게 되지 않습니다. 어떻게 해야할까요?QMS Update - Status: ResourceType: crpCores { Quota Bucket: TotalLowPriorityCores Status Description: Due to very high rates of Spot consumption, Microsoft is unable to approve additional quota at this time State: SpotVMNotAllowedForPayGCustomer Current Quota: 3 New Quota: 16 } Properties: [location, koreasouth] }
-
미해결평생 써먹는 데이터 기반 투자법 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)