설정
Richfolio는 모든 포트폴리오 데이터를 하나의 JSON 설정으로 관리합니다 — 포트폴리오 정보는 비공개로 유지됩니다.
설정 방법
Fork한 저장소의 Settings → Secrets and variables → Actions → Variables 탭으로 이동 → 아래 JSON 내용을 담은 CONFIG_JSON 이라는 변수를 생성하세요.
예시
{
"targetPortfolio": {
"VOO": 20,
"QQQ": 15,
"GLD": 10,
"BSV": 20,
"SMH": 5,
"BTC": 1.5
},
"currentHoldings": {
"AAPL": 30,
"VOO": 1,
"BTC": 0.0002
},
"watching": ["MSFT", "NVDA", "AMD"],
"watchingCrypto": ["BTC/CRO", "ETH/CRO"],
"totalPortfolioValue": 50000,
"defaultCurrency": "USD",
"intradayAlerts": {
"enabled": true,
"confidenceIncreaseThreshold": 10
}
}
필드 참고
| 필드 | 필수 | 설명 |
|---|---|---|
targetPortfolio | 예 | 목표 배분 비율(%). 키는 티커 심볼이고, 값은 합계가 약 100%가 되어야 하는 비율입니다. |
currentHoldings | 예 | 현재 보유한 주식 수. 목표 포트폴리오에 없는 종목도 포함할 수 있습니다 (예: ETF 중첩 감지를 위한 AAPL). |
watching | 아니오 | 목표 포트폴리오에는 포함하지 않지만 추적하고 싶은 티커 배열입니다. 데이터를 가져와 AI 점수를 매기고, 배분 계산에 영향을 주지 않으면서 별도의 “Watch List” 섹션에 노출됩니다. 아래 Watch List를 참고하세요. |
totalPortfolioValue | 예 | 추정 포트폴리오 총 가치(defaultCurrency 단위). 실제 보유 자산이 목표보다 작을 때 배분 계산에 사용됩니다. |
defaultCurrency | 아니오 | ISO 4217 통화 코드 (예: "USD", "GBP", "AUD"). 기본값: "USD". 이메일/Telegram의 모든 금액이 이 통화로 표시되며, 일치하지 않는 티커는 Yahoo Finance의 실시간 환율로 FX 변환됩니다. |
watchingCrypto | 아니오 | 암호화폐 교차 페어 배열. "BASE/QUOTE" 형식 (예: ["BTC/CRO", "ETH/CRO"])으로 “QUOTE로 표시한 BASE의 가격”을 뜻합니다. Yahoo가 아니라 crypto.com의 키 없는 공개 API에서 가져오는 관찰 전용 교환 신호입니다. 아래 암호화폐 교차 페어 참고. |
intradayAlerts | 아니오 | 장중 알림 설정 (아래 참고). 생략 시 기본값이 적용됩니다. |
cryptoAlerts | 아니오 | --crypto 스케줄용 알림 설정. 필드는 intradayAlerts와 동일하며 독립적으로 조정합니다. |
장중 알림
intradayAlerts 섹션은 장중 체크가 알림을 보낼 시점을 제어합니다. 모든 필드는 선택 사항이며 — 합리적인 기본값이 적용됩니다.
알림은 STRONG BUY와 관련된 변화에 한해서만 트리거됩니다:
- STRONG BUY로 격상 — 다른 등급 → STRONG BUY
- STRONG BUY에서 강등 — STRONG BUY → 다른 등급
- 신뢰도 변화 — STRONG BUY를 유지한 채 신뢰도가 임계값 이상 변화
| 필드 | 기본값 | 설명 |
|---|---|---|
enabled | true | 마스터 토글. false로 설정하면 장중 알림을 완전히 비활성화. |
confidenceIncreaseThreshold | 10 | STRONG BUY 종목에 대해 알림을 트리거하기 위한 최소 신뢰도 변화량 (절대값, 퍼센티지 포인트). |
분석 새로 고침
단일 종목을 최신 가격(애프터 아워/프리 마켓 포함)으로 다시 분석합니다. 새 분석 URL이 포함된 이메일 + Telegram이 전송됩니다.
Actions → Portfolio Monitor → Run workflow → mode: refresh, ticker: SMH.
가능한 경우 Yahoo Finance의 postMarketPrice와 preMarketPrice가 사용됩니다. 시간 외 데이터가 없으면 정규장 가격으로 폴백합니다.
Watch List
선택 사항인 watching 배열은 점수를 매기고 신호로 노출하고 싶지만 목표 포트폴리오에는 포함하고 싶지 않은 티커를 추적합니다. 포트폴리오 티커와 함께 데이터가 수집·프롬프트되고 점수가 매겨지지만, 배분 기반 규칙은 모두 우회합니다.
사용하면 좋은 경우:
- 목표 비중을 정하기 전에 종목을 리서치하는 단계일 때
- 현재 보유하지 않은 종목에 대한 추천이 필요할 때 (예: “지금이 NVDA에 신규 진입하기 좋은 타이밍인가?”)
- 포트폴리오 합계를 100% 이상으로 부풀리지 않고 티커 신호만 받고 싶을 때
워치 티커와 포트폴리오 티커의 차이
| 동작 | 포트폴리오 티커 | 워치 티커 |
|---|---|---|
| 배분 % 합산에 포함 | 예 | 아니오 |
| 배분 격차 계산 | 예 | 아니오 |
STRONG BUY에 gap ≥ 2% 필요 | 예 | 아니오 — 대신 신호 합치(confluence)가 필요 |
| 비중 과다 포지션 가드 적용 | 예 | 아니오 |
| 최대 2개 STRONG BUY 상한에 포함 | 예 | 아니오 — 조건을 만족하는 워치 STRONG BUY는 모두 노출 |
suggestedBuyValue 채워짐 | 예 (격차 기반) | 항상 0 — 직접 사이징 |
| 메인 “AI Buy Recommendations” 섹션에 렌더링 | 예 | 아니오 — 별도 “Watch List” 섹션 |
| 지정가 추천 | 예 | 예 (동일 로직) |
| STRONG BUY 상세 분석 페이지 | 예 | 예 |
워치 STRONG BUY 기준
배분 격차에 기댈 수 없기 때문에 워치 티커는 STRONG BUY를 받으려면 더 강한 신호 합치가 필요합니다:
- 가격대 신호 ≥ 1개 (과거 평균 대비 P/E 하회, 52주 위치 < 30%, 또는 200일선 이하)
- 가격대 신호를 확인해 주는 모멘텀 신호 ≥ 2개 (RSI < 35, 강세 MACD 크로스, 볼린저 %B < 0.15, 스토캐스틱 %K < 20, OBV 상승)
- 주요 리스크 플래그 없음
- 신호 합치만으로 신뢰도 ≥ 80%
- 밸류 등급 A 또는 B (주식에만 해당; ETF와 암호화폐는 건너뜀)
예시
{
"targetPortfolio": { "VOO": 20, "GLD": 10, ... },
"currentHoldings": { "VOO": 5, "AAPL": 30 },
"watching": ["MSFT", "NVDA", "AMD", "AVGO"]
}
이 포트폴리오는 AAPL + VOO를 보유하고, MSFT/NVDA/AMD/AVGO는 순수 리서치 신호로만 추적합니다. 워치 티커는 이메일/Telegram의 별도 섹션에 표시되며, 포트폴리오 합계를 100% 이상으로 밀어 올리지 않고, 포트폴리오 STRONG BUY 슬롯을 잠식하지도 않습니다.
암호화폐 교차 페어
선택 항목인 watchingCrypto 배열은 Richfolio의 다른 기능과는 다른 질문에 답합니다. “현금으로 이것을 사야 할까?”가 아니라 “이미 코인 X를 보유 중인데, 지금이 그중 일부를 코인 Y로 바꿀 좋은 시점인가?”입니다.
{
"watchingCrypto": ["BTC/CRO", "ETH/CRO"]
}
표기법
"BASE/QUOTE"는 QUOTE로 표시한 BASE의 가격을 뜻합니다 — “사려는 자산”을 “지불하려는 자산”으로 나눈 값입니다.
따라서 "BTC/CRO"는 “BTC 1개가 몇 CRO인가”이며, 이는 CRO를 BTC로 바꾸기 전에 낮을수록 좋은 바로 그 숫자입니다. 페어를 추가·삭제·교체하는 일은 모두 설정만 바꾸면 됩니다. "SOL/CRO", "BTC/USDT", "ETH/BTC" 모두 코드 변경 없이 동작합니다.
방향을 통일해야 하는 이유
거래소는 시장의 어느 쪽을 상장할지 마음대로 정합니다. crypto.com에서 CRO는 CRO_BTC의 기준 통화이지만 ETH_CRO에서는 표시 통화입니다 — 그대로 읽으면 두 페어는 정반대 방향을 가리킵니다. CRO를 BTC로 바꾸려면 CRO_BTC가 높아야 하고, CRO를 ETH로 바꾸려면 ETH_CRO가 낮아야 하는 식입니다. 한 브리핑에 두 가지 극성이 섞이면 오독하기 쉽고, 페어를 추가할수록 더 나빠집니다.
Richfolio는 모든 것을 “지불하는 통화로 표시한, 사려는 자산”으로 정규화하므로 낮음 = 저렴함 = 교환하기 좋은 시점이 항상 성립합니다. 거래소가 어느 쪽을 상장했는지는 거래소 자체의 종목 메타데이터로 자동 판별하며, 필요하면 시계열을 역수로 변환합니다.
무엇이 있고, 무엇이 없는가
| 가격 출처 | crypto.com 거래소 공개 API — 키 불필요, 가입 불필요 |
| 표시 통화 | 표시 통화 (예: 1,313,198 CRO). 보고 통화로 절대 환산하지 않습니다 |
| 기술적 지표 | 전체 — SMA50/200, RSI, MACD, 볼린저, ATR, 스토캐스틱, OBV, 90일 백분위 |
| 52주 범위 | 365개의 일봉에서 산출 (암호화폐는 달력일 기준 매일 거래되므로) |
| P/E, 펀더멘털, 배당, 실적, 애널리스트 목표가 | 코인 페어에는 애초에 존재하지 않습니다 — AI에도 명시하여 가치 등급을 지어내지 않습니다 |
| 배분 목표 / 갭 | 없음 — watching 목록과 동일하게 관찰 전용 |
suggestedBuyValue | 항상 0 (현금 지출이 아니라 교환이므로) |
| X/Facebook 등 공개 게시 | 소셜 게시를 켜 두었더라도 절대 게시하지 않습니다 |
P/E가 존재할 수 없으므로 교차 페어에서 쓸 수 있는 가격 수준 신호는 셋이 아니라 둘뿐입니다: 52주 위치 < 30%, 그리고 200일 이동평균선 아래. P/E가 없다는 것은 탈락 사유가 아니라고 AI에 명시합니다.
전달과 주기
교차 페어는 두 곳에 나타납니다.
- 일일 브리핑의 워치 리스트 —
watching티커와 나란히 표시됩니다. - 자체 하루 8회 스케줄 (
.github/workflows/crypto-monitor.yml, 3시간마다) — 신호가 실질적으로 바뀔 때만 이메일/Telegram을 보냅니다.
높은 주기가 의미를 갖는 이유는 암호화폐가 24시간 내내 거래되는 반면, 주식 장중 점검은 대부분 미국 시장이 닫혀 있을 때 실행되기 때문입니다. 로컬 실행은 npm run crypto입니다.
다만 일봉은 하루에 한 번만 마감되므로, 3시간 간격의 두 실행에서 기술적 지표는 완전히 동일합니다 — 가격 변동 없는 액션 전환은 신호가 아니라 점수 노이즈입니다. cryptoAlerts.minPriceMovePctToAlert(기본 1.0)가 이를 억제합니다. cryptoAlerts의 필드는 intradayAlerts와 완전히 동일하며 독립적으로 조정합니다.
{
"cryptoAlerts": {
"enabled": true,
"minConfidenceToAlert": 80,
"minPriceMovePctToAlert": 1.0
}
}
"enabled": false로 두면 일일 브리핑에는 교차 페어를 유지하면서 전용 알림만 끌 수 있습니다.
신호 읽는 법
교차 페어 추천은 교환 신호이므로 액션을 그에 맞게 읽어야 합니다.
| 액션 | 의미 |
|---|---|
| STRONG BUY / BUY | 표시 통화를 기준 통화로 바꾸기 좋은 시점 |
| HOLD / WAIT | 표시 통화 기준으로 기준 통화가 비쌈 — 기다릴 것 |
한 가지 유의할 점: 양쪽 모두 변동성이 크기 때문에 유리한 페어 가격은 기준 통화의 하락 또는 표시 통화의 상승 어느 쪽에서도 생길 수 있습니다. 데이터가 뒷받침되면 AI가 어느 쪽인지 밝히도록 요구합니다.
티커 형식
| 유형 | 형식 | 예시 |
|---|---|---|
| 미국 주식/ETF | 표준 심볼 | AAPL, VOO, QQQ, SMH |
| 암호화폐 | 단축 이름 | BTC, ETH (BTC-USD, ETH-USD로 자동 변환) |
| 해외 시장 | Yahoo Finance 심볼 | 0700.HK (텐센트), TM (도요타) |
팁
-
목표 비율의 합은 100%가 되어야 합니다. 그렇지 않더라도 격차 계산은 동작하지만 추천 매수 금액이 더 크거나 작게 나올 수 있습니다.
-
목표 외 보유 종목도 ETF 중첩 감지를 위해 추적됩니다. 예를 들어 AAPL을 보유하면 AAPL을 포함하는 ETF(VOO나 QQQ 등)의 매수 우선순위가 낮아집니다.
-
소수점 주식도 지원됩니다 — 암호화폐(
"BTC": 0.000188)나 소수점 주식 매수를 지원하는 증권사에 유용합니다. -
포트폴리오 가치는 실제 보유 자산 가치와 설정된 추정치 중 더 큰 값을 사용합니다. 현재 보유 자산이 아직 목표 배분을 향해 쌓이고 있는 중일 때도 격차 계산이 의미 있게 유지됩니다.
티커는 몇 개까지 추가할 수 있나요?
Richfolio는 집중된 포트폴리오에서 가장 잘 동작합니다. 하드코딩된 제한은 없지만, 무료 플랜 API 할당량과 다이제스트의 가독성이 실질적인 경계를 만듭니다. **권장 범위:** | 범위 | 평가 | |------|------| | **10–20** | 스위트 스폿 — 집중적이고 실행 가능하며 모든 무료 플랜이 여유로움 | | **20–30** | 여전히 좋음 — 관리 가능한 다이제스트, 제한 안에서 충분 | | **30–50** | 기술적으로는 동작하지만 일일 다이제스트가 시끄러워짐 | | **50+** | 권장하지 않음 (아래 참고) | **왜 50개 이상은 권장하지 않는가:** - **NewsAPI (1일 100건)** — 뉴스는 5개 티커 단위 배치로 가져옵니다. 50개 티커로 일일 + 장중을 실행하면 약 22건 사용; 100개 티커면 약 42건으로, refresh를 위한 여유가 거의 없습니다. - **AI 분석 품질** — Gemini는 한 번에 너무 많은 선택지를 평가할 때 추천이 희석됩니다. - **다이제스트 가독성** — 이메일이 길어지고 Telegram은 4,096자에서 잘립니다. 신호 대 잡음 비율이 급격히 떨어집니다. - **실행 시간** — 각 티커는 가격, 기술적 지표, 펀더멘털을 위한 Yahoo Finance 호출이 필요하므로 GitHub Actions 실행이 느려집니다. Gemini 무료 플랜은 이제 이 스택에서 가장 빡빡한 제약입니다: 2026년 8월에 발생한 실제 429 오류는 `gemini-2.5-flash`의 요청 할당량이 1일 약 20건이라고 알렸으며, richfolio의 스케줄(일일 1회 + 장중 5회)은 하루 13건 이상을 사용합니다 — 그래서 Gemini는 종종 할당량을 소진하고 이후 실행에서 빠지게 됩니다. 토큰 처리량은 문제가 아닙니다(100개 티커도 실행당 약 5.3만 토큰만 사용하며, 분당 25만 토큰 한도에 여유가 있습니다) — 발목을 잡는 것은 요청 *횟수*입니다. 그 외 실제 제약은 NewsAPI 할당량과 정보 과부하입니다. **TL;DR — 모든 무료 플랜에서 최고의 경험을 위해 ≤30개 티커를 목표로 하세요.**
업데이트
보유 종목이 변경될 때는 새로운 JSON 내용으로 CONFIG_JSON 변수를 업데이트하세요 (Settings → Secrets and variables → Actions → Variables 탭).