sol’s blog

밈코인 성공 예측 분석1

sol-commits
sol-commitsApr 29, 2025
밈코인 성공 예측 분석1

    데이터

    train.csv
    test_unlabeled.csv
    chunk*.csv
    dune_token_info.csv
    token_info_onchain_divers.csv

    ‼ 데이터 row 수가 많아서 모두 merge 하면 csv 가 제대로 저장이 안되는 문제

    베이스라인

    • 수치형 데이터 통곗값(mean, std, min, max, sum)으로 모델 학습

    제외 컬럼

    • chunk_slot_min
      • 첫 거래의 slot은 코인이 생성된 slot 과 같음
    • dune_decimals

    성능 향상 전략

    베이스라인 train 데이터 예측 확률로 그룹화

    • 실패 코인은 대부분 예측 확률이 0.0 근처(거의 확신)
    • 성공 코인 은 두 극단(0.0 근처 / 1.0 근처) 모두 존재
      • → 혼동되는 성공 코인이 분명히 있음

    → 예측 확률 기반으로 3개 그룹으로 나눠서 접근

    그룹조건설명
    성공 확신 코인(TP)실제로 성공 & 예측 확률 > 0.9모델이 “성공이라고 본” 실패 코인
    성공 혼동 코인(FN) ⭐️실제로 성공 & 예측 확률 ≤ 0.1모델이 “거의 실패라고 본” 성공 코인
    실패 코인(TN)실제로 실패 & 예측 확률 < 0.1모델이 “실패라고 본” 실패 코인
    예측 확률 기반으로 3개 그룹 나누는 코드

    성공 혼동 코인(FN)을 위한 미니 모델 학습

    성공 혼동 코인(FN)실패 코인(TN) 만 모델을 돌리면 잘 예측할까?

    → 구분을 거의 못 함.

    TN 언더샘플링 미니 모델

    tn 언더샘플링 후, fn tn으로만 학습했을 때 feature importance
    tn 언더샘플링 후, fn tn으로만 학습했을 때 feature importance
    • 베이스라인의 Logloss가 낮은 이유는 코인 실패 데이터의 수가 워낙 많고 실패를 잘 예측하기 때문.
    • TN을 언더샘플링 해버리면 TN의 개수가 많이 없어져서 logloss가 커질 수 밖에 없음

    class weights 적용 미니 모델

    undersampling vs class_weights 모델의 feature importances

    어떤 모델의 feature importances가 더 의미 있을까?

    undersamplingclass_weights
    데이터가 균형이기 때문에 FN을 잘 맞추는 특징이 무엇인지에만 집중된 모델
    - 단점: TN 쪽 정보는 대부분 버려짐
    FN을 잘 맞추는 특성과 전체 예측에 도움이 되는 변수가 혼합됨
    TN 예측 성능을 유지하면서도 FN도 어느정도 고려하는 균형 잡힌 모델
    두 모델에서 Top 20 중요 변수 교집합 → 모델 학습
    Top20 중요 변수 합집합 → 모델 학습
    이중 기반의 하이브리드 모델 설계

    거래 수 비교

    거래 수가 1개인 코인들을 어떻게 성공이라고 판단했을까?

    • 잔고 관련 지표
      • 성공으로 확신한 코인들은 토큰 잔액이 적고, 솔라나 잔액이 많음
    거래 수가 1개인 코인들은 대부분 creator가 구매한 것
    거래 수가 1개인 코인들은 대부분 creator가 구매한 것

    wallet_success_rate

    각 거래 내역에서 거래를 한 지갑(사람)이 투자한 코인의 성공률을 계산하여 wallet_success_rate 라는 feature를 만들고, 각 코인 별로 갖고 있는 wallet_success_rate 값을 mean, std, min, max, sum 으로 집계를 내려서 최종 feature 로 추가

    😱 문제점

    train set에 없는 wallet이 test set에 등장하는 경우가 많아 test logloss는 더 안 좋아짐

    test 에 있는 코인 478832개 중 56988개에서 wallet_success_rate 가 결측치
    test 에 있는 코인 478832개 중 56988개에서 wallet_success_rate 가 결측치

    • test prediction 기반 wallet success rate 보강한다면?
      1. train 기반 wallet_success_rate 계산(기존 방식)
      1. test 에서 predicted_probability ≥ threshold(e.g 0.95)인 코인에서 참여한 wallet을 success로 간주
      1. 이 wallet들을 포함해 전체 wallet_success_rate를 재계산
      1. 그걸 다시 test에 집계 특성(mean, std, min, max, sum)으로 넣기

    → 보강 후로 0근처로 확률이 늘어나면서 negative 예측이 확신을 가지게 된 것으로 보임

    → FP(실패인데 성공으로 예측)이 줄어들은 것 같음.

    wallet 정보를 보강하기 위한 API 들을 알아봄 → 내용 정리하기

    creator_success_rate

    토큰 발행자가 발행한 코인 중 성공한 코인의 비율

    wallet_success_rate 과 마찬가지로 testset 에는 학습 시킬 때는 몰랐던, test 데이터에서 처음 등장하는 토큰 발행자가 있다는 문제점이 있다.. 처음 등장하는 지갑(거래자)보다 처음 등장하는 토큰 발행자가 더 많다 🥲 

    creator 가 몇 번째로 발행한 코인인지?

    • 코인 발행자들은 대부분 1-2개 정도 발행했다. (대부분의 토큰이 각 크리에이터의 첫 번째 토큰임)
    • 평균적인 순서는 TP > FN > TN
      • 표준편차도 TP가 가장 높음 → TP 그룹은 경험이 적은 크리에이터부터 많은 크리에이터까지 다양하게 분포
    • 최댓값을 봤을 때는, 실패 코인이라도 토큰을 많이 발행한 사람은 존재하지만 평균은 낮은 편

    거래가 1건이면서 성공한 코인들은 경력자인 크리에이터가 발행한 코인일까?

    거래 수에 따른 예측 그룹 분포

    • 실패 코인 중에서 총 거래수가 490인 코인을 살펴보면
      • 거래 내역

        매수 488건, 매도 2건

      • unique wallet 수 221개

        한 지갑이 최대로 많이 참여한 거래는 3건

    wallet_tx_ratio

    계산식

    거래한 지갑이 해당 토큰의 거래에 얼마나 비중을 차지하는지 나타내는 변수

    → 이와 비슷하게 거래량 편중도 지수(거래 편중도, transaction concentration index)를 만들 수 있음

    최초 거래를 누가 했는지

    크리에이터가 아닌 외부인이 최초로 거래를 시작했을 때, 실패할 확률이 높음

    code
    예측 그룹구성 비율
    실패 코인(TN)61.52%
    성공 혼동 코인(FN)20.07%
    성공 확신 코인(TP)18.40%

    솔라나 비율

    유동성 풀에서 솔라나가 차지하는 비율


    • cretor_success_rate가 높은 크리에이터들의 공통적인 토큰 설계 특성 비교

    1. 초기 거래 패턴 차이
      • FN 코인은 초기에 빠르게 거래가 몰리는 구조?
      • 예: 첫 10개 블록 내 거래 수, unique wallet 수 등
    1. 가격 정보가 있다면 가격 변화 속도
      • FN은 가격 펌핑이 있고 TN은 그렇지 않은 패턴이 있을 수 있음
    1. 구매/판매 지표의 변형
      • buy_minus_sell_ratio의 시계열 변화 (초기엔 매수 많고 이후 매도 몰리는 등)
    1. 지갑의 행위 유형 분석
      • 같은 지갑이 여러 코인에서 반복적으로 활동 → rug 가능성?
      • 반복해서 실패한 지갑이 포함된 경우
    1. 시간 기반 집중도
      • FN은 특정 시간대에 거래가 몰려있는지, TN은 흩어져 있는지

    펌핑 속도 - 얼마나 빨리 사람들을 모았는가?

    code
    time_to_first_10_tx : 첫 거래 ~ 10번째 거래까지 걸린 시간
    • 계산식: chunk_block_time 기준 정렬 후 상위 10개 간 시간 차
    slot_to_first_10_SOL: 10 SOL 채우는 데 걸린 slot 차
    • 계산식: chunk_slot 정렬 후 누적 매수 거래량이 10 SOL 넘는 시점까지의 솔롯 차(chunk_direction = buy일 때, chunk_quote_coin_amount 의 합)
    avg_time_per_tx_early: 초기 10건의 평균 거래 간격
    • 계산식: 첫 10개 chunk_block_time 간격 평균
    initial_burst_ratio: 처음 10건이 전체 거래에서 차지하는 비중
    • 계산식: mint별 총 거래 수 대비 상위 10개 비중

    참여의 다양성 - 다양한 지갑들이 참여했는가?

    unique_wallet_per_10_tx: 처음 10건에 참여한 지갑 수
    creator_tx_ratio: crator가 거래한 비중(지갑 하나가 다 사면 사기 가능성)
    wallet_entropy: 지갑별 거래 비율의 Shannon entropy(높을수록 다양함)

    구매/판매 균형

    buy_sell_ratio: 매수 수 / 매도 수
    quote_coin_growth_rate: 시간에 따른 구매량 증가 속도
    sell_delay_avg: 처음 매수한 지갑이 처음 파는 데까지 걸린 평균 시간

    본딩 커브 진척도 추정 - 실제 졸업 기준 접근 여부

    est_total_SOL_input: 현재까지 들어온 SOL의 누적합
    curve_coverage_ratio: est_SOL_input / expected_total_SOL

    시도해봤던 것들

    데이터 불균형 해소

    SMOTE

    TN, FN, TP 모두 줄었음

    • FN을 줄이고 싶은데, 오버샘플링을 사용하면 FP가 늘어나면서 실패 logloss가 급상승함
    • 특히 실패 클래스가 훨씬 많아, 실패 예측의 정확도가 logloss에 더 큰 영향을 줌