화면이 보여주는 값을 그대로 기계가 읽습니다. 시그널 목록과 그 목록의 과거 성과, 지금 어떤 규칙이 먹히는 장인지까지 같은 계산을 씁니다.
빨리 써보기
curl -s "https://maedong.kr/api/v1/regime" | jq '.label, .lists[:3]'
curl -s "https://maedong.kr/api/v1/signals?signal=high-52w&limit=5"
curl -s "https://maedong.kr/api/v1/signals/high-52w/stats?window=recent60"
curl -s "https://maedong.kr/api/v1/stock/005930/signals?from=2026-01-01"
curl -s "https://maedong.kr/api/v1/market"
기준일은 전일 마감입니다. 모든 응답의 meta 에 data_date·lag_business_days·next_update 가 들어 있으니 실시간으로 오해하지 않게 그 값을 그대로 쓰세요.
단위 규약
이름만 보고 단위를 알 수 있게
| 접미사 | 뜻 | 예 |
_pct | 퍼센트(%)avg_pct · change_pct · win_rate_pct | avg_pct · change_pct · win_rate_pct |
_pp | 퍼센트포인트(%p)excess_pp · yield_gap_pp | excess_pp · yield_gap_pp |
_krw | 원close_krw · value_krw · market_cap_krw | close_krw · value_krw · market_cap_krw |
| 없음 | 배수·건수·비율 그 자체per · pbr · n | per · pbr · n |
관계식 — excess_pp = avg_pct - market_avg_pct. 목록 평균에서 같은 날들의 전 종목 평균(거래대금 10억 이상)을 뺀 값입니다. 판정은 전체 기간 20거래일 excess_pp 가 ±0.5%p 를 벗어나는지로 매깁니다.
시그널 목록 29종
has_stats 가 false 면 과거 성과를 집계하지 않습니다
저PER · 고배당 두 목록만 성과를 집계하지 않습니다. 재무(PER·배당)로 뽑는 목록이라 그날 알 수 있었던 재무가 아니라 지금 재무로 과거를 다시 세우면 미래 정보가 섞입니다 — 그 편향을 없앨 수 있을 때까지 숫자를 내놓지 않습니다.
상태 플래그
가격제한폭이 없는 종목을 다른 종목과 같은 자에 놓지 않도록
| code | label | 뜻 |
liquidation |
정리매매가격제한폭이 없다 — 등락률을 다른 종목과 같은 자에 놓을 수 없다 |
가격제한폭이 없다 — 등락률을 다른 종목과 같은 자에 놓을 수 없다 |
delisting |
상장폐지 예정상장폐지 절차가 진행 중이다 — 아직 제한폭 안에서 거래된다 |
상장폐지 절차가 진행 중이다 — 아직 제한폭 안에서 거래된다 |
halted |
거래정지거래소가 막았다 — 정지 공시의 최신 상태가 정지이고 그날 거래량도 0인 종목 |
거래소가 막았다 — 정지 공시의 최신 상태가 정지이고 그날 거래량도 0인 종목 |
no_trade |
무거래그날 한 주도 거래되지 않았다 — 정지일 수도 있고 유동성이 없을 수도 있다 |
그날 한 주도 거래되지 않았다 — 정지일 수도 있고 유동성이 없을 수도 있다 |
한 종목에 여러 개가 붙을 수 있습니다. 라벨은 다듬을 수 있지만 code 는 계약이라 바꾸지 않습니다 — 분기는 code 로 하세요.
liquidation 종목은 상승률·하락률 순위에서 제외하고 응답의 excluded 에 따로 담습니다.
GET /api/v1/signals
기준일의 목록 구성원. signal 을 생략하면 목록별 건수만 준다
| 파라미터 | 설명 |
date | 기준일 YYYY-MM-DD. 생략하면 최신 거래일 |
signal | 목록 slug. 생략하면 건수 색인 |
limit | 1~200, 기본 50 |
cursor | 이전 응답의 next_cursor 를 그대로 |
curl -s "https://maedong.kr/api/v1/signals?signal=value-surge&limit=2"
{
"date": "2026-09-11",
"signal": "value-surge",
"label": "거래대금 급증",
"rule": "최근 20영업일 평균 거래대금보다 2배 이상 돈이 몰린 종목. 매매 주체는 몰라도 돈이 몰린 곳은 보인다.",
"metric_label": "20일 평균 대비",
"count": 2,
"items": [
{
"code": "203650",
"name": "드림시큐리티",
"market": "KOSDAQ",
"close_krw": 2620,
"change_pct": 23.29,
"value_krw": 129820956244,
"market_cap_krw": 266500000000,
"metric_text": "×73.6",
"flags": []
},
{
"code": "217820",
"name": "원익피앤이",
"market": "KOSDAQ",
"close_krw": 2820,
"change_pct": 6.62,
"value_krw": 33060657268,
"market_cap_krw": 133800000000,
"metric_text": "×68.2",
"flags": []
}
],
"next_cursor": "2",
"excluded": [],
"meta": {
"as_of": "2026-09-13T22:10:36+09:00",
"data_date": "2026-09-11",
"lag_business_days": 1,
"next_update": "9월 15일(화) 오전 11시 30분 전후",
"source": "공공데이터포털 금융위원회 시세 · 한국은행 ECOS · 금융감독원 DART · 한국투자증권 Open API(수급·공매도·프로그램매매)",
"license": "출처 표기 후 자유 사용 · 재배포 시 원출처를 함께 표기해 주세요",
"disclaimer": "전일 마감 데이터이며 투자 참고용입니다. 특정 종목의 매수·매도를 권유하지 않습니다."
}
}
next_cursor 가 null 이면 마지막 페이지다. excluded 에는 순위에서 뺀 정리매매 종목이 담긴다.
GET /api/v1/signals/{signal}/stats
그 목록에 오른 종목이 이후 어땠는지
| 파라미터 | 설명 |
window | all(전체 기간) 또는 recent60(최근 60시그널일) |
curl -s "https://maedong.kr/api/v1/signals/value-surge/stats"
{
"signal": "value-surge",
"label": "거래대금 급증",
"window": "all",
"since": "2020-01-03",
"signal_days": 1623,
"verdict": "시장 하회",
"verdict_band_pp": 0.5,
"horizons": [
{
"trading_days": 1,
"n": 32456,
"avg_pct": -0.16,
"median_pct": -0.7,
"win_rate_pct": 41.6,
"market_avg_pct": 0.01,
"market_win_rate_pct": 44.7,
"excess_pp": -0.17
},
{
"trading_days": 5,
"n": 32449,
"avg_pct": -0.67,
"median_pct": -2.33,
"win_rate_pct": 39.1,
"market_avg_pct": 0.03,
"market_win_rate_pct": 44.9,
"excess_pp": -0.7
},
{
"trading_days": 20,
"n": 32459,
"avg_pct": -1.28,
"median_pct": -5.04,
"win_rate_pct": 36.6,
"market_avg_pct": 0.16,
"market_win_rate_pct": 43.3,
"excess_pp": -1.44
}
],
"distribution_20d": {
"median": -5.04,
"q1": -14.55,
"q3": 5.84,
"min": -93.0,
"max": 581.1
},
"basis": "시그널이 난 날 종가에 사고 N거래일 뒤 종가에 판 것으로 계산 · 거래비용 미반영",
"meta": {
"as_of": "2026-09-13T22:10:36+09:00",
"data_date": "2026-09-11",
"lag_business_days": 1,
"next_update": "9월 15일(화) 오전 11시 30분 전후",
"source": "공공데이터포털 금융위원회 시세 · 한국은행 ECOS · 금융감독원 DART · 한국투자증권 Open API(수급·공매도·프로그램매매)",
"license": "출처 표기 후 자유 사용 · 재배포 시 원출처를 함께 표기해 주세요",
"disclaimer": "전일 마감 데이터이며 투자 참고용입니다. 특정 종목의 매수·매도를 권유하지 않습니다."
}
}
horizons 는 1·5·20거래일이다. median_pct 는 평균이 대박 한 건에 끌릴 때를 위해 같이 준다.
GET /api/v1/stock/{code}/signals
이 종목이 언제 어느 목록에 올랐고 그 뒤 어땠는지
| 파라미터 | 설명 |
from / to | 기간 YYYY-MM-DD |
limit | 1~200, 기본 100 |
curl -s "https://maedong.kr/api/v1/stock/005930/signals?limit=2"
{
"code": "005930",
"name": "삼성전자",
"market": "KOSPI",
"flags": [],
"count": 2,
"hits": [
{
"date": "2026-09-10",
"signal": "market-cap",
"label": "시가총액 상위",
"ret_1d_pct": null,
"ret_5d_pct": null,
"ret_20d_pct": null
},
{
"date": "2026-09-10",
"signal": "value-top",
"label": "거래대금 상위",
"ret_1d_pct": null,
"ret_5d_pct": null,
"ret_20d_pct": null
}
],
"note": "수익률이 null 이면 아직 그 거래일이 지나지 않았습니다.",
"meta": {
"as_of": "2026-09-13T22:10:36+09:00",
"data_date": "2026-09-11",
"lag_business_days": 1,
"next_update": "9월 15일(화) 오전 11시 30분 전후",
"source": "공공데이터포털 금융위원회 시세 · 한국은행 ECOS · 금융감독원 DART · 한국투자증권 Open API(수급·공매도·프로그램매매)",
"license": "출처 표기 후 자유 사용 · 재배포 시 원출처를 함께 표기해 주세요",
"disclaimer": "전일 마감 데이터이며 투자 참고용입니다. 특정 종목의 매수·매도를 권유하지 않습니다."
}
}
ret_*_pct 가 null 이면 아직 그 거래일이 지나지 않았다.
GET /api/v1/regime
지금 어떤 규칙이 먹히는 장인가
| 파라미터 | 설명 |
as_of | 기준일. 생략하면 최신 |
window | 비교 창(거래일) 20~250, 기본 60 |
curl -s "https://maedong.kr/api/v1/regime"
{
"window_trading_days": 60,
"signal_window": {
"from": "2026-05-18",
"to": "2026-08-13"
},
"settle_lag_trading_days": 20,
"label": "전 축이 시장 하회 · 대형·우량이 가장 덜 밀렸다",
"axes": [
{
"name": "대형·우량",
"excess_pp": -1.2,
"lists": 3,
"note": "큰 종목으로 돈이 몰릴 때 먹힌다"
},
{
"name": "반전",
"excess_pp": -2.14,
"lists": 5,
"note": "빠진 것을 담을 때 먹힌다"
},
{
"name": "돌파 추종",
"excess_pp": -6.63,
"lists": 3,
"note": "신고가·연속 상승을 따라갈 때 먹힌다"
},
{
"name": "단기 과열 추격",
"excess_pp": -7.59,
"lists": 4,
"note": "급등 당일에 담을 때 먹힌다"
}
],
"lists": [
{
"signal": "low-52w",
"label": "52주 신저가",
"n": 842,
"avg_pct": -1.14,
"excess_pp": 5.26
},
{
"signal": "accumulation",
"label": "안 올랐는데 계속 산",
"n": 185,
"avg_pct": 10.14,
"excess_pp": 5.24
},
{
"signal": "low52-surge",
"label": "신저가 부근 거래대금 급증",
"n": 624,
"avg_pct": -2.41,
"excess_pp": 3.9
},
{
"signal": "short-surge",
"label": "공매도 비중 급증",
"n": 295,
"avg_pct": 1.15,
"excess_pp": 3.57
},
{
"signal": "market-cap",
"label": "시가총액 상위",
"n": 1220,
"avg_pct": -3.38,
"excess_pp": 2.83
},
{
"signal": "short-top",
"label": "공매도 비중 상위",
"n": 860,
"avg_pct": -0.84,
"excess_pp": 1.39
},
{
"signal": "retail-only",
"label": "개인만 받는",
"n": 600,
"avg_pct": 4.8,
"excess_pp": 0.93
},
{
"signal": "distribution",
"label": "올랐는데 계속 판",
"n": 220,
"avg_pct": 5.03,
"excess_pp": 0.13
},
{
"signal": "disparity-cold",
"label": "20일선 과냉",
"n": 1188,
"avg_pct": -6.14,
"excess_pp": 0.07
},
{
"signal": "drawdown-52w",
"label": "52주 고점 대비 낙폭 상위",
"n": 1220,
"avg_pct": -7.0,
"excess_pp": -0.79
},
{
"signal": "both-buy",
"label": "기관·외국인 동반 순매수",
"n": 600,
"avg_pct": 2.43,
"excess_pp": -1.44
},
{
"signal": "foreign-buy-streak",
"label": "외국인 연속 순매수",
"n": 560,
"avg_pct": 3.15,
"excess_pp": -1.93
},
{
"signal": "losers",
"label": "하락률 상위",
"n": 1214,
"avg_pct": -8.35,
"excess_pp": -2.14
},
{
"signal": "program-buy",
"label": "프로그램 순매수 상위",
"n": 1000,
"avg_pct": -6.18,
"excess_pp": -2.29
},
{
"signal": "value-top",
"label": "거래대금 상위",
"n": 1220,
"avg_pct": -8.93,
"excess_pp": -2.72
},
{
"signal": "large-gainers",
"label": "대형주 상승률 상위",
"n": 1220,
"avg_pct": -9.93,
"excess_pp": -3.72
},
{
"signal": "streak-up",
"label": "연속 상승",
"n": 1078,
"avg_pct": -10.18,
"excess_pp": -3.97
},
{
"signal": "surge-pullback",
"label": "급증 뒤 되돌림",
"n": 1031,
"avg_pct": -10.25,
"excess_pp": -3.98
},
{
"signal": "value-surge",
"label": "거래대금 급증",
"n": 1220,
"avg_pct": -11.87,
"excess_pp": -5.66
},
{
"signal": "gap-up",
"label": "갭 상승",
"n": 1212,
"avg_pct": -12.07,
"excess_pp": -5.86
},
{
"signal": "dry-surge",
"label": "조용하다 돈이 몰린",
"n": 449,
"avg_pct": -13.14,
"excess_pp": -6.93
},
{
"signal": "momentum-12-1",
"label": "12-1 모멘텀 상위",
"n": 1220,
"avg_pct": -13.4,
"excess_pp": -7.19
},
{
"signal": "gainers",
"label": "상승률 상위",
"n": 1219,
"avg_pct": -13.64,
"excess_pp": -7.43
},
{
"signal": "high-52w",
"label": "52주 신고가",
"n": 650,
"avg_pct": -15.47,
"excess_pp": -8.73
},
{
"signal": "disparity-hot",
"label": "20일선 과열",
"n": 1218,
"avg_pct": -15.49,
"excess_pp": -9.28
},
{
"signal": "turnover",
"label": "회전율 상위",
"n": 1220,
"avg_pct": -17.62,
"excess_pp": -11.41
},
{
"signal": "turnover-gapdown",
"label": "과열 뒤 갭하락",
"n": 184,
"avg_pct": -20.48,
"excess_pp": -15.11
}
],
"basis": "모든 목록이 같은 거래일 창을 본다 · 20거래일이 지나 성과가 확정된 시그널만",
"coverage": {
"lists_total": 29,
"lists_scored": 27,
"excluded": [
"저PER",
"고배당"
],
"not_settled": [],
"note": "전체 29종 중 27종. 저PER·고배당은 재무 기반이라 뺐습니다 — 과거 날짜에 지금의 재무를 쓰면 그때는 알 수 없던 것을 쓰는 셈이라(미래 참조) 성적이 실제보다 좋게 나옵니다."
},
"meta": {
"as_of": "2026-09-13T22:10:36+09:00",
"data_date": "2026-09-11",
"lag_business_days": 1,
"next_update": "9월 15일(화) 오전 11시 30분 전후",
"source": "공공데이터포털 금융위원회 시세 · 한국은행 ECOS · 금융감독원 DART · 한국투자증권 Open API(수급·공매도·프로그램매매)",
"license": "출처 표기 후 자유 사용 · 재배포 시 원출처를 함께 표기해 주세요",
"disclaimer": "전일 마감 데이터이며 투자 참고용입니다. 특정 종목의 매수·매도를 권유하지 않습니다."
}
}
label 은 축 사이 격차가 2%p 이상일 때만 붙는다(아니면 null — 혼재). 1위 축도 시장을 못 이겼으면 '우위' 라고 쓰지 않는다.
GET /api/v1/market
기준일의 지수·시장 폭·밸류에이션·매크로
| 파라미터 | 설명 |
date | 기준일. 생략하면 최신 거래일 |
curl -s "https://maedong.kr/api/v1/market"
{
"date": "2026-09-11",
"indices": [
{
"market": "KOSPI",
"close": 6909.91,
"change_pct": -1.76,
"value_krw": 19674136000000
},
{
"market": "KOSDAQ",
"close": 820.64,
"change_pct": -1.95,
"value_krw": 6414353000000
}
],
"breadth": {
"up": 976,
"down": 1477,
"unchanged": 197,
"limit_up": 12,
"limit_down": 1
},
"valuation": [
{
"market": "KOSPI",
"per": 23.7,
"pbr": 1.86,
"div_yield_pct": 1.05,
"yield_gap_pp": -2.96,
"coverage_pct": 96.7,
"percentiles": {
"per": {
"percentile_pct": 66,
"n": 1582,
"since": "2020-04-01"
},
"pbr": {
"percentile_pct": 96,
"n": 1582,
"since": "2020-04-01"
},
"div_yield": {
"percentile_pct": 4,
"n": 1582,
"since": "2020-04-01"
},
"yield_gap": {
"percentile_pct": 1,
"n": 1582,
"since": "2020-04-01"
}
}
},
{
"market": "KOSDAQ",
"per": 74.6,
"pbr": 1.57,
"div_yield_pct": 1.36,
"yield_gap_pp": -2.65,
"coverage_pct": 96.8,
"percentiles": {
"per": {
"percentile_pct": 76,
"n": 1341,
"since": "2020-04-01"
},
"pbr": {
"percentile_pct": 46,
"n": 1582,
"since": "2020-04-01"
},
"div_yield": {
"percentile_pct": 32,
"n": 1582,
"since": "2020-04-01"
},
"yield_gap": {
"percentile_pct": 1,
"n": 1582,
"since": "2020-04-01"
}
}
}
],
"macro": [
{
"series": "usdkrw",
"label": "원/달러",
"value": 1338.2,
"unit": "원",
"change": 0.02,
"change_text": "+0.02%",
"held": false,
"date": "2026-09-11"
},
{
"series": "jpykrw",
"label": "원/100엔",
"value": 866.5,
"unit": "원",
"change": -0.68,
"change_text": "-0.68%",
"held": false,
"date": "2026-09-11"
},
{
"series": "eurkrw",
"label": "원/유로",
"value": 1553.5,
"unit": "원",
"change": -0.22,
"change_text": "-0.22%",
"held": false,
"date": "2026-09-11"
},
{
"series": "ktb3y",
"label": "국고채 3년",
"value": 4.014,
"unit": "%",
"change": 0.084,
"change_text": "+0.084%p",
"held": false,
"date": "2026-09-11"
},
{
"series": "ktb10y",
"label": "국고채 10년",
"value": 4.54,
"unit": "%",
"change": 0.087,
"change_text": "+0.087%p",
"held": false,
"date": "2026-09-11"
},
{
"series": "base_rate",
"label": "기준금리",
"value": 3.0,
"unit": "%",
"change": 0.25,
"change_text": "+0.25%p · 8/27부터 동결",
"held": true,
"date": "2026-09-09"
},
{
"series": "gold",
"label": "금 1g",
"value": 191500.0,
"unit": "원",
"change": 0.26,
"change_text": "+0.26%",
"held": false,
"date": "2026-09-10"
},
{
"series": "btc",
"label": "비트코인",
"value": 10515.0,
"unit": "만원",
"change": 0.42,
"change_text": "+0.42%",
"held": false,
"date": "2026-09-11"
}
],
"value_vs_20d_avg": 0.84,
"meta": {
"as_of": "2026-09-13T22:10:36+09:00",
"data_date": "2026-09-11",
"lag_business_days": 1,
"next_update": "9월 15일(화) 오전 11시 30분 전후",
"source": "공공데이터포털 금융위원회 시세 · 한국은행 ECOS · 금융감독원 DART · 한국투자증권 Open API(수급·공매도·프로그램매매)",
"license": "출처 표기 후 자유 사용 · 재배포 시 원출처를 함께 표기해 주세요",
"disclaimer": "전일 마감 데이터이며 투자 참고용입니다. 특정 종목의 매수·매도를 권유하지 않습니다."
}
}
percentiles 는 2020-04 이후 분포에서의 위치다. coverage_pct 는 재무가 있는 종목의 시총 비중.
한도와 오류
| 요청 한도 | IP 당 분당 60회. 넘으면 429 와 Retry-After: 60 을 줍니다. |
| 인증 | 없습니다. 공개 데이터라 키를 받지 않습니다. |
| CORS | Access-Control-Allow-Origin: * — 브라우저에서 바로 호출할 수 있습니다. |
| 캐시 | Cache-Control: public, max-age=300. 기준일이 하루 한 번 바뀌므로 그 이상 자주 부를 이유가 없습니다. |
| 오류 | {"detail": "..."} 형태의 JSON. 404(없는 목록·종목·날짜) · 400(형식) · 422(범위) · 429(한도). |
계산 방법
성과는 매일 그 목록 상위 20종목을 그날 종가에 사서 N거래일 뒤 종가에 판 것으로 계산합니다. 거래비용·세금·슬리피지는 반영하지 않습니다.
비교 기준(market_avg_pct)은 같은 날들의 거래대금 10억 이상 전 종목 평균입니다 — 같은 날을 비교해야 장 전체가 오른 날의 상승이 시그널의 공으로 잡히지 않습니다.
/regime 은 모든 목록이 같은 거래일 창을 봅니다. 목록마다 '최근 60시그널일' 을 따로 잡으면 서로 다른 기간을 비교하게 되기 때문입니다. 20거래일이 지나 성과가 확정된 시그널만 세므로 창의 끝은 기준일보다 20거래일 앞입니다.
더 자세한 규칙은 규칙과 검증, 용어는 용어집에 있습니다. 과거 성과는 미래 수익을 보장하지 않습니다.
MCP 서버
AI 어시스턴트가 이 데이터를 직접 읽는 통로
Claude 같은 어시스턴트에 커스텀 커넥터로 붙이면, 화면을 긁지 않고 같은 계산 결과를 바로 받습니다.
주소는 아래 한 줄이고 인증은 없습니다.
https://maedong.kr/mcp
POST 전용입니다(JSON-RPC 2.0). 브라우저로 열면 405 가 뜨는 것이 정상입니다 —
MCP 규격이 SSE 를 제공하지 않는 서버에 GET 405 를 요구합니다.
도구가 주는 값은 공개 읽기 API와 같은 계산을 씁니다 — 두 곳에서 답이 갈리지 않습니다.
출처 표기
출처 표기 후 자유 사용 · 재배포 시 원출처를 함께 표기해 주세요
원 데이터는 공공데이터포털 금융위원회 시세, 한국은행 ECOS, 금융감독원 DART 입니다. 시그널 정의·성과 집계·레짐 판정은 maedong.kr 이 계산한 값입니다. 표기 예:
출처: maedong.kr (원 데이터: 공공데이터포털 금융위원회 시세 · 한국은행 ECOS · 금융감독원 DART)
문의 [email protected] · 대량 사용이나 필드 추가가 필요하면 알려주세요.