주식 자동매매 프로젝트의 시작이다. 

 앞선 글에서 말한것처럼 프로젝트의 컨셉에 대해서 구체화 하고 어떤 식으로 프로그램을 짤것인지 순서도를 작성하려고 한다. 

 

프로젝트 컨셉

 프로젝트의 큰 목적은 "단기간의 2%의 수익"이다. 영업일 기준 매매는 원하는 기준에 충족한다면, 매일 진행할 것이고 매도는 수익이 (투자금 + 수수료) * 2% 이상이 되는 범위에 바로 팔 것이다. 원하는 정보는 "거래량 top list", "거래량이 높은 종목의 뉴스" 일단 이 정도이다. 좀 더 세부적인 내용은 순서도를 작성하면서 어떤 식으로 구성할지 작성하겠다.

 

프로젝트 순서도

- 전일

- 코스닥 리스트 매일 업데이트

- 코스닥 리스트 중 필요없는것 제거 

- 전일 거래량 기준으로 내림차순 적용, 기사가 있는 것들을 남김

- 다음날 

- 9시부터~9시 1분 사이에 거래량이 list와 전일 기사가 있던 것들을 비교하여 하루 거래량을 넘어가면 매매

- 실제 2%이상 수익이면 바로 매도

 

 

추가적으로 생각해야할 것

- 매매한 주식이 수익을 이루지 못하면 언제, 몇프로 마이너스 일때 팔것인가? 

 

프로젝트 시작 배경

최근에 "부읽남" 유튜브를 보다가 "대한민국 4050이 99% 후회하게 되는 것들" 이란 내용의 영상을 보았다.

40대, 50대의 사람들이 아이를 키우면서 들어가는 비용을 사용하다 보면, 결국 정년이 되었을 때 집 한 채 보유하는 것 (+빚)으로 경제활동이 끝난다는 얘기였다. 노후에 사용할 자금을 준비할 여유는 없다는 것이다.

 30대인 본인의 미래도 이대로 직장을 다니다 보면 비슷하거나 못할 것이라는 생각이 들었다. 추가적인 "파이프라인"이 필요하다는 생각이 들었다. 예전에 친구들과 재미로 했던 주식 자동매매 프로젝트가 생각났다. '이거 다시 한번 해보자' 생각이 들었다. 

 

주식 자동 매매 프로그램 "bewealthy"

 먼저, 주식 자동 매매프로그램의 주요 타겟은 "거래량 폭등한 주식의 변동성을 이용해 2% 이상의 수익을 내자"다. 그러면 어떤 정보들이 필요했을까? 아래 두 가지의 정보였다.

1. 전일 거래량이 폭등한 주식의 list

2. 왜 거래량이 폭등했는가? - 뉴스 크롤링

  이 정보들을 이용해 어떻게 문제를 풀어나가야 하는가? 당연히 호재의 주식리스트를 뽑아야 하고, 그 리스트를 보유 자산의 얼마의 금액으로 나눠 투자할 것인지 결정등이 필요했다. 

 

Process

지금부터, 아래와 같은 순서로 해당 프로젝트 복원을 진행하려 한다.

1. 컨셉 재구체화 및 순서도 작성

2. 코드 분석 및 유지보수

3. 실물 자산 투자 및 결과 분석

 

 

천천히 꾸준히 계속하자.

 

헝가리안 알고리즘을 보다 보면 matching과 vertex cover이라는 용어가 계속 나온다.

이게 도대체 무슨 의미길래 계속 나오는가?

 

vertex cover란?

어떠한 그래프에서의 접점인데, 모든 간선들을 커버하는 접점

 

도대체 접점은 뭐고, 그래프는 뭐고, 간선은 뭔데???

이러한 기본 지식을 설명하려고 한다.

 

그래프(graph)

"그래프란 정점(vertex)들이 간선(edge)들로 연결되어 있는 구조"

아래 그림을 보면 이해가 쉽다.

vertex란 선과선이 연결되는 지점, 끝점이며

edge란 정점들을 연결하는 간선이다.

아래에는 6개의 vertex와 5개의 edge가 있는 그래프이다.

https://namnamseo.tistory.com/entry/Tree%EC%9D%98-%EA%B8%B0%EC%B4%88?category=589725 참조

 

 

자 그러면, 다시 vertex cover의 정의로 돌아가려고 한다.

vertex cover

"어떠한 그래프에서의 접점인데, 모든 간선들을 커버하는 접점"

이제 좀 이해가 가는가? 

아래의 각각의 그래프에서 빨간점은 모두 vertex cover가 된다. 

쉽게 말해 빨간점과 빨간 점에 이어진 선을 모두 제거하게 되면

남아있는 것이 없는 상태가 되는 vertex의 집합을 vertex cover라고 한다.

 

https://brilliant.org/problems/not-a-vertex-cover/ 참조

 

https://brilliant.org/problems/not-a-vertex-cover/ 참조

 

https://brilliant.org/problems/not-a-vertex-cover/ 참조

 

해당 내용을 기반으로 헝가리안 알고리즘을 다시 한번 보게 되면, 다른 블로그들의 설명을 좀 더 쉽게 이해할 수 있을 것이다. 

https://billionaire-hossa.tistory.com/36

reference

https://namnamseo.tistory.com/entry/Matching%EA%B3%BC-Vertex-cover

 

Matching과 Vertex cover

Matching이란, 어떠한 그래프에서 간선을 잘 고른 것이다. 이 때 이 간선들은 서로 어떠한 점에서도 만나지 않아야 한다. 즉, 그래프에서 한 간선을 잡고, 그 간선과 양 끝 점을 제외한 그래프에서

namnamseo.tistory.com

https://namnamseo.tistory.com/entry/Tree%EC%9D%98-%EA%B8%B0%EC%B4%88?category=589725

 

트리의 기초

트리(tree)는 그래프의 일종이다.그래프란 정점(vertex)들이 간선(edge)들로 연결되어있는 구조를 뜻한다. 정점은 node, 노드라고도 부른다.지하철 노선도에서 각 역이 정점, 이웃한 역을 잇는 노선이

namnamseo.tistory.com

https://brilliant.org/wiki/vertex-cover/

SORT 논문을 학습중에 헝가리안 알고리즘이란 것을 쓴다는데... 도대체 이건 또 뭔지 알아보려고합니다.. 

 

Hungarian Algorithm이란?

헝가리안 알고리즘이라는 것은 assignment problem을 해결하는 최적의 솔루션(optimal solution) 입니다. 

 

그럼 먼저 assignment problem이 뭔지?,

그리고 어떻게 헝가리안 알고리즘이 사용하는지? 

알아보겠습니다.

 

assignment problem이란?

직역하면 할당 문제입니다.
어떻게 하면 가장 효과적으로 할당할 것이냐의 문제인데,
예를 들면, 회사에서 외주를 맡겨야 할 일이 3개가 있다고 한다면(식당, 보안, 환경관리)
해당 일들을 3개의 업체에 맡겨야 하는데 어떻게 맡기는것이 가장 효과적인가 하는 문제입니다.

아래는 각 업체별 업무에 따른 가격이 나와있습니다.

가격 식당 보안관리 환경관리
A업체 4 7 3
B업체 5 6 1
C업체 2 5 3

 

 

Optimal Solution (Hungarian algorithm)

위와 같은 상황에서 어떻게 하면 회사는 가장 저렴한 가격으로 각각의 업무를 부여할 수 있을까요?

이것을 해결하는 방법은 다음과 같은 절차를 따릅니다.  

1. 행에 대해서 가장 작은 값으로 뺀다

    -> 이 이유는 A업체에 각각에 비용에 3을 빼더라도 환경관리가 가장 싸고, 보안관리가 가장 비싸다는 내용 자체의 변화는 없기 때문입니다. 동일하게 행에 해당하는 B,C 업체도 동일하게 진행해줍니다.   

가격
식당
보안관리
환경관리
 
A업체
1 4 0 3
B업체
4 5 0 1
C업체
1 3 0 2

 

2. 열에 대해서 가장 작은값으로 뺀다.

이유는 동일합니다. 식당일은 1을 빼더라도 A,C업체가 가장 싸고 B업체가 비싼것에는 차이가 없기 때문입니다.

가격
식당
보안관리
환경관리
 
A업체
0 1 0 3
B업체
3 2 0 1
C업체
0 0 0 2
  1 3 0  

 

이렇게 얻은 행렬에서 0의 값을 가지는 업체-업무 쌍만 알게된다면 가장적은 비용으로 모든 업무를 처리해 낼 수 있을것입니다. 단 여기서 값에 해당하는 모든 행과 열은 0 이상의 값이여야 최적화를 할 수 있습니다. 

 

3. 모두가 0이되는 행과 열을(minimum-size vertex cover) 제외하고 가장 작은 값을 찾아 모든 행에 빼줍니다.

가격
식당
보안관리
환경관리
 
A업체
-1 0 -1 3+1
B업체
2 1 -1 1+1
C업체
0 0 0 2
  1 3 0  

 

4. 음수가 되는 행렬의 원소를 음이 아닌수로 만들어 줍니다. 

  식당
보안관리
환경관리
 
A업체
0 0 0 3+1
B업체
3 1 0 1+1
C업체
1 0 1 2
  0 3 -1  

 

 

최종적으로 A업체 - 식당, B업체 - 환경관리, C업체 - 보안관리가 최적의 선택이라는 결과가 나옵니다.

가격 식당 보안관리 환경관리
A업체 4 7 3
B업체 5 6 1
C업체 2 5 3

 

 

이 같은 알고리즘이 바로 헝가리안 알고리즘입니다. 

헝가리안 알고리즘

1. 각 행에서 가장 작은 항목을 해당 행의 다른 모든 항목에서 뺍니다. 이렇게 하면 행의 가장 작은 항목이 0이 되게 됩니다.
2. 각 열에서 가장 작은 항목을 해당 열의 다른 모든 항목에서 뺍니다. 이렇게 하면 열의 가장 작은 항목이 0이 되게 됩니다.
3. 0 항목을 포함하는 행과 열을 표시하여 가능한 적은 수의 선을 그립니다.
4. 만약 그려진 선이 n개라면, 0의 최적 할당이 가능하며 알고리즘이 완료됩니다. 선의 수가 n보다 적으면, 최적 수의 0이 아직 달성되지 않았습니다. 다음 단계로 이동합니다. (여기서 n은 행의수 = 열의수 = n)
5. 어떠한 선으로도 커버되지 않은 가장 작은 항목을 찾습니다. 이 항목을 선이 그어지지 않은 각 행에서 빼고, 선이 그려진 각 열에서 더합니다. 그런 다음, 단계 3으로 돌아갑니다.

 

 

reference

https://gazelle-and-cs.tistory.com/29

'프로그래밍 > 수학' 카테고리의 다른 글

내적 (Dot product)  (3) 2024.09.29
vertex cover란?  (0) 2024.04.02
자연상수 𝑒(exponential)란 무엇인가요?  (0) 2024.02.20
공분산(covariance)이란?  (0) 2023.03.16
표준편차란?  (0) 2023.03.15

+ Recent posts