Skip to content

MajorShareholderClub/MarketFirstPreprocessHub

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

60 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

MarketFirstPreprocessHub

MarketFirstPreprocessHubλŠ” μΉ΄ν”„μΉ΄ ν† ν”½μ—μ„œ μˆ˜μ§‘ν•œ 데이터λ₯Ό 1μ°¨ μ „μ²˜λ¦¬ν•˜λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€. 이 ν΄λž˜μŠ€λŠ” 두 κ°€μ§€ μ£Όμš” μΉ΄ν…Œκ³ λ¦¬λ‘œ λ‚˜λ‰˜λ©°, 각각 Ticker와 Orderbook으둜 κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

image

πŸ“Š 클래슀 ꡬ쑰

classDiagram
    class RegionTickerOrderbookProcessor {
        +process_ticker()
        +_create_task()
        +_create_region_tasks()
    }
    
    class AsyncKafkaHandler {
        +initialize()
        +close()
        +processing_message()
    }
    
    class CommonConsumerSettingProcessor {
        +batch_process_messages()
        +start_processing_with_partition_management()
    }
    
    class BaseAsyncTickerProcessor {
        +data_task_a_crack_ticker()
        +get_timestamp()
        +get_data()
    }
    
    class BaseAsyncOrderbookProcessor {
        +calculate_total_bid_ask()
        +process_order_data()
        +orderbook_common_processing()
        +order_preprocessing()
    }
    
    class ExchangeProcessors {
        +PROCESSORS
        +get_processor()
    }
    
    class BatchProcessor {
        +process_current_batch()
        +_check_memory_usage()
        +_batch_send_kafka()
    }

    class TimeStacker {
        +add_item()
        +should_flush()
        +flush()
    }

    class PartitionManager {
        +start_monitoring()
        +stop_monitoring()
        +_monitor_partitions()
    }

    class AsyncLogger {
        +debug()
        +info()
        +warning()
        +error()
    }

    class MarketData {
        +_signed_change_price()
        +from_api()
    }

    class TickerPerformanceTester {
        +generate_test_data()
        +run_memory_test()
        +run_speed_test()
        +run_profiling()
    }

    class CoinMarketCollection {
        +region
        +market
        +coin_symbol
        +timestamp
        +data
    }

    class ProcessedOrderBook {
        +region
        +market
        +symbol
        +highest_bid
        +lowest_ask
        +total_bid_volume
        +total_ask_volume
        +timestamp
    }

    class KafkaS3Connector {
        +_get_topic_name()
    }

    class KafkaS3ConnectorConfig {
        +<attributes>
    }

    class BatchConfig {
        +<attributes>
    }

    class AsyncKafkaProducer {
        +init_producer()
        +stop()
    }

    class TimeStack {
        +add_item()
        +should_flush()
        +flush()
    }

    class StackConfig {
        +topic
        +partition
        +max_size
        +timeout_ms
    }

    class TimeStacker {
        +start()
        +stop()
        +add_item()
    }

    AsyncKafkaHandler <|-- CommonConsumerSettingProcessor
    CommonConsumerSettingProcessor <|-- BaseAsyncTickerProcessor
    CommonConsumerSettingProcessor <|-- BaseAsyncOrderbookProcessor
    
    RegionTickerOrderbookProcessor --> ExchangeProcessors
    RegionTickerOrderbookProcessor --> BaseAsyncTickerProcessor
    RegionTickerOrderbookProcessor --> BaseAsyncOrderbookProcessor
    
    CommonConsumerSettingProcessor --> BatchProcessor
    BatchProcessor --> TimeStacker
    AsyncKafkaHandler --> PartitionManager
    AsyncKafkaHandler --> AsyncLogger

    BaseAsyncTickerProcessor --> MarketData
    BaseAsyncOrderbookProcessor --> MarketData

    TickerPerformanceTester --> BaseAsyncTickerProcessor
    CoinMarketCollection --> MarketData
    ProcessedOrderBook --> BaseAsyncOrderbookProcessor

    KafkaS3Connector --> KafkaS3ConnectorConfig

    BatchProcessor --> BatchConfig
    BatchProcessor --> AsyncKafkaProducer

    TimeStacker --> TimeStack
    TimeStacker --> StackConfig
    TimeStacker --> TimeStack

    AsyncKafkaProducer --> KafkaS3Connector
Loading

πŸ“ˆ Ticker

  • λͺ©μ : λ‹€μ–‘ν•œ κ±°λž˜μ†Œμ—μ„œ μ œκ³΅ν•˜λŠ” 가격 정보λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μˆ˜μ§‘ν•˜κ³  κ°€κ³΅ν•˜μ—¬, 효율적으둜 데이터 뢄석 및 거래 결정을 μ§€μ›ν•©λ‹ˆλ‹€.
  • 지원 μ§€μ—­ 및 κ±°λž˜μ†Œ:
    • ν•œκ΅­:
      • μ—…λΉ„νŠΈ
      • 빗썸
      • μ½”λΉ—
      • 코인원
    • μ•„μ‹œμ•„:
      • OKX
      • Bybit
      • Gateio
    • 유럽 및 λ―Έκ΅­:
      • λ°”μ΄λ‚ΈμŠ€
      • 크라켄

πŸ“Š Orderbook

  • λͺ©μ : 각 κ±°λž˜μ†Œμ˜ μ£Όλ¬Έμ„œ 데이터λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μˆ˜μ§‘ν•˜κ³ , 이λ₯Ό λΆ„μ„ν•˜μ—¬ μ‹œμž₯의 μœ λ™μ„±κ³Ό 심리λ₯Ό νŒŒμ•…ν•˜λŠ” 데 도움을 μ€λ‹ˆλ‹€. 이 정보λ₯Ό 톡해 μ‚¬μš©μžλ“€μ€ 더 λ‚˜μ€ 거래 μ „λž΅μ„ μˆ˜λ¦½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 지원 μ§€μ—­ 및 κ±°λž˜μ†Œ:
    • ν•œκ΅­:
      • μ—…λΉ„νŠΈ
      • 빗썸
      • μ½”λΉ—
      • 코인원
    • μ•„μ‹œμ•„:
      • OKX
      • Bybit
      • Gateio
    • 유럽 및 λ―Έκ΅­:
      • λ°”μ΄λ‚ΈμŠ€
      • 크라켄

Group-id

  • 각 partition 별 μ§€μ •λœ νŒŒν‹°μ…˜μœΌλ‘œ μˆ˜λ™ μ‘°μž‘
  • ticker:
    • Ticker_group_id_Asia
    • Ticker_group_id_Korea
    • Ticker_group_id_NE
  • Orderbook:
    • Orderbook_group_id_Asia
    • Orderbook_group_id_Korea
    • Orderbook_group_id_NE

μ†Œλͺ¨ν•˜λŠ” ν† ν”½

  • Ticker:
    • asiaSocketDataIn-ticker (partition=3개)
    • koraSocketDataIn-ticker (partition=4개)
    • neSocketDataIn-ticker(partition=2개)
  • Orderbook:
    • asiaSocketDataIn-Orderbook (partition=3개)
    • koraSocketDataIn-Orderbook (partition=4개)
    • neSocketDataIn-Orderbook(partition=2개)

πŸ“₯ μ „μ²˜λ¦¬ν•˜κ³  λ‚œ ν›„ λ³΄λ‚΄λŠ” ν† ν”½

  • Ticker:

    • Region.Asia_TickerPreprocessing (partition=3개)
    • Region.Korea_TickerPreprocessing (partition=4개)
    • Region.NE_TickerPreprocessing(partition=2개)
  • Orderbook:

    • Region.Asia_OrderbookPreprocessing (partition=3개)
    • Region.Korea_OrderbookPreprocessing (partition=4개)
    • Region.NE_OrderbookPreprocessing (partition=2개)

πŸš€ Kafka Connector

  • 이 μ‹œμŠ€ν…œμ€ Kafka Connectorλ₯Ό 톡해 데이터λ₯Ό MinIO둜 μ „μ†‘ν•©λ‹ˆλ‹€.
  • 전솑 쑰건:
    • Ticker μ „μ²˜λ¦¬ ν† ν”½ 데이터: 20개 μˆ˜μ§‘ ν›„ 전솑
    • Orderbook μ „μ²˜λ¦¬ ν† ν”½ 데이터: 50개 μˆ˜μ§‘ ν›„ 전솑

πŸ“Š 데이터 포맷

  • Orderbook:
{
  "region": "Asia",
  "market": "OKX",
  "coin_symbol": "BTC",
  "highest_bid": 66609.22,
  "lowest_ask": 66619.98,
  "spread": 10.759999999994761,
  "total_bid_volume": 0.0016,
  "total_ask_volume": 0.259115,
  "timestamp": "2024-10-23 10:25:00.050791+00:00"
}
  • Ticker:
{
  "region": "Asia",
  "market": "OKX",
  "coin_symbol": "BTC",
  "timestamp": 1729678813578.0,
  "data": [
    {
      "opening_price": "67006.4",
      "trade_price": "66199.8",
      "max_price": "66568.8",
      "min_price": "67838.0",
      "prev_closing_price": "66568.8",
      "acc_trade_volume_24h": "7828.8",
      "signed_change_price": "0.8",
      "signed_change_rate": "0.000000"
    }
  ]
}

πŸš€ κΈ°λŠ₯

β€’	데이터 μˆ˜μ§‘: μΉ΄ν”„μΉ΄λ₯Ό 톡해 각 κ±°λž˜μ†Œμ—μ„œ μ‹€μ‹œκ°„μœΌλ‘œ 데이터λ₯Ό μˆ˜μ§‘ν•©λ‹ˆλ‹€.
β€’	데이터 μ •μ œ: μˆ˜μ§‘ν•œ 데이터λ₯Ό λΆ„μ„ν•˜κΈ° μš©μ΄ν•œ ν˜•νƒœλ‘œ λ³€ν™˜ν•˜κ³ , λΆˆν•„μš”ν•œ 정보λ₯Ό μ œκ±°ν•©λ‹ˆλ‹€.
β€’	μ—λŸ¬ 처리: 데이터 μˆ˜μ§‘ 및 처리 κ³Όμ •μ—μ„œ λ°œμƒν•  수 μžˆλŠ” λ‹€μ–‘ν•œ 였λ₯˜λ₯Ό 효과적으둜 μ²˜λ¦¬ν•˜μ—¬ μ‹œμŠ€ν…œμ˜ μ•ˆμ •μ„±μ„ λ†’μž…λ‹ˆλ‹€.

πŸš€ μ‚¬μš© 방법

poetry shell 

python main.py

전체 파일ꡬ쑰

β”œβ”€β”€ πŸ“„ README.md                 # ν”„λ‘œμ νŠΈ μ„€λͺ… λ¬Έμ„œ
β”œβ”€β”€ πŸ“ logs                      # 둜그 파일 μ €μž₯ 디렉토리
β”œβ”€β”€ 🐍 main.py                   # ν”„λ‘œκ·Έλž¨ μ§„μž…μ , μ›Ήμ†ŒμΌ“ ν΄λΌμ΄μ–ΈνŠΈ μ΄ˆκΈ°ν™”
β”œβ”€β”€ πŸ“¦ mq                        # λ©”μ‹œμ§€ 큐 κ΄€λ ¨ λͺ¨λ“ˆ
β”‚   β”œβ”€β”€ 🐍 dlt_producer.py       # Dead Letter Topic ν”„λ‘œλ“€μ„œ
β”‚   β”œβ”€β”€ ⚠️ exception             # μ˜ˆμ™Έ 처리 λͺ¨λ“ˆ
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   └── 🐍 m_exception.py    # μ‚¬μš©μž μ •μ˜ μ˜ˆμ™Έ 클래슀
β”‚   β”œβ”€β”€ πŸ› οΈ kafka_config.py       # Kafka μ„€μ • 관리
β”‚   β”œβ”€β”€ 🐍 m_comsumer.py         # Kafka 컨슈머 κ΅¬ν˜„
β”‚   β”œβ”€β”€ 🐍 m_producer.py         # Kafka ν”„λ‘œλ“€μ„œ κ΅¬ν˜„
β”‚   └── 🐍 partition_manager.py   # Kafka νŒŒν‹°μ…˜ λͺ¨λ‹ˆν„°λ§
β”œβ”€β”€ 🐍 order_ticker.py           # μ£Όλ¬Έμ„œ/티컀 처리 메인 클래슀
β”œβ”€β”€ πŸ“¦ poetry.lock               # Poetry μ˜μ‘΄μ„± 잠금 파일
β”œβ”€β”€ πŸ“„ pyproject.toml            # Poetry ν”„λ‘œμ νŠΈ μ„€μ •
β”œβ”€β”€ πŸ“œ requirements.txt          # ν”„λ‘œμ νŠΈ μ˜μ‘΄μ„± λͺ©λ‘
β”œβ”€β”€ 🐍 run_tests.py              # ν…ŒμŠ€νŠΈ μ‹€ν–‰ 슀크립트
β”œβ”€β”€ βš™οΈ setting                   # μ„€μ • 관리
β”‚   β”œβ”€β”€ πŸ› οΈ ticker.yml            # 티컀 처리 μ„€μ •
β”‚   └── πŸ› οΈ yml_load.py           # YAML μ„€μ • λ‘œλ“œ
β”œβ”€β”€ 🐍 sink_connector.py         # Kafka to S3 컀λ„₯ν„°
β”œβ”€β”€ πŸ“ src                       # μ†ŒμŠ€ μ½”λ“œ
β”‚   β”œβ”€β”€ πŸ“ common                # 곡톡 λͺ¨λ“ˆ
β”‚   β”‚   β”œβ”€β”€ πŸ“ admin             # 관리 κΈ°λŠ₯
β”‚   β”‚   β”‚   β”œβ”€β”€ 🐍 batch_processor.py  # 배치 처리 관리
β”‚   β”‚   β”‚   β”œβ”€β”€ πŸ“ logging       # λ‘œκΉ… κ΄€λ ¨
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ 🐍 logger.py        # 비동기 둜거
β”‚   β”‚   β”‚   β”‚   └── 🐍 logging_text.py  # 둜그 λ©”μ‹œμ§€ 포맷
β”‚   β”‚   β”‚   └── 🐍 time_stracker.py     # μ‹œκ°„ 기반 데이터 μŠ€νƒœν‚Ή
β”‚   β”‚   β”œβ”€β”€ 🐍 common_consumer.py  # 곡톡 컨슈머 μ„€μ •
β”‚   β”‚   β”œβ”€β”€ 🐍 common_orderbook.py # 곡톡 μ£Όλ¬Έμ„œ 처리
β”‚   β”‚   └── 🐍 common_ticker.py    # 곡톡 티컀 처리
β”‚   β”œβ”€β”€ πŸ› οΈ config.py             # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ •
β”‚   β”œβ”€β”€ πŸ“– orderbook             # μ£Όλ¬Έμ„œ 처리
β”‚   β”‚   β”œβ”€β”€ 🐍 asia_orderbook.py  # μ•„μ‹œμ•„ κ±°λž˜μ†Œ
β”‚   β”‚   β”œβ”€β”€ 🐍 korea_orderbook.py # ν•œκ΅­ κ±°λž˜μ†Œ
β”‚   β”‚   └── 🐍 ne_orderbook.py    # NE κ±°λž˜μ†Œ
β”‚   └── πŸ“Š ticker                # 티컀 처리
β”‚       β”œβ”€β”€ 🐍 korea_ticker.py    # ν•œκ΅­ κ±°λž˜μ†Œ
β”‚       └── 🐍 ne_asia_ticker.py  # NE/μ•„μ‹œμ•„ κ±°λž˜μ†Œ
β”œβ”€β”€ πŸ“ tests                     # ν…ŒμŠ€νŠΈ
β”‚   β”œβ”€β”€ 🐍 performance_test.py   # μ„±λŠ₯ ν…ŒμŠ€νŠΈ
β”‚   └── 🐍 run_performance_tests.py # ν…ŒμŠ€νŠΈ μ‹€ν–‰
└── πŸ“ type_model               # 데이터 λͺ¨λΈ
    β”œβ”€β”€ __init__.py
    β”œβ”€β”€ 🐍 config_model.py      # μ„€μ • λͺ¨λΈ
    β”œβ”€β”€ 🐍 kafka_model.py       # Kafka κ΄€λ ¨ λͺ¨λΈ
    β”œβ”€β”€ 🐍 orderbook_model.py   # μ£Όλ¬Έμ„œ 데이터 λͺ¨λΈ
    └── 🐍 ticker_model.py      # 티컀 데이터 λͺ¨λΈ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages