매천수산시장은 거의 매년 방문하고 있다. 작년은 코로나-19 때문에 방문하지 않았다. 대방어 회를 구입하기 위해 매천수산시장을 오랜만에 찾았다.
매천수산시장
이런 재래시장의 활기찬 분위기는 활력이 넘치고 좋지만, 무분별한 호객행위는 줄어들었으면 좋겠다. 맛있어 보이는 게 있어서 "이거 얼마예요."라고 물어보면 가격은 말 안 하고 제품을 봉지에 담으려고 하는 행동이 뒷걸음질 치게 만든다.
시장 입구에 홍게 15마리를 28,000원에 팔고 있어서 살뻔했다. 다리 한쪽 맛까지 보여주던데 맛도 괜찮았다. 다리 맛만 보고 살뻔했는데, 오늘은 대방어 회를 사러 온 거니 겨우 참았다. 나중에 생각해보니 안 사길 잘했다 싶었다. 다리 살도 많지 않았고, 중요한 몸통에 살이 얼마나 있는지 모르기 때문이다.
매천수산시장
매천수산시장
다양한 활어가 판매되고 있다.
참돔 1kg당 19,000원
우럭 1kg당 19,000원
줄돔1kg당 33,000원
광어1kg당 23,000원
대광어1kg당 26,000원
감성돔1kg당 28,000원
다금바리1kg당 36,000원
등등 많은 수산물들이 있었다. 내와 와이프가 좋아하는 개불은 5마리 만원이라서 좀 사고 싶었는데, 작업하는데 30분 이상 걸린다는 곳도 있고, 어떤 곳은 뻔히 개불이 있는데 안 판다는 곳도 있었다. 개불 작업이 귀찮고 시간도 많이 걸리니 회전율과 단가가 높은 활어를 더 팔려는 것으로 보였다.
대방어 회를 구입하기 위해 매천수산시장을 찾았기 때문에 관심 제품은 아니었지만, 큼지막하고 먹음직스러운 대게는 1kg에 7만원이라고 했다. 가격은 1~2년 전과 같았다. 한 3월 즈음에 다시 방문해서 대게나 튼실한 홍게를 사 먹어볼 생각이다.
매천수산시장
활어를 미리 회로 썰어서 판매하고 있었다.
광어, 우럭, 모둠회는 10,000원 ~ 20,000원 가격에 팔리고 있었다.
대방어 회는 대부분 24,000원 ~ 30,000원에 팔리고 있었다.
저렇게 접시에 올려놓은걸 보면 양이 꽤 괜찮아 보이는데, 집에 와서 까 보면 그리 많지 않다. 정말 얇게 펴서 접시가 보이지 않게 접시를 가려놓은 수준이기 때문이다. 회를 대부분 포를 떠놨기 때문에 한 점 집어서 먹으면, 먹은 회만큼 접시가 드러난다.
절대적인 회 양이 적은 것은 아니다. 동네에 파는 것과 비슷한 수준이다. 하지만 불필요하게 큰 접시에 회를 얇게 깔아놓으니, 살 때는 동네 횟집보다 양이 많아 보이는데 집에 와서 까 보면 비슷하다는 생각이 든다.
매천수산시장의 대방어회 장점은 2가지가 있다. (동네횟집 대비)
1. 매천수산시장의 횟감 회전율이 높으니 회가 싱싱하다
2. 정말 성인 다리만 한 대방어를 잡는다. 진짜 대방어를 먹을 수 있다.
대방어회 24,000원짜리 2접시와 모둠회(광어, 우럭, 밀치) 2만원짜리 1접시를 샀다.
전복도 1kg에 38,000원(대충 10마리)에 샀다. 전복은 회로도 먹고 살짝 쪄서도 먹었다.
주식 자동화 project를 통해 매일 5천원 벌기라는 목표가 있었지만, 이면에는 python 학습이라는 목표도 있었다. 그래서 pykiwoom 패키지를 사용하지 않고 직접 코딩을 결정했다.
OPEN API도 심도 깊게 배워보고 싶었다.
하지만, 파이썬의 class, __init__, 상속, 오탈자(특히 def나 if 뒤의 :), 코드 줄 맞춤 등등 기초적인 것들에서 너무 많은 시간을 소비했고, 나는 지쳐가고, 성과는 나오지 않았다.
진도가 나가지 않아 답답하던 시기에 if __name__ == "__main__" 문제가 터졌다. 이걸 이해하고 해결하는데 2~3시간이나 걸렸다. 몰랐던걸 알게 되었으니, 가치 있는 시간이었지만, 뭔가 잘못되고 있음을 알게 되었다.
지금과 같은 속도로는 올봄이 오기 전에 주식 자동화 코드를 만들 수 없을 거 같다는 생각이 들었다. 그래서 키움 API 사용은 직접 코딩을 포기하고, 잘 만들어진 패키지를 import 해서 사용하기로 마음을 고쳐먹었다.사실 내가 더 많은 시간을 투자해야 하는 것은 가격 예측 모델링이라는 생각도 들었다.
파이썬에서의 클래스 개념이 잘 안 잡혀서 주변에 계신 분께 여쭤보니, 구글링해서 얻은 정도의 답변을 해주셨다. 그리고, 다음의 말씀도 주셨다.
개발자가 직접 class를 만드는 일은 잘 없다. 개발자는 잘 만들어진 패키지를 잘 찾고 잘 쓰는 것이 더 중요한 능력이다. class와 모듈을 처음부터 만들려고 접근하는 것은 비효율적이다.
[2]
이미 바퀴가 있는데, 바퀴를 만든다고 시간을 소모할 필요가 없겠다.
[3]
이미 바퀴가 있으니, 바퀴를 재발명하는 것이 아니라, 바퀴를 개선해야겠다.
잘 만들어진 패키지를 import 해서 사용하고, 그 패키지들이 어떻게 만들어졌고, 어떻게 작동하는지 알아보면서 공부를 해야겠다. 능력이 닿인다면, 패키지들의 개선할 수 있는 방법도 찾아봐야겠다.
이 짧은 코드 한 줄이 나에게 많은 것을 깨우치게 해줬다. 깨달음은 다음 글에서 포스팅할 예정이다. 키움 주식 자동화 14번째 글은 많은 시간을 투자해서 알게 된 if __name__ == “__main__” 에 대한 글이다.
이 코드의 목적은 명확하다.
해당 모듈이 인터프리터에서 직접 실행된 경우에는 if절 아래의 내용을 실행하는 것이다.
이 짧은 문장을 이해하기 위해선 모듈을 실행시키는 방법에 대한 이해가 필요하다.
1. 실행시키고자 하는 모듈을 다른 모듈에서 import 해서 실행
2. 실행시키고자 하는 모듈을 인터프리터(interpreter)에서 직접 실행
주식 자동화 포스팅을 하면서 유튜브 프로그램 동산(이하 "프동")의 도움을 많이 받았다. 프동이 실습 모듈을 제작하고 실행하는 과정은 다음과 같았다.
1. __init__.py 에서 ui.py를 import
2. ui.py 에서 kiwoom.py를 import
__init__.py와 ui.py 모듈은 별다는 코드가 없었다. 키움 API를 사용하는 모든 내용은 kiwoom.py에 들어있었다. 이 상태에서 코드를 실행시킬 때 kiwoom.py 파일이 아닌 __init__.py 파일을 실행한다. 그럼 kiwoom.py 파일이 import(init ← ui ← kiwoom) 되어 실행된다. 이렇게 kiwoom.py 모듈이 다른 모듈에 의해 import 되어 실행되면, 오늘의 주제인 <<if __name__ == “__main__”>> 코드가 필요 없다.
### __init__.py
from ui.ui import *
class Main():
def __init__(self):
print("실행할 메인 class")
Ui_class()
if __name__ == "__main__":
Main()
### ui.py
from kiwoom.kiwoom import *
import sys
from PyQt5.QtWidgets import *
class Ui_class():
def __init__(self):
print("Ui_class 입니다.")
self.app = QApplication(sys.argv)
self.kiwoom = Kiwoom()
self.app.exec()
### kiwoom.py
class Kiwoom(QAxWidget):
def __init__(self):
super().__init__()
print("Kiwoom 클래스 입니다.")
...
...
...
그러고 보니 인터프리터에서 직접 실행하는 init.py 모듈에도 마지막에 <<if __name__ == “__main__”>> 코드가 있었다....
모듈이 import 되지 않고 인터프리터(interpreter)에서 바로 실행한다는 것은, kiwoom.py 모듈을 단독으로 실행하는 것을 의미하며, 이럴 경우에는 <<if __name__ == “__main__”>> 코드가 필요하다.
그 이유는 다음과 같다.
__name__은 인터프리터(interpreter)가 실행 전에 만들어준 글로벌 변수이다.
모듈이 import 되어 실행되면 __name__ 변수에 현매 모듈 이름인 kiwoom이 할당된다.
하지만, 모듈을 인터프리터(interpreter)에서 직접 실행하면 __name__ 변수에 __main__이 할당된다.
앞서 1~12번의 글에서 키움 API를 활용해 로그인하고 데이터를 가져오는 등 다양한 방법을 학습하였다. 지금까지는 유튜브 채널 "프로그램 동산"의 도움이 컸다.
머신러닝 주가예측 및 자동매매를 위해 키움 API에 대한 기본적인 내용을 학습하였으니, 앞으로는 내가 생각한 방향으로 코딩을 진행하고, 단기 목표인 1일 5천원 벌기를 시작하고자 한다.
자동매매 개요
내가 잡은 폴더 구조이다.
data 폴더는 각종 자료를 쌓아둘 데이터 마트이다. 삼성주식 예측에 우선적으로 KOSPI200 종목의 주가를 사용할 예정이다. 유가와 금리 등 각종 경제 지표를 확보해서 data 폴더에 차곡차곡 쌓고, 업데이트하고, 활용할 것이다. 나중에 기회가 된다면, SQLite를 활용하여 DB를 구조화해볼 생각도 있다. 당장은 csv 파일로 관리할 예정이다.
kiwoom 폴더는 키움API를 활용해서 진행할 폴더이다. 가장 주된 역할은 주식 매매를 위한 자동주문 역할이다. 그리고 KOSPI200과 같은 시장 데이터를 확보하기 위해서도 활용할 것이다. 주피터 노트북으로 하나씩 만든 후, ".py" 파일로 변환해서 파이참에서 구동시킬 예정이다.
prediction 폴더는 data 폴더의 자료를 활용해서 머신러닝 모델링을 진행할 폴더이다. 회귀, LSTM 등 다양한 모델링을 통해 삼성전자 주가를 예측하는 모델을 만들고 업데이트할 예정이다. 주피터 노트북을 주로 활용할 예정이다.