● 현자는 자문자답한다고 했던가
나는 아직 현자가 아니었다. 이게 맨땅에 chatgpt형님에게 질문을 너무 크게 갖다 박으니까 코딩 수정도 힘들고 뭔가 빛인 것 같았는데, 약간 그래도 답답한게 많았다. 뭘 물어봐야하는지 모르니까
내 스스로 코딩 처음 시작한 코린이라는 사실을 다시 자각하고 책 한개의 커리큘럼을 따라가보기로 하였다. 파이썬 생 기초부터 하면 재미없으니까 최종 목적인 백테스팅, 포트폴리오, 퀀트에 부합하는 책을 가지고 이것 저것 따라가보자! 선택한 책은 일단 이거다.
● 일단 구글 코랩에 들어가보자.
구글 코랩은 웹에서 파이썬을 동작시킬 수 있는 서비스라고 한다.
https://colab.research.google.com/
설명 영상을 보니 data 정렬에 대한 자체적인 UI도 제공하고, RUN했던 이력에 대ㅇ해 저장도 되고, google drive에 넣어놓고 공간제약 상관없이 내ㅑ가 작성한 코드에 대해 접근할 수 있고, UI메뉴에 대한 옵션이 Command Palette로 검색해서 찾을 수도 있고 사용자 친화적인 코딩 편집기 인 것 같다.
https://www.youtube.com/watch?v=rNgswRZ2C1Y
● 기초 다뤄보기
UI는 이렇게 생겼다. MS visual studio와는 다르게 한 가지 창으로 구성되어 있으며 만약에 quandl같은 패키지를 설치하려면 !를 치고 명령어를 입력하면된다.
!pip install quandl
그러면 이런식으로 내 컴퓨터에는 깔려있다고 표시가 된다. 책에있는 거의 모든 내용은 아래 깃허브에 수록되어 있으며, 책을 보면서 몰랐던 기본적인 내용을 한 두개씩 적어보자.
- 데이터 객체
몰랐던 내용이 있었다. Matlab을 사용했었다 보니 배열에서 파이썬과 약간 다른점이 있었따. a=[] 를 리스트라고 통칭하는 것 같다. 이때, a=[1,2,3,4,5] 라고 하면 a라는 방에다가 1,2,3,4,5 를 나열해서 저장하는 것은 똑같지만,
a=[1,2,3] + [6,5,4] 라고 하면 매트랩은 각 성분끼리 더하게 되는데, 파이썬은 [1,2,3,6,5,4]라는 배열이 만들어 진다고 한다.
a=[1,2,3] * 2 도 마찬가지로 [1,2,3,1,2,3] 이렇게 만들어진다고 한다.
- 튜플과 딕셔너리
리스트는 [ ] , 튜플은 ( ), 딕셔너리는 { } 를 사용한다. 튜플은 변경이 불가능하다. 딕셔너리는 key와 value값 2개를 매칭해서 사용한다.
프로그램이 실행되는 동안 배열이 깨지지 않아야 하는 목록이 있으면 튜플을 사용하고, 인덱스가 아닌 a[1], a[3] 이런식으로 주소를 호출하는게 아닌, key로서 값을 제어할 때 유리하다고 한다. a = { 'one':1, 'two':2 } 이런식으로 구성되면 딕셔너리다.
- 들여쓰기
파이썬에서는 들여쓰기를 하지 않으면, 오류로 인식된다. 피보나치 수열을 만든다고 했을때, def 밑에 몇 줄 들여서 시작하고 while을치고도 그 밑에 while문에서는 몇 개 들여서 시작이 된다. 저걸 무시하면 에러가 뜬다.
def fib(n):
a,b = 0,1
while a<n:
print(a,end='')
a,b=b,a+b
print()
fib(10)
- NPV와 IRR
NPV는 Net present Value, IRR은 Internal Rate of Return의 약자로써 각각 순현재가치와 내부수익률을 의미한다. 둘다 모두 현금흐름을 할인하는 방법이다.
1) NPV = Sum ( 현금흐름 / (1+할인율)^기간)
현재의 액면가를 나타내는 현금흐름의 순 가치이다. 돈의 시간 가치로 인해 오늘 돈을 받는 것이 내일 돈을 받는 것 보다 가치가 높다. NPV는 미래에 발생할 일련의 현금흐름을 현재가치로 계산한 것이다.
예를 들어 -70,000만원을 사용해야하는데, 1년부터 5년까지 들어오는 현금흐름이 12,000 / 15,000 / 18,000 / 21,000 / 26,000 만원이다. 그랬을 때, 이걸 다 합쳤는데 0 이하면 사업해도 손해인 것이다.
cashflows = [12000,15000,18000,21000,26000]
i=0
r=0.015
npv=-70000
for c in cashflows:
i=i+1
npv = npv + c/(1+r)**i
print(npv)
출력된 값은 17516.929512135568으로 타장한 사업이라고 할 수 있다. n년차 현금 / (1+이율)^n년 으로 나누어 이 현금을 지금의 가치로 환산하는 할인율 개념이다.
금리가 오르면 분모가 커지기 때문에, 미래에 벌어들일 돈은 같아도 그 돈을 현재로 환산했을 때 가치가 떨어진다. 그래서 금리가 오르면 PER가 높은, 아직 돈을 많이 벌지 못하는 미래에 돈을 많이 벌 것으로 예상되는 성장기술주들의 주가가 곤두박질 치는 것이다. 왜냐면 그 미래에 벌 일정한 액수의 돈을 현재가치로 환산하면 그 가치가 금리가 오를 수록 떨어지기 때문이다.
2) IRR
현재 시점의 가치를 미래시점의 가치로 환산하면 이를 '수익률' 위에 설명한 것과 관계있는 것처럼 미래시점의 가치를 현재 시점의 가치로 환산하면 '할인율'이다. IRR은 NPV를 0으로 만드는 값이다. IRR이 시장이자율보다 높으면 그 사업을 채택하고 IRR이 시장이자율보다 낮으면 그냥 그 돈 쓰지말고 은행에 넣어두면 그게 더 이득인 셈이 된다. (이것만 가지고 결정하지는 않지만..)
이 IRR을 실제로 구한다면 수치해석을 해야한다. 왜냐면 지수 함수가 있으니까.. ^^;; 근데 우리는 뭐가 있다? 모듈이 있다.
import scipy as sp
# 현금흐름을 cashflows 리스트에 저장
cashflows = [ -70000, 12000 , 15000 , 18000 , 21000 , 26000 ]
# scipy 라이브러리의 irr함수를 사용하여 내부수익률을 계산
irr = sp.irr(cashflows)
# 구한 IRR을 npv의 할인율로 사용하여 NPV를 구한다. 정확하다면 NPV는 0이다
npv = sp.npv(irr, cashflows)
# 결과를 출력한다. 결과는 문자열의 서식기능을 이용한다
print('IRR {0:.1%} makes NPV {1:.2f} '.format(irr,npv))
근데, irr함수가 에러가 나네? 뭔가 .. 잘못된 것 같지만 일단 넘어간다. 나머지는 대학교때 배운 통계지식들 이므로 Pass하도록 하겠다! 2장에서 보자 ~
여기서 책 내용의 거의 대다수를 확인할 수 있다.
https://www.gilbut.co.kr/main/index
출판사 길벗 사이트
https://github.com/gilbutITbook/080227
책 소스 예제
저자 깃허브
https://thebook.io/080227/ch01/03/
'미래걱정 > 주식' 카테고리의 다른 글
파이썬으로 배우는 포트폴리오 2장 (투자와 자산배분) (2) | 2023.02.06 |
---|---|
Python의 Quandl을 사용하여 간단한 백 테스팅 프로그램 의뢰하기, 50일 이동평균선 200일 이동평균선 골드크로스 데드크로스 전략 (w (0) | 2023.01.31 |
Python의 Quandl을 통해 주가 그래프 그려보기 (with Chat GPT) (0) | 2023.01.28 |
S&P500 그래프와 장단기금리차의 그래프를 같이 그려보자 (with Chat gpt, ax1.twinx) - 2 (0) | 2023.01.27 |
yfinance로 주가 저장 및 크롤링하기, csv저장, 그래프 그리기 등 (with chat gpt) (0) | 2023.01.26 |
댓글