다양한 수익률 개념에 대해 알아보자

 

1. 단순 수익률

단순 수익률은 투자금액이 투입된 시점을 고려하지 않고 기말평가때 단순하게 한 번에 계산하는 방법이다.

 

수익률이란 기본적으로 수익금액/투자금액 - 1.0 으로 계산된다. 즉, 100만원 투자해서 200만원이 되었으면 $200(수익금액) / 100(투자금액) - 1.0 = 1.0 = 100\%$ 요렇게 계산하는 것

 

수익금액은 좀 더 정확하게 기말평가금액이라고 표현할 수 있다.

수익률 = 기말평가금액/투자금액 - 1.0

위에서 기말이란 평가기간말이란 의미이다. 

연간수익률이면 연말, 월간수익률이면 월말시점이 되겠다.

 

 

예를 들어 연간수익률을 계산한다고 하고, 1월1일에 50만원 5월3일에 추가로 50만원을 투자하고 연말에 200만원이 되었으면 $200 / (50 + 50) - 1.0 = 1.0 = 100\%$ 이렇게 계산

 

2. 평잔수익률

위 단순 수익률의 문제점은 무엇일까?

투자시점을 고려하지 않은 계산이다보니, 수익률이 왜곡될 수 있다.

예를 들어서 1월1일에 100만원을 투자하여 12월30일에 200만원이 되었으면 단순수익률로 수익률은 100%이다.

그런데 마지막 날인 12월31일에 100만원을 추가로 투입했다고 해보자, 그러면 $300/(100+100) - 1.0 = 50\%$가 되어 갑자기 수익률이 50%가 되어버린다.

금융회사에서 수익률에 따라 수수료를 받는다면 이런장난(?)을 허용하면 안될 것이다.

 

이를 회피할 수 있는 방법은 무엇일까?

바로 날짜별 잔고의 평균값을 투자금액으로 사용하자는 아이디어가 있을 수 있다.

예를 들어 위의 예의 경우는 1년 365일중 363일은 잔고(투자금액)가 100만원 이었다가 12월30일에 200만원이 되고, 12월31일에 추가 100만원 투입으로 300만원이 되었으므로, 평균잔고는

$(100*363+200*1+300*1)/365 = 100.82$가 되어 수익률은 $300 / 100.82 - 1.0 = 1.97 = 197\%$가 될것이고, 고객에게 불리한 결과이므로 위의 장난(?)이 통하지 않는 공정한 계산이 되었다.

 

평잔수익률 = 기말평가금액/평균잔고 - 1.0

 

 

3. 누적수익률(=시간가중수익률)과 평균수익률

자 위의 방법으로 수익률 까지는 구했다. 그런데 여러해 투자가 반복되다보면 수년간에 걸친 평균수익률이 궁금하게 될 것이다.

예를들어 첫해는 수익률이 20%이고 다음해는 30% 였으면 평균 수익률은 $(20 + 30) / 2 = 25\%$가 될까?

단순히 산술평균을 내면 그렇다. 하지만 다음 예제를 보자.

 

첫해는 100%수익을 올렸고, 다음해는 -100% 수익을 올렸다(-100%란 가진돈을 모두 잃는걸 의미한다)

그렇다면 평균수익률은 $(100-100)/2=0\%$라고 해야할까?

뭔가 이상하다.. 왜냐하면 일반적으로 0%수익률이면 본전치기를 의미하는데 지금 내 수중에 남은 돈은 하나도 없기 때문이다.(두번째 해에 모든걸 잃었기 때문)

 

이렇게 이상한 값이 나오는 이유는 산술평균을 썼기 때문이며 기하평균을 사용하면 이 문제는 해결된다.

위 예제를 다시 살펴보자.

 

첫해 100%수익, 다음해 -100%수익이면 누적수익률은 다음 공식에 따라 $(1.0 + 1.0) \times (1.0 - 1.0) - 1.0 = -1.0 = -100\%$가 된다.

(산술평균을 사용할때와 다르게 누적평균을 사용할때는 더하는게 아니라 곱한다)

 

누적수익률 = (1.0 + 첫해수익률) x (1.0 + 둘째해수익률) x ... x (1.0 + 마지막해수익률) - 1.0

= (1+R1) * (1+R2) * (1+R3)* ... (1+Rn) - 1

결과를 보면 나는 땡전한푼 없는데 누적수익률이 -100%로 나왔으므로 make sense 하다.

 

다른 예를 살펴보자

3년간 수익률이 10%증가 > 20%증가 > 15% 감소라고 한다면 누적수익률은 $1.1 \times 1.2 \times 0.85 -1 = 0.122 (12.2\% 수익)$이 된다.

그런데 기하평균을 해보면 $\sqrt[3]{ 1.1 \times 1.2 \times 0.85} \approx 1.0391..$이고 의미를 따져보면 연평균 3.91% 증가했다는게 된다.

검증삼아 1.0391 x 1.0391 x 1.0391 - 1 해보면 0.122가 다시 나온다.. 과연 ㅎㅎ

 

그렇다면 평균수익률을 계산하는데 있어 산술평균보다 기하평균이 더 적합한 이유는 무엇일까?

이는 기본적으로 수익률이 비대칭이란 점을 생각해보면 힌트를 얻을 수 있다.

즉, 100%를 넘는 1000%수익률이라는 것은 있을 수 있지만 (100만원을 투자해서 1,100만원이 되면 1,000%수익률이다.),

-100%를 넘어 -1000%수익률(-1000%손해)이라는 것은 존재할 수 없다. 가진돈을 다 잃는 것이 바로 -100%수익률인데 어찌 더 떨어질 수 있으랴.

 

심화학습: 산술평균과 기하평균의 비교

2회의 투자를 했는데 한 번은 900%의 이익을 보고 한 번은 90% 손실을 보았다고 하자. 

 
이 2회의 투자가 동시에 일어났다면 평균 수익률은 ${(900 + (-90)) \over 2} = 405\%$이다. 
차례로 일어났다면 평균 수익률은 $\sqrt\ = 94.8\%$ 이다. 
 
산술평균은 모든 투자가 동시에 이루어질 경우의 수익이므로 대개 과대평가된다. 
기하평균은 모든 투자가 순차적으로 이루어지는 경우의 식이므로 대개 실제보다는 좀 과소 평가된다. 
 
대부분의 투자는 이 두가지 성질이 섞여 있어 실제 수익은 대개 산술평균과 기하평균 사이 어딘가에 위치한다. 
 
주의할점:
 
반드시 순차투자라고 해서 무조건 기하평균이 적용되는 것은 아니다. 
자산의 일정비율을 항시 투자하는 정률배팅의 경우는 적용되지만.. 
항상 100만원을 투자한다는 식의 정액배팅이 되면 순차적이더라도 산술평균이 적용된다!
 

 

4. 금액가중수익률

TBD

 

반응형

'재무 금융' 카테고리의 다른 글

위험조정수익률(risk-adjusted return)  (0) 2018.01.26
z-score, Sharpe's ratio(샤프 비율)  (0) 2018.01.25
선물  (0) 2018.01.21
미국 Ticker Symbol 시스템 정리  (0) 2017.12.12
펀드 이해하기  (0) 2017.11.24

다음의 문제를 생각해보자.

배열이 하나 주어진다.

{3, -2, 5, 7, -3, 1}


이 때 이 배열의 일부 원소를 더해서 0이 되는 경우가 있는지 알아내는 프로그램을 작성한다고 해보자.

위 배열에 대한 답은 True이다 {-2, 5, -3}을 부분집합으로 취해 더하면 0을 만드는 것이 가능하기 때문이다.


subset sum 문제는 NP-complete 문제중 가장 단순한 형태로서, brute-force 이외에 P솔루션이 존재하지 않는다.

brute-force의 시간 복잡도는 모든 부분집합을 구해서 더해보는 것이기 때문에 $O(2^n)$이 된다.

다만, dynamic-programming을 쓸 경우, 반복계산을 cache하는 방법으로 수행속도를 빠르게 할 수 있으나 바로 그 cache한다는 속성 때문에 n의 범위가 커지면 메모리 초과로 쓸 수 없다.



오늘은 subset sum문제를 푸는 세 가지 방법을 검토해보자.


첫번째 방법은 재귀를 이용해서 푸는 방법이다.

bool go(vector<int>&v, int ix, int cur_sum, int count)
{
    if(ix==(int)v.size())
    {
        if(cur_sum==0&&count>0) return true;
        return false;
    }
    bool r1 = go(v, ix+1, cur_sum+v[ix], count+1);
    bool r2 = go(v, ix+1, cur_sum, count);
    return r1 || r2;
}

bool recursive(vector<int>& v)
{
    return go(v, 0, 0, 0);
}



두번째 방법은 binary operation을 사용해 재귀없이 loop 로 푸는 방법이다.

bool naive(vector<int>& v)
{
    int n = (int)v.size();
    for(int i=1;i<(1<<n);i++)
    {
        int s = 0;
        for(int j=0;j<n;j++) if((1<<j)&i) s+=v[j];
        if(s==0) return true;
    }
    return false;
}


위 두 가지방법은 시간 복잡도가 $O(2^n)$이기 때문에 n이 20만 넘어도 너무 느려져서 쓸 수 없게 된다.


다음 세번째 방법은 dynamic programming(이하 dp)을 사용해서 푸는 방법이다.

bool dp(vector<int>& v)
{
    map<int, bool> m, m2;
    for(int i=0;i<(int)v.size();i++)
    {
        m2 = m;
        for(auto it=m.begin();it!=m.end();it++)
        {
            m2[it->first + v[i]] = true;
        }
        m2[v[i]] = true;
        m = m2;
    }
    if (m[0]) return true;
    return false;

}


위의 세번째 방법은 n의 범위가 너무 크지 않은 경우 상당히 빠른시간을 보장한다($O(n \times m)$)

m은 n의 범위(최대값)이 되겠다. 최대값이 작은 경우는 다항시간에 가까운 실행시간을 보장한다.


testcase를 포함한 전체 소스코드는 다음과 같다.


반응형

참고사항: python3.3부터는 venv를 공식지원하므로 가능하면 venv사용을 먼저 고려하는게 좋음

 

virtual environment가 필요한 이유

이거 없으면, 한 PC에서 여러프로젝트 운영할려고 할때 꼬임

프로젝트마다 python2, python3사용여부가 다르거나, 필요한 라이브러리 버전이 다르거나 할 때, 

여러개의 파이썬 프로젝트가 하나의 컴퓨터에서 충동을 일으키지 않고 존재할 수 있도록 도와줌

 

virtual environment 동작 원리

여기서 환경이란 파이썬 프로그램을 실행시키는데 필요한 모든것의 복사본을 가지고 있는 단순한 폴더입니다. 

전체 파이썬 스탠다드 라이브러리 복사본, pip 설치 프로그램 복사본, 그리고 site-packages 복사본 등을 포함. 

pip install을 사용하면, virtualenv 폴더 내부의 site-packages 폴더에 이를 설치합니다. 

 

virtualenv 설치하기

# sudo pip3 install virtualenv virtualenvwrapper

pip와 virtualenv는 일반적으로 글로벌 설치가 되어야하는 유일한 패키지입니다. 

이 두개를 설치하고 나면 나머지 패키지들은 가상 환경에 설치하면 되기 때문입니다.

virtualenvwrapper는 virtualenv를 사용하기 쉽게 만들어주는 추가 툴이라고 보면 됨

 

virtualenvwrapper를 위한 추가 설정

여기가 약간 골때림 1회성작업이긴 하지만, ~/.bashrc에 다음 5줄을 추가해주고 source ~/.bashrc해줘야 mkvirtualenv 커맨드가 먹음

virtualenvwrapper를 사용하지 않아도 가상환경사용은 가능하지만, 사용하기 직관적이지 않아 비추

 

export WORKON_HOME=~/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh
export VIRTUALENVWRAPPER_ENV_BIN_DIR=bin

 

위 과정에서 no module named virtualenvwrapper 라는 오류가 나면 위의 sudo pip3 를 sudo pip로 해서 다시해본다.

혹은 sudo ln -sf /usr/bin/python3 /usr/bin/python 으로 기본 python 버전을 2에서 3으로 바꿔준다.

python3를 사용하는 virtual environment 만들기

프로젝트 루트 폴더(예를 들면 ~/workspace)로 이동후 아래처럼 하면 python3를 기본으로 하는 env라는 이름의 virtual environment가 만들어 진다.

# mkvirtualenv -p python3 env_name

이렇게 하면 ~/.virtualenv/env_name 여기에 환경이 만들어진다.

지울때는 rmvirtualenv env_name 하면 된다.

 

 

virtual environment에 진입하기

# workon env_name (coin) #

빠져 나올때는 deactivate 하면 된다.

 

requirements.txt관련해서는 여기참조

 

numpy에러나면 다음 명령어 수행(라즈베리파이의 경우)

sudo apt-get install libatlas-base-dev

 

반응형

'Programming > Python' 카테고리의 다른 글

Anaconda & Jupyter  (0) 2018.03.23
python numpy  (0) 2018.02.28
python에서 doxygen 사용해보기  (0) 2017.11.14
python import  (0) 2017.11.14
python 시간관련 함수  (0) 2017.10.31

mac에서 올ㅋ사전의 편리함에 감탄하고 있던중, 윈도우에서도 그 편리함을 느끼고 싶어서 검색해봤다.


일단 크롬 브라우저에서 사전 이용은 네이버사전 확장프로그램이 좋긴한데 직접 타이핑으로 입력할때 결과가 안뜨는 치명적인 버그가 상당히 오랬동안 고쳐지지 않고 있다.


바로 다음과 같은 현상..


확인해 보니 LINGOES사전이 가장 편리한 것을 확인할 수 있었다.
설치 과정은 여기, 여기를 참고했다.

사용하는 방법은 언제든지 미니사전 팝업이 필요하면 Ctrl+Alt+L을 누르면 된다.
그러면 다음처럼 팝업사전이 뜬다. (최고다!)

위 기능이외에도 Ctrl+우클릭을 하면 현재 커서위치에 있는 단어를 검색해준다.
단, 크롬에서는 기본적으로 안되는데 크롬에서도 사용하려면 다음 extension을 깔아야 한다.

반응형

'utility' 카테고리의 다른 글

텔레그램 봇생성  (0) 2021.06.19

머릿말

doxygen을 사용하면, 프로젝트의 전반적인 내용을 파악할 수 있는 document가 자동 생성된다.

doxygen을 오랜만에 사용해보고, 게다가 c/c++ 프로젝트가 아닌 python project에 사용해보는건 처음이라 그 과정을 적어본다.

전체 과정은 https://www.stack.nl/~dimitri/doxygen/manual/starting.html 이곳을 참조했다


독시젠 설치

먼저 doxygen을 설치하자, 


CentOS면 sudo yum install doxygen

Ubuntu면 sudo apt-get install doxygen

macOS면 brew install doxygen

이런식으로 간단하게 설치가 가능하다.


독시젠 configuration

독세젠을 돌리려면 먼저 configuration file을 만들어야 한다.


doxygen -g 라고 하면 Doxyfile 이라는 configuration 파일이 만들어진다. (에디터로 열어서 수정 가능하다)


주의할점: Doxyfile을 열어서 EXTRACT_ALL = NO를 YES로 변경해야 결과가 제대로 나온다.

(If the EXTRACT_ALL option is set to NO in the configuration file (the default), then doxygen will only generate documentation for documentedentities.)


독시젠 돌리기

간단하게

doxygen 이라고만 하면 자동으로 결과가 생성된다.


독시젠 생성 결과물 보기

html/index.html을 열어보면 결과를 확인할 수 있다.


여기까지만 해도 좋지만, graphviz를 설치하여 call graph를 추가하고, 여러가지 추가 옵션을 줘보자.


결과에 call graph 추가




위와 같은 call graph를 결과물에 포함시키기 위해서는, 먼저 graphviz라는 툴을 설치해야한다.

macOS의 경우 brew install graphviz로 설치 가능하다.


그다음 Doxyfile을 다시 열어서 아래 내용을 수정해준다.


-그래프 설정
CALL_GRAPH             = YES
CALLER_GRAPH           = YES


- Graphviz 바이너리 위치 설정
DOT_PATH               = /usr/bin/graphml2gv
HAVE_DOT               = YES

(위 graphml2gv 경로설정은 which graphml2gv 명령어를 통해서 확인한 다음에 넣으면 된다.)

- 클래스 상속 구조 포함
CLASS_DIAGRAMS          = YES

- 그래프를 text가 아니라 그래픽 버전으로 보여줌
GRAPHICAL_HIERARCHY     = YES 


- 대상 폴더의 하위 폴더도 대상으로 지정
RECURSIVE              = YES

- 생성되는 doc 파일이 많아지므로 하위폴더 생성
CREATE_SUBDIRS         = YES

- 문서에 구현 소스도 포함
INLINE_SOURCES         = YES

- 문서에 소스파일 추가 (Files에서 조회 가능)
SOURCE_BROWSER         = YES


(위 내용은 http://heavensbus.blogspot.kr/2014/07/doxygen-call-caller.html 이곳을 참조했습니다.)


반응형

'Programming > Python' 카테고리의 다른 글

Anaconda & Jupyter  (0) 2018.03.23
python numpy  (0) 2018.02.28
python virtualenv 가상환경  (0) 2017.11.16
python import  (0) 2017.11.14
python 시간관련 함수  (0) 2017.10.31

여러 글들을 검색해 보았지만, 맥-크롬 환경에서 클립보드에 복사한 이미지를 바로 편집창에 붙여넣기 하는 방법은 내 경우엔 잘 안되었다.

보통 크롬의 경우 screenshot 크롬 확장 프로그램을 통해서 복사하는 방법이 많이 검색되는데, 내 경우엔 맥이라 그런지 동작하지 않았다.


그러다가 우연히 evernote에 붙여넣은 다음에 이걸 다시 붙여넣기 해봤는데 이 경우는 잘 되는 것을 발견했다.


먼저 원하는 이미지 또는 화면 영역을 mac clipboard에 복사한다.

(* Command + Shift +  Control + 4 단축키로 일부 영영을 캡처하면 이미지가 파일로 남지 않고 클립보드에 임시 저장되고 이미지 편집 프로그램이나 워드 프로세서에 바로 붙여넣을 수 있습니다.)


그 다음 evernote에 붙여넣기를 하면 다음처럼 붙여넣기가 된다.



그다음 이미지를 포함한 영역을 잡은다음에 복사하기 단축키를 누른다.(command-C)



이 때 주의할 점은 그냥 이미지에 우클릭해서 이미지복사나 복사를 클릭하면 안되고, 반드시 영역을 지정해서 복사해야한다는 점이다.

영역을 지정해서 복사하기 단축키를 눌렀으면, 티스토리 편집창으로 돌아와서 붙여넣기를 하면 된다.(command-V)


그러면 위처럼 잘 붙는 것을 볼 수 있다 ^^


반응형


현재 위치가 ./ 이고 내가 정의한 클래스의 위치가 ./home/test.py에 있다고 해보자.

그리고 그 클래스의 이름이 다음과 같이 Foo로 정의되어 있다고 하자.

1
2
3
class Foo(object):
 
    pass

이때 ./위치에서 이 클래스를 가져다 쓰려면 다음과 같이 여러가지 방법이 있다.

(python2.x의 경우 주의할 점은 home 폴더 안에 __init__.py 파일이 dummy로 라도 생성되어 있어야 한다.)

방법1

1
2
3
import home.test
 
f = home.test.Foo()

 

방법2

1
2
3
from home.test import Foo
 
f = Foo()

 

방법3

1
2
3
from home import test
 
f = test.Foo()

 

방법4

1
2
3
import home.test as t
 
f = t.Foo()

 

 

일반적으로는 방법2가 가장 편리하다. 단 Foo말고 다른 것도 많을 경우 하나씩 지정해주기가 힘들다. 이때는 import Foo 대신 import *를 해주는 방법이 있다.


방법4도 편할 수 있다. 단 import를 import home.test.Foo as F 처럼 class단위까지 바로 할 수는 없다.



반응형

'Programming > Python' 카테고리의 다른 글

Anaconda & Jupyter  (0) 2018.03.23
python numpy  (0) 2018.02.28
python virtualenv 가상환경  (0) 2017.11.16
python에서 doxygen 사용해보기  (0) 2017.11.14
python 시간관련 함수  (0) 2017.10.31

기본적인 fast forward merge와 3-way merge에 대해서는 http://devyongsik.tistory.com/624 여기를 보면 이해가 쉬웠다.


정리하자면, 둘 간의 차이점은 전자는 merge로 인한 추가 commit node가 발생하지 않는데, 후자는 발생한다는 점이고


이를 좀 더 쉬운말로 표현하면 fast forward merge가 발생할때에는 history를 볼때 branch 딴 것에 대해서 시각적으로 쉽게 확인이 안된다는 점이다.


https://i.stack.imgur.com/FMD5h.png


no-ff 옵션 자체에 대해서는 https://stackoverflow.com/a/21717431/208397 이 링크가 가장 이해하기 쉬웠다.




반응형

'Programming > Git' 카테고리의 다른 글

git 초기설정  (0) 2023.06.06
git log  (0) 2019.12.09
git 자주 쓰는 명령어 모음  (0) 2019.09.27
git branch 관련  (0) 2019.04.17
github  (0) 2018.11.07

ctrl+k, o : .cpp 파일에서 매칭되는 .h(header)파일로 이동

반응형

'Programming > Visual studio' 카테고리의 다른 글

occcont.cpp line 925 (ocx loading 오류)  (0) 2017.12.17

tistory 설정

다음 스크립트를 <head>와 </head> 사이에 넣어주면 됨

 


적용후 사용법


실제 사용하는 방법은 다음처럼 $로 시작하고 $로 끝나도록 해주면 됨

$_{n}C_{k}$

그러면 다음처럼 렌더링 됨

$_{n}C_{k}$


새로운 줄에 가운데 정렬해서 표현하고 싶으면 $대신 $$로 감싸주면 됨, 그러면 다음처럼 렌더링 됨

$$_{n}C_{k}$$


주의할점

tistory 관리 > 꾸미기 > 모바일에서 "티스토리 모바일웹 자동 연결을 사용하지 않습니다"로 바꾸어야 한다. 그렇지 않으면 모바일에서는 렌더링이 제대로 되지 않을 수 있다.


반응형

+ Recent posts