~업데이트를 자동화하다 : CI/CD 파이프라인 구축기~ 스톡잇! 개발기 #11
·
모의투자
업데이트를 자동화하다 : CI/CD 파이프라인 구축기지난 글에서 서버를 구축하고, 트러블 슈팅을 거쳐, 모니터링 시스템까지 갖췄습니다. 이제 개발에만 집중하면 될 줄 알았습니다. 하지만 코드를 한 줄 수정하거나, AI 모델을 업데이트할 때마다 저는 '수동 배포 로봇'이 되어야 했습니다.로컬에서 테스트 코드 돌리기Docker 이미지 빌드하기Docker Hub에 푸시하기쿠버네티스에 배포 명령 내리기이 과정은 매번 10분 이상 소요되었고, 명령어 하나라도 실수하면 에러가 났습니다.특히 코드 한줄이라도 업데이트할 때마다 이 지루한 과정을 반복하는 건 너무 비효율적이었습니다."나는 AI 로직을 고민하고 싶은데, 배포 스크립트와 씨름하느라 시간을 다 쓰고 있다."저 뿐만이 아니라 모든 팀원이 느꼈습니다. 이것이 C..
~AI가 멍때리지 않게 감시하기 : PLG 모니터링~ 스톡잇! 개발기 #10
·
모의투자
AI가 멍때리지 않게 감시하기 : PLG 모니터링지난 글에서 트러블 슈팅을 거쳐 AI 서버를 안정적으로 배포하는 데 성공했습니다. 하지만 배포 버튼을 누르고 "끝났다!"라고 외치는 건 개발자의 착각이었습니다.진정한 서비스 운영은 배포 직후부터 시작됩니다. 특히나 연산량이 많은 AI 서버는 언제 뻗을지 모르는 시한폭탄과 같습니다."사용자가 분석 버튼을 눌렀는데 10초 동안 응답이 없으면 어떡하지?" "장 마감 후 AI 모델이 클러스터링을 돌릴 때 메모리가 터지진 않을까?"이런 막연한 불안함을 없애기 위해서는 서버의 상태를 24시간 감시하고, 장애 징후를 미리 알려주는 모니터링 시스템이 필수적이었습니다.왜 모니터링이 필요한가? (AI 서비스의 특수성)단순히 "있으면 좋아서"가 아닙니다. 분산 시스템(MSA)..
~서버가 로그 없이 죽었다 : 쿠버네티스를 디버거로 쓴 사연~ 스톡잇! 개발기 #9
·
모의투자
서버가 로그 없이 죽었다 : 쿠버네티스를 디버거로 쓴 사연지난 글에서 FastAPI로 AI 서버를 구축했지만 서버가 요청을 받자마자 로그도 없이 비정상 종료되는 현상을 겪었습니다.이번 글에서는 로그도 없이 비정상 종료되는 상황을 어떻게 해결했는지 이야기해보겠습니다.왜 도커가 아닌 쿠버네티스인가?FastAPI로 AI 서버 개발을 마친 후, 배포 단계에서 저는 Docker 컨테이너가 아닌 Kubernetes(K8s) 환경을 선택했습니다.프로젝트 규모에 비해 과한 선택(Over-engineering)이 아니냐는 의문이 들 수 있지만, 여기에는 AI 서비스의 특성을 고려한 명확한 기술적 이유가 있었습니다.첫째, 이기종 서버의 자원 격리 (Resource Isolation)Stockit은 Spring Boot(메..
~파이썬 AI, 웹 서버가 되다 : MSA와 FastAPI 아키텍처에 대한 고찰~ 스톡잇! 개발기 #8
·
모의투자
파이썬 AI, 웹 서버가 되다 : MSA와 FastAPI 아키텍처에 대한 고찰 지난 글에서 저는 파이썬으로 500개의 주식 데이터를 학습시키고, 학습하지 않은 주식(예: 삼성전자)도 분류해내는 예측 엔진을 완성했습니다. 여기에 포트폴리오를 유명 투자자의 페르소나와 매칭시키는 로직까지 더해졌죠.하지만 냉정하게 말해서, 이 코드는 아직 제 노트북 터미널 안에 갇혀 있는 '연구용 스크립트'일 뿐입니다.사용자가 스마트폰 앱에서 "내 포트폴리오 분석해줘" 버튼을 눌렀을 때, 이 파이썬 코드가 0.1초 만에 실행되어 결과를 돌려주려면 어떻게 해야 할까요?AI 엔진을 24시간 깨어있는 웹 서버로 만들어야 합니다. 그래야 메인 서버나 클라이언트가 언제든 말을 걸고 분석을 요청할 수 있으니까요. 이번 글에서는 AI 모델..
~세상의 모든 주식을 분석하다 : 조회에서 예측으로~ 스톡잇! 개발기 #7
·
모의투자
"세상의 모든 주식을 분석하다 : 조회에서 예측으로"지난 글에서 저는 500개의 정제된 데이터셋을 분석하고, 각 그룹에 페르소나를 부여했습니다. 하지만 이 시스템에는 치명적인 한계가 있었습니다.바로 조회(Lookup) 방식이라는 점입니다.우리가 만든 시스템은 500개의 명단을 가지고 있습니다.만약 사용자가 명단에 있는 주식을 가져오면 "아, 그거 3번 그룹이네요"라고 대답합니다.하지만 명단에 없는, 예를 들어 학습에 포함되지 않은 삼성전자를 가져오면 어떻게 될까요?"모르는 주식입니다."이것은 진정한 인공지능이 아닙니다. 진정한 AI라면 배우지 않은 주식을 마주쳐도, 자신이 학습한 기준(모델)을 바탕으로 스스로 판단할 수 있어야 합니다.이번 글에서는 500개의 데이터셋으로 학습을 마친 AI 모델(K-Mea..
~투자 성향을 캐릭터로 만들다: 페르소나 매칭 설계~ 스톡잇! 개발기 #6
·
모의투자
" 성향을 캐릭터로 만들다: 페르소나 매칭 설계"지난 글에서 저는 AI가 만든 숫자를 사람이 이해할 수 있는 언어로 바꾸는 작업을 했습니다.하지만 단순히 정보를 전달하는 것만으로는 충분하지 않았습니다.사용자가 결과를 읽는 것이 아니라,“아, 이게 나구나”라고 스스로를 이해하게 만드는 단계가 필요했기 때문입니다.그래서 바로 사람의 언어로 된 투자 성향 ‘페르소나(Persona)’가 필요했습니다.이번 글에서는 정답 데이터가 전혀 없는 상황에서어떻게 페르소나 매칭 시스템을 설계했는지에 대해 이야기해보려 합니다.문제 : 워렌 버핏은 삼성전자를 안 샀는데?사용자에게 단순히 "당신은 가치주 성향입니다"라고 말하는 것보다,"당신은 워렌 버핏과 비슷하네요!"라고 말해주는 것이 훨씬 직관적이고 이해하기 쉽습니다.하지만 ..
~숫자를 언어로 번역하다 : 태깅~ 스톡잇! 개발기 #5
·
모의투자
"숫자를 언어로 번역하다"지난 글에서 K-Means를 통해 500개의 주식을 8개의 그룹(0~7번)으로 군집화하는 데 성공했습니다.하지만 여기서 프로젝트는 끝나지 않습니다. 오히려 가장 어려운 문제가 남았죠."그래서 0번 그룹이 뭔데?"AI는 그저 수학적으로 거리가 가까운 종목들을 묶었을 뿐, 이 그룹이 가치주인지 성장주인지 설명하지 못합니다. 이번 글에서는 AI가 던져준 차가운 숫자 덩어리에, 인간이 어떻게 의미(Context)를 부여했는지 그 과정을 다룹니다.AI는 "비슷하다"고만 했다train_model.py가 수행한 일은 명확합니다. PER, PBR, ROE, 부채비율 등 정량적 지표를 보고 "이 주식들은 서로 성향이 비슷해"라고 묶어준 것입니다.결과적으로 8개의 군집이 생겼습니다.하지만 AI에게..
~숫자만 보고 주식을 나누다: K-means 클러스터링 과정~ 스톡잇! 개발기 #4
·
모의투자
"숫자만 보고 주식을 나누다: K-means 클러스터링 과정"지난 글에서 저는 3,619개의 주식 데이터를쓰레기 데이터를 제거하고극단치를 정리하고스케일링을 통해 벡터로 변환했습니다.그 결과 남은 것은 단 하나였습니다.AI가 학습할 수 있는 숫자 행렬하지만 중요한 사실 하나.👉 여기까지는 아직 ‘학습’이 아닙니다.지금까지의 과정은 전부AI가 판단을 내릴 수 있도록 환경을 만들어준 단계일 뿐입니다.이제부터가 진짜입니다.이제 왜 ‘K-Means’인가이미 2편에서 이야기했듯이,Stockit은 정답이 없는 주식 분류 문제를 다룹니다.우량주 / 성장주라는 정답이 없음사람이 기준선을 정하지 않음오직 숫자의 패턴만 존재이 조건에서 선택한 방식이비지도 학습 기반의 K-Means 클러스터링이었습니다.클러스터링 자체에 대..
~학습에 적합한 형태로 변환하다 : 전처리 과정~ 스톡잇! 개발기 #3
·
모의투자
"왜 학습에 적합한 형태로 변환 하는 전처리 과정을 할까?"지난 글에서 저는 “정답이 없는 주식 분류 문제”를 해결하기 위해 클러스터링(K-means) 을 선택했습니다.그리고 한국투자증권 API로부터시가총액PERPBRROE부채비율배당수익률총 6개 지표를 기반으로 3,619개 종목 데이터를 수집했죠.이제 남은 건 단 하나였습니다.“이 데이터를 AI가 학습할 수 있는 형태로 바꾸기”하지만…막상 데이터를 열어보니 현실은 달랐습니다.문제 1 : 이 모든 데이터에는 ‘쓰레기 정보’가 많았다3,619개는 “전체 주식 데이터”입니다.즉, 기업만 있는 게 아니었습니다.여기에는ETF인버스ETNSPAC(기업인수목적회사)같은 금융상품들도 섞여 있었습니다.문제는 얘네가 “기업”이 아니라는 점입니다.ETF나 ETN은 회사가 아..
~정답이 없는 주식 분류 문제, 왜 클러스터링을 선택했을까?~ 스톡잇! 개발기 #2
·
모의투자
“정답이 없는 주식 분류 문제, 왜 클러스터링을 선택했을까?” 지난 글에서 이야기했듯이,주식쌤의 목표는 사용자의 투자 성향을 분석하는 것이었습니다.처음 떠올린 가장 단순한 기준: 코스피 vs 코스닥처음에는 가장 직관적인 분류 기준을 떠올렸습니다.코스피 → 대형 우량주, 안정적인 기업코스닥 → 성장주, 고위험·고수익 기업하지만 코스피에는 삼성전자 같은 대형 우량주도 많지만 실적이 지속적으로 악화된 기업 , 상장폐지 직전의 관리 종목도 함께 존재합니다.반대로 코스닥에는 단기 테마성 종목도 많지만 시가총액이 크고, 기술력과 매출을 갖춘 거대 성장주도 분명히 존재합니다.즉,“코스피니까 우량주다”“코스닥이니까 위험하다”라는 기준은 AI에게 학습시키기에는 너무 거칠고 부정확한 라벨이었습니다.이 상태로 학습을 시키면..