Kronos: 금육 μ‹œμž₯의 μ–Έμ–΄λ₯Ό μœ„ν•œ νŒŒμš΄λ°μ΄μ…˜ λͺ¨λΈ

KronosλŠ” 졜초의 μ˜€ν”ˆμ†ŒμŠ€ νŒŒμš΄λ°μ΄μ…˜ λͺ¨λΈλ‘œ, μ „ 세계 45개 μ΄μƒμ˜ κ±°λž˜μ†Œ λ°μ΄ν„°λ‘œ ν•™μŠ΅λœ 금육 μΊ”λ“€μŠ€ν‹±(K-line) λͺ¨λΈμž…λ‹ˆλ‹€.

πŸ“° μ†Œμ‹

  • 🚩 [2025.08.17] νŒŒμΈνŠœλ‹ 슀크립트λ₯Ό κ³΅κ°œν–ˆμŠ΅λ‹ˆλ‹€! Kronosλ₯Ό μ—¬λŸ¬λΆ„μ˜ μž‘μ—…μ— 맞게 μ μš©ν•΄ λ³΄μ„Έμš”.
  • 🚩 [2025.08.02] 논문이 arXiv에 κ²Œμž¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

πŸ“œ μ†Œκ°œ

KronosλŠ” 디코더 μ „μš© νŒŒμš΄λ°μ΄μ…˜ λͺ¨λΈ νŒ¨λ°€λ¦¬λ‘œ, 금육 μ‹œμž₯의 "μ–Έμ–΄"인 K-line μ‹œν€€μŠ€μ— νŠΉν™”λ˜μ–΄ 사전 ν•™μŠ΅λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ²”μš© TSFMκ³Ό 달리 KronosλŠ” 금육 λ°μ΄ν„°μ˜ κ³ μœ ν•œ 고작음 νŠΉμ„±μ„ μ²˜λ¦¬ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ 2단계 ν”„λ ˆμž„μ›Œν¬λ₯Ό ν™œμš©ν•©λ‹ˆλ‹€:

  1. νŠΉν™”λœ ν† ν¬λ‚˜μ΄μ €κ°€ 연속적이고 닀차원적인 K-line 데이터(OHLCV)λ₯Ό 계측적 이산 ν† ν°μœΌλ‘œ μ–‘μžν™”ν•©λ‹ˆλ‹€.
  2. λŒ€κ·œλͺ¨ μžκΈ°νšŒκ·€ Transformerκ°€ μ΄λŸ¬ν•œ ν† ν°μœΌλ‘œ 사전 ν•™μŠ΅λ˜μ–΄ λ‹€μ–‘ν•œ 양적 μž‘μ—…μ„ μœ„ν•œ 톡합 λͺ¨λΈλ‘œ κΈ°λŠ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

✨ 라이브 데λͺ¨

Kronos의 예츑 κ²°κ³Όλ₯Ό μ‹œκ°ν™”ν•˜λŠ” 라이브 데λͺ¨λ₯Ό μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€. μ›ΉνŽ˜μ΄μ§€λŠ” ν–₯ν›„ 24μ‹œκ°„ λ™μ•ˆμ˜ BTC/USDT 거래 μŒμ— λŒ€ν•œ μ˜ˆμΈ‘μ„ λ³΄μ—¬μ€λ‹ˆλ‹€.

πŸ‘‰ 라이브 데λͺ¨ λ°”λ‘œκ°€κΈ°

πŸ“¦ λͺ¨λΈ λͺ©λ‘

λ‹€μ–‘ν•œ μ»΄ν“¨νŒ… 및 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μš”κ΅¬μ— 맞좰 λ‹€μ–‘ν•œ μš©λŸ‰μ˜ 사전 ν›ˆλ ¨λœ λͺ¨λΈ νŒ¨λ°€λ¦¬λ₯Ό κ³΅κ°œν•©λ‹ˆλ‹€. λͺ¨λ“  λͺ¨λΈμ€ Hugging Face Hubμ—μ„œ λ°”λ‘œ μ΄μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ¨λΈν† ν¬λ‚˜μ΄μ €μ»¨ν…μŠ€νŠΈ κΈΈμ΄λ§€κ°œλ³€μˆ˜μ˜€ν”ˆμ†ŒμŠ€
Kronos-miniKronos-Tokenizer-2k20484.1Mβœ… NeoQuasar/Kronos-mini
Kronos-smallKronos-Tokenizer-base51224.7Mβœ… NeoQuasar/Kronos-small
Kronos-baseKronos-Tokenizer-base512102.3Mβœ… NeoQuasar/Kronos-base
Kronos-largeKronos-Tokenizer-base512499.2M❌

πŸš€ μ‹œμž‘ν•˜κΈ°

μ„€μΉ˜

  1. Python 3.10+λ₯Ό μ„€μΉ˜ν•œ ν›„ 쒅속성을 μ„€μΉ˜ν•˜μ„Έμš”:
pip install -r requirements.txt 

πŸ“ˆ 예츑 μƒμ„±ν•˜κΈ°

Kronos둜 μ˜ˆμΈ‘ν•˜λŠ” 것은 KronosPredictor 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°„λ‹¨ν•©λ‹ˆλ‹€. 데이터 μ „μ²˜λ¦¬, μ •κ·œν™”, 예츑 및 μ—­μ •κ·œν™”λ₯Ό μ²˜λ¦¬ν•˜λ―€λ‘œ μ›μ‹œ λ°μ΄ν„°μ—μ„œ μ˜ˆμΈ‘κΉŒμ§€ λͺ‡ μ€„μ˜ μ½”λ“œλ‘œ 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ€‘μš” μ°Έκ³ : Kronos-small 및 Kronos-base의 max_contextλŠ” 512μž…λ‹ˆλ‹€. μ΄λŠ” λͺ¨λΈμ΄ μ²˜λ¦¬ν•  수 μžˆλŠ” μ΅œλŒ€ μ‹œν€€μŠ€ κΈΈμ΄μž…λ‹ˆλ‹€. 졜적의 μ„±λŠ₯을 μœ„ν•΄ μž…λ ₯ 데이터 길이(즉, lookback)κ°€ 이 μ œν•œμ„ μ΄ˆκ³Όν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. KronosPredictorλŠ” 더 κΈ΄ μ»¨ν…μŠ€νŠΈμ— λŒ€ν•΄ μžλ™μœΌλ‘œ μž˜λ¦Όμ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

첫 번째 μ˜ˆμΈ‘μ„ μƒμ„±ν•˜λŠ” 단계별 κ°€μ΄λ“œμž…λ‹ˆλ‹€.

1. ν† ν¬λ‚˜μ΄μ €μ™€ λͺ¨λΈ λ‘œλ“œν•˜κΈ°

λ¨Όμ €, Hugging Face Hubμ—μ„œ 사전 ν›ˆλ ¨λœ Kronos λͺ¨λΈκ³Ό ν•΄λ‹Ή ν† ν¬λ‚˜μ΄μ €λ₯Ό λ‘œλ“œν•©λ‹ˆλ‹€.

from model import Kronos, KronosTokenizer, KronosPredictor # Load from Hugging Face Hub tokenizer = KronosTokenizer.from_pretrained("NeoQuasar/Kronos-Tokenizer-base") model = Kronos.from_pretrained("NeoQuasar/Kronos-small") 

2. 예츑기 μΈμŠ€ν„΄μŠ€ν™”ν•˜κΈ°

λͺ¨λΈ, ν† ν¬λ‚˜μ΄μ € 및 μ›ν•˜λŠ” μž₯치λ₯Ό μ „λ‹¬ν•˜μ—¬ KronosPredictor의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

# Initialize the predictor predictor = KronosPredictor(model, tokenizer, device="cuda:0", max_context=512) 

3. μž…λ ₯ 데이터 μ€€λΉ„ν•˜κΈ°

predict λ©”μ„œλ“œμ—λŠ” μ„Έ κ°€μ§€ μ£Όμš” μž…λ ₯이 ν•„μš”ν•©λ‹ˆλ‹€:

  • df: κ³Όκ±° K-line 데이터λ₯Ό ν¬ν•¨ν•˜λŠ” pandas DataFrame. ['open', 'high', 'low', 'close'] 열을 포함해야 ν•©λ‹ˆλ‹€. volumeκ³Ό amountλŠ” 선택 μ‚¬ν•­μž…λ‹ˆλ‹€.
  • x_timestamp: df의 κ³Όκ±° 데이터에 ν•΄λ‹Ήν•˜λŠ” νƒ€μž„μŠ€νƒ¬ν”„μ˜ pandas Series.
  • y_timestamp: μ˜ˆμΈ‘ν•˜λ €λŠ” 미래 κΈ°κ°„μ˜ νƒ€μž„μŠ€νƒ¬ν”„ pandas Series.
import pandas as pd # Load your data df = pd.read_csv("./data/XSHG_5min_600977.csv") df['timestamps'] = pd.to_datetime(df['timestamps']) # Define context window and prediction length lookback = 400 pred_len = 120 # Prepare inputs for the predictor x_df = df.loc[:lookback-1, ['open', 'high', 'low', 'close', 'volume', 'amount']] x_timestamp = df.loc[:lookback-1, 'timestamps'] y_timestamp = df.loc[lookback:lookback+pred_len-1, 'timestamps'] 

4. 예츑 μƒμ„±ν•˜κΈ°

predict λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ˜ˆμΈ‘μ„ μƒμ„±ν•©λ‹ˆλ‹€. ν™•λ₯ μ  μ˜ˆμΈ‘μ„ μœ„ν•΄ T, top_p, sample_count와 같은 λ§€κ°œλ³€μˆ˜λ‘œ μƒ˜ν”Œλ§ 과정을 μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# Generate predictions pred_df = predictor.predict( df=x_df, x_timestamp=x_timestamp, y_timestamp=y_timestamp, pred_len=pred_len, T=1.0, # Temperature for sampling top_p=0.9, # Nucleus sampling probability sample_count=1 # Number of forecast paths to generate and average ) print("Forecasted Data Head:") print(pred_df.head()) 

predict λ©”μ„œλ“œλŠ” μ œκ³΅ν•œ y_timestampλ₯Ό 인덱슀둜 ν•˜μ—¬ open, high, low, close, volume, amount에 λŒ€ν•œ μ˜ˆμΈ‘κ°’μ„ ν¬ν•¨ν•˜λŠ” pandas DataFrame을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

μ—¬λŸ¬ μ‹œκ³„μ—΄μ„ 효율적으둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ KronosλŠ” predict_batch λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•˜λ©°, 이λ₯Ό 톡해 μ—¬λŸ¬ 데이터셋에 λŒ€ν•΄ λ™μ‹œμ— 병렬 μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ—¬λŸ¬ μžμ‚°μ΄λ‚˜ 기간을 ν•œ λ²ˆμ— μ˜ˆμΈ‘ν•΄μ•Ό ν•  λ•Œ 특히 μœ μš©ν•©λ‹ˆλ‹€.

# Prepare multiple datasets for batch prediction df_list = [df1, df2, df3] # List of DataFrames x_timestamp_list = [x_ts1, x_ts2, x_ts3] # List of historical timestamps y_timestamp_list = [y_ts1, y_ts2, y_ts3] # List of future timestamps # Generate batch predictions pred_df_list = predictor.predict_batch( df_list=df_list, x_timestamp_list=x_timestamp_list, y_timestamp_list=y_timestamp_list, pred_len=pred_len, T=1.0, top_p=0.9, sample_count=1, verbose=True ) # pred_df_list contains prediction results in the same order as input for i, pred_df in enumerate(pred_df_list): print(f"Predictions for series {i}:") print(pred_df.head()) 

배치 μ˜ˆμΈ‘μ„ μœ„ν•œ μ£Όμš” μš”κ΅¬μ‚¬ν•­:

  • λͺ¨λ“  μ‹œκ³„μ—΄μ€ λ™μΌν•œ κ³Όκ±° 길이(룩백 μœˆλ„μš°)λ₯Ό κ°€μ Έμ•Ό ν•©λ‹ˆλ‹€.
  • λͺ¨λ“  μ‹œκ³„μ—΄μ€ λ™μΌν•œ 예츑 길이(pred_len)λ₯Ό κ°€μ Έμ•Ό ν•©λ‹ˆλ‹€.
  • 각 DataFrame은 ν•„μˆ˜ 열인 ['open', 'high', 'low', 'close']λ₯Ό 포함해야 ν•©λ‹ˆλ‹€.
  • volume 및 amount 열은 선택 사항이며, λˆ„λ½λœ 경우 0으둜 μ±„μ›Œμ§‘λ‹ˆλ‹€.

predict_batch λ©”μ„œλ“œλŠ” 효율적인 처리λ₯Ό μœ„ν•΄ GPU 병렬 처리λ₯Ό ν™œμš©ν•˜λ©°, 각 μ‹œκ³„μ—΄μ— λŒ€ν•΄ λ…λ¦½μ μœΌλ‘œ μ •κ·œν™” 및 μ—­μ •κ·œν™”λ₯Ό μžλ™μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

5. 예제 및 μ‹œκ°ν™”

데이터 λ‘œλ”©, 예츑, ν”Œλ‘œνŒ…μ„ ν¬ν•¨ν•˜λŠ” μ™„μ „ν•œ μ‹€ν–‰ κ°€λŠ₯ν•œ μŠ€ν¬λ¦½νŠΈλŠ” examples/prediction_example.pyλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

이 슀크립트λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ μœ μ‚¬ν•œ κ·Έλž˜ν”„κ°€ μƒμ„±λ˜μ–΄ μ‹€μ œ 데이터와 λͺ¨λΈ 예츑치λ₯Ό 비ꡐ할 수 μžˆμŠ΅λ‹ˆλ‹€:

Forecast Example

λ˜ν•œ Volume 및 Amount 데이터 없이 μ˜ˆμΈ‘μ„ μˆ˜ν–‰ν•˜λŠ” μŠ€ν¬λ¦½νŠΈλ„ μ œκ³΅ν•˜λ©°, μ΄λŠ” examples/prediction_wo_vol_example.pyμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ”§ μ‚¬μš©μž λ°μ΄ν„°λ‘œ νŒŒμΈνŠœλ‹ (A-Share μ‹œμž₯ μ˜ˆμ‹œ)

Kronosλ₯Ό μ‚¬μš©μž λ°μ΄ν„°μ…‹μœΌλ‘œ νŒŒμΈνŠœλ‹ν•˜κΈ° μœ„ν•œ μ™„μ „ν•œ νŒŒμ΄ν”„λΌμΈμ„ μ œκ³΅ν•©λ‹ˆλ‹€. μ˜ˆμ‹œλ‘œ 쀑ꡭ A-Share μ‹œμž₯ 데이터λ₯Ό Qlib으둜 μ€€λΉ„ν•˜κ³  κ°„λ‹¨ν•œ λ°±ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€.

λ©΄μ±… μ‘°ν•­: 이 νŒŒμ΄ν”„λΌμΈμ€ νŒŒμΈνŠœλ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•œ 데λͺ¨μš©μž…λ‹ˆλ‹€. λ‹¨μˆœν™”λœ μ˜ˆμ‹œμ΄λ©° ν”„λ‘œλ•μ…˜ μ€€λΉ„λœ 양적 νŠΈλ ˆμ΄λ”© μ‹œμŠ€ν…œμ΄ μ•„λ‹™λ‹ˆλ‹€. μ•ˆμ •μ μΈ μ•ŒνŒŒλ₯Ό λ‹¬μ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” 포트폴리였 μ΅œμ ν™” 및 리슀크 νŒ©ν„° 쀑성화와 같은 더 μ •κ΅ν•œ 기법이 ν•„μš”ν•©λ‹ˆλ‹€.

νŒŒμΈνŠœλ‹ ν”„λ‘œμ„ΈμŠ€λŠ” λ„€ κ°€μ§€ μ£Όμš” λ‹¨κ³„λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€:

  1. ꡬ성: 경둜 및 ν•˜μ΄νΌνŒŒλΌλ―Έν„° μ„€μ •
  2. 데이터 μ€€λΉ„: Qlib을 μ‚¬μš©ν•˜μ—¬ 데이터 처리 및 λΆ„ν• 
  3. λͺ¨λΈ νŒŒμΈνŠœλ‹: Tokenizer 및 Predictor λͺ¨λΈ νŒŒμΈνŠœλ‹
  4. λ°±ν…ŒμŠ€νŒ…: νŒŒμΈνŠœλ‹λœ λͺ¨λΈμ˜ μ„±λŠ₯ 평가

ν•„μˆ˜ 쑰건

  1. λ¨Όμ € requirements.txt에 λͺ…μ‹œλœ λͺ¨λ“  μ˜μ‘΄μ„±μ„ μ„€μΉ˜ν•˜μ„Έμš”.
  2. 이 νŒŒμ΄ν”„λΌμΈμ€ qlib에 μ˜μ‘΄ν•©λ‹ˆλ‹€. λ‹€μŒ λͺ…λ Ήμ–΄λ‘œ μ„€μΉ˜ν•˜μ„Έμš”:
     pip install pyqlib 
  3. Qlib 데이터λ₯Ό μ€€λΉ„ν•΄μ•Ό ν•©λ‹ˆλ‹€. 곡식 Qlib κ°€μ΄λ“œλ₯Ό 따라 데이터λ₯Ό λ‹€μš΄λ‘œλ“œν•˜κ³  λ‘œμ»¬μ— μ„€μ •ν•˜μ„Έμš”. 예제 μŠ€ν¬λ¦½νŠΈλŠ” 일별(daily) μ£ΌκΈ° 데이터λ₯Ό μ‚¬μš©ν•œλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€.

1단계: μ‹€ν—˜ κ΅¬μ„±ν•˜κΈ°

데이터, ν•™μŠ΅, λͺ¨λΈ κ²½λ‘œμ— λŒ€ν•œ λͺ¨λ“  섀정은 finetune/config.pyμ—μ„œ 쀑앙 μ§‘μ€‘ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ–΄λ–€ 슀크립트λ₯Ό μ‹€ν–‰ν•˜κΈ° 전에, μ‚¬μš©μž ν™˜κ²½μ— 맞게 λ‹€μŒ κ²½λ‘œλ“€μ„ μˆ˜μ •ν•˜μ„Έμš”:

  • qlib_data_path: 둜컬 Qlib 데이터 디렉토리 κ²½λ‘œμž…λ‹ˆλ‹€.
  • dataset_path: 처리된 ν›ˆλ ¨/검증/ν…ŒμŠ€νŠΈ 피클(pickle) 파일이 μ €μž₯될 λ””λ ‰ν† λ¦¬μž…λ‹ˆλ‹€.
  • save_path: λͺ¨λΈ 체크포인트λ₯Ό μ €μž₯ν•  κΈ°λ³Έ λ””λ ‰ν† λ¦¬μž…λ‹ˆλ‹€.
  • backtest_result_path: λ°±ν…ŒμŠ€νŒ… κ²°κ³Όλ₯Ό μ €μž₯ν•  λ””λ ‰ν† λ¦¬μž…λ‹ˆλ‹€.
  • pretrained_tokenizer_path 및 pretrained_predictor_path: 사전 ν›ˆλ ¨λœ λͺ¨λΈμ˜ κ²½λ‘œμž…λ‹ˆλ‹€ (둜컬 경둜 λ˜λŠ” Hugging Face λͺ¨λΈ 이름 μ‚¬μš© κ°€λŠ₯).

νŠΉμ • μž‘μ—…μ— 맞게 instrument, train_time_range, epochs, batch_size와 같은 λ‹€λ₯Έ λ§€κ°œλ³€μˆ˜λ“€λ„ μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Comet.ml을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ use_comet = False둜 μ„€μ •ν•˜μ„Έμš”.

2단계: 데이터셋 μ€€λΉ„ν•˜κΈ°

데이터 μ „μ²˜λ¦¬ 슀크립트λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”. 이 μŠ€ν¬λ¦½νŠΈλŠ” Qlib λ””λ ‰ν† λ¦¬μ—μ„œ μ›μ‹œ μ‹œμž₯ 데이터λ₯Ό λ‘œλ“œν•˜κ³ , μ²˜λ¦¬ν•œ λ’€ ν›ˆλ ¨, 검증, ν…ŒμŠ€νŠΈ μ„ΈνŠΈλ‘œ λΆ„ν• ν•˜μ—¬ pickle 파일둜 μ €μž₯ν•©λ‹ˆλ‹€.

python finetune/qlib_data_preprocess.py 

μ‹€ν–‰ ν›„μ—λŠ” μ„€μ • 파일의 dataset_path에 μ§€μ •λœ λ””λ ‰ν† λ¦¬μ—μ„œ train_data.pkl, val_data.pkl, test_data.pkl νŒŒμΌμ„ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

Step 3: νŒŒμΈνŠœλ‹ μ‹€ν–‰

νŒŒμΈνŠœλ‹ 과정은 두 λ‹¨κ³„λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€: ν† ν¬λ‚˜μ΄μ €λ₯Ό λ¨Όμ € νŒŒμΈνŠœλ‹ν•˜κ³ , κ·Έ λ‹€μŒ 예츑 λͺ¨λΈμ„ νŒŒμΈνŠœλ‹ν•©λ‹ˆλ‹€. 두 ν›ˆλ ¨ 슀크립트 λͺ¨λ‘ torchrun을 μ‚¬μš©ν•œ 닀쀑 GPU ν›ˆλ ¨μ„ μœ„ν•΄ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

3.1 ν† ν¬λ‚˜μ΄μ € νŒŒμΈνŠœλ‹

이 λ‹¨κ³„λŠ” ν† ν¬λ‚˜μ΄μ €λ₯Ό νŠΉμ • λ„λ©”μΈμ˜ 데이터 뢄포에 맞게 μ‘°μ •ν•©λ‹ˆλ‹€.

# Replace NUM_GPUS with the number of GPUs you want to use (e.g., 2) torchrun --standalone --nproc_per_node=NUM_GPUS finetune/train_tokenizer.py 

κ°€μž₯ μ„±λŠ₯이 쒋은 ν† ν¬λ‚˜μ΄μ € μ²΄ν¬ν¬μΈνŠΈλŠ” config.pyμ—μ„œ κ΅¬μ„±λœ 경둜(save_path와 tokenizer_save_folder_nameμ—μ„œ νŒŒμƒλ¨)에 μ €μž₯λ©λ‹ˆλ‹€.

3.2 예츑 λͺ¨λΈ νŒŒμΈνŠœλ‹

이 λ‹¨κ³„λŠ” 예츑 μž‘μ—…μ„ μœ„ν•΄ μ£Όμš” Kronos λͺ¨λΈμ„ νŒŒμΈνŠœλ‹ν•©λ‹ˆλ‹€.

# Replace NUM_GPUS with the number of GPUs you want to use (e.g., 2) torchrun --standalone --nproc_per_node=NUM_GPUS finetune/train_predictor.py 

κ°€μž₯ μ„±λŠ₯이 쒋은 예츑 λͺ¨λΈ μ²΄ν¬ν¬μΈνŠΈλŠ” config.pyμ—μ„œ κ΅¬μ„±λœ κ²½λ‘œμ— μ €μž₯λ©λ‹ˆλ‹€.

Step 4: λ°±ν…ŒμŠ€νŒ…μœΌλ‘œ 평가

λ§ˆμ§€λ§‰μœΌλ‘œ, νŒŒμΈνŠœλ‹λœ λͺ¨λΈμ„ ν‰κ°€ν•˜κΈ° μœ„ν•΄ λ°±ν…ŒμŠ€νŒ… 슀크립트λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”. 이 μŠ€ν¬λ¦½νŠΈλŠ” λͺ¨λΈμ„ λ‘œλ“œν•˜κ³ , ν…ŒμŠ€νŠΈ μ„ΈνŠΈμ— λŒ€ν•΄ 좔둠을 μˆ˜ν–‰ν•˜λ©°, 예츑 μ‹ ν˜Έ(예: 예츑된 가격 변동)λ₯Ό μƒμ„±ν•˜κ³ , κ°„λ‹¨ν•œ μƒμœ„ K개 μ „λž΅ λ°±ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

# Specify the GPU for inference python finetune/qlib_test.py --device cuda:0 

이 μŠ€ν¬λ¦½νŠΈλŠ” μ½˜μ†”μ— μƒμ„Έν•œ μ„±λŠ₯ 뢄석을 좜λ ₯ν•˜κ³ , μ•„λž˜μ™€ μœ μ‚¬ν•œ 벀치마크 λŒ€λΉ„ μ „λž΅μ˜ λˆ„μ  수읡λ₯  곑선을 λ³΄μ—¬μ£ΌλŠ” ν”Œλ‘―μ„ μƒμ„±ν•©λ‹ˆλ‹€:

Backtest Example

πŸ’‘ 데λͺ¨μ—μ„œ ν”„λ‘œλ•μ…˜μœΌλ‘œ: μ€‘μš”ν•œ 고렀사항

  • μ›μ‹œ μ‹ ν˜Έ vs 순수 μ•ŒνŒŒ: 이 데λͺ¨μ—μ„œ λͺ¨λΈμ΄ μƒμ„±ν•˜λŠ” μ‹ ν˜ΈλŠ” μ›μ‹œ μ˜ˆμΈ‘κ°’μž…λ‹ˆλ‹€. μ‹€μ œ 양적 투자 μ›Œν¬ν”Œλ‘œμ—μ„œλŠ” 일반적으둜 μ΄λŸ¬ν•œ μ‹ ν˜Έλ₯Ό 포트폴리였 μ΅œμ ν™” λͺ¨λΈμ— μž…λ ₯ν•©λ‹ˆλ‹€. 이 λͺ¨λΈμ€ 일반적인 μœ„ν—˜ μš”μΈ(예: μ‹œμž₯ 베타, 규λͺ¨ 및 κ°€μΉ˜μ™€ 같은 μŠ€νƒ€μΌ νŒ©ν„°)에 λŒ€ν•œ λ…ΈμΆœμ„ μ€‘μ„±ν™”ν•˜κΈ° μœ„ν•œ μ œμ•½ 쑰건을 μ μš©ν•˜μ—¬ **"순수 μ•ŒνŒŒ"**λ₯Ό λΆ„λ¦¬ν•˜κ³  μ „λž΅μ˜ 견고성을 ν–₯μƒμ‹œν‚΅λ‹ˆλ‹€.
  • 데이터 처리: 제곡된 QlibDataset은 μ˜ˆμ‹œμž…λ‹ˆλ‹€. λ‹€λ₯Έ 데이터 μ†ŒμŠ€λ‚˜ ν˜•μ‹μ˜ 경우 데이터 λ‘œλ”© 및 μ „μ²˜λ¦¬ λ‘œμ§μ„ μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ „λž΅ 및 λ°±ν…ŒμŠ€νŠΈ λ³΅μž‘μ„±: μ—¬κΈ°μ„œ μ‚¬μš©λœ λ‹¨μˆœ Top-K μ „λž΅μ€ 기본적인 μ‹œμž‘μ μž…λ‹ˆλ‹€. ν”„λ‘œλ•μ…˜ μˆ˜μ€€μ˜ μ „λž΅μ€ 일반적으둜 포트폴리였 ꡬ성, 동적 ν¬μ§€μ…˜ 사이징, μœ„ν—˜ 관리(예: μ†μ ˆλ§€/읡절 κ·œμΉ™)λ₯Ό μœ„ν•œ 더 λ³΅μž‘ν•œ λ‘œμ§μ„ ν¬ν•¨ν•©λ‹ˆλ‹€. λ˜ν•œ, 높은 μ •ν™•λ„μ˜ λ°±ν…ŒμŠ€νŠΈλŠ” 거래 λΉ„μš©, μŠ¬λ¦¬ν”Όμ§€, μ‹œμž₯ 영ν–₯을 μ„Έμ‹¬ν•˜κ²Œ λͺ¨λΈλ§ν•˜μ—¬ μ‹€μ œ μ„±λŠ₯을 더 μ •ν™•ν•˜κ²Œ μΆ”μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

πŸ“ AI 생성 주석: finetune/ 디렉토리 λ‚΄μ˜ λ§Žμ€ μ½”λ“œ 주석은 μ„€λͺ… λͺ©μ μœΌλ‘œ AI μ–΄μ‹œμŠ€ν„΄νŠΈ(Gemini 2.5 Pro)에 μ˜ν•΄ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 도움이 λ˜λ„λ‘ μž‘μ„±λ˜μ—ˆμ§€λ§Œ λΆ€μ •ν™•ν•œ λ‚΄μš©μ΄ 포함될 수 μžˆμŠ΅λ‹ˆλ‹€. μ½”λ“œ 자체λ₯Ό λ…Όλ¦¬μ˜ 확정적인 좜처둜 κ°„μ£Όν•  것을 ꢌμž₯ν•©λ‹ˆλ‹€.

πŸ“– 인용

연ꡬ에 Kronosλ₯Ό μ‚¬μš©ν•˜μ‹œλŠ” 경우, 저희 논문을 μΈμš©ν•΄ μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€:

@misc{shi2025kronos, title={Kronos: A Foundation Model for the Language of Financial Markets}, author={Yu Shi and Zongliang Fu and Shuo Chen and Bohan Zhao and Wei Xu and Changshui Zhang and Jian Li}, year={2025}, eprint={2508.02739}, archivePrefix={arXiv}, primaryClass={q-fin.ST}, url={https://arxiv.org/abs/2508.02739}, } 

πŸ“œ λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” MIT λΌμ΄μ„ μŠ€μ— 따라 λΌμ΄μ„ μŠ€κ°€ λΆ€μ—¬λ©λ‹ˆλ‹€.

shiyu-coder/Kronos의 μ½˜ν…μΈ λ₯Ό 기반으둜 ν•˜λ©°, zdocμ—μ„œ λ²ˆμ—­λ˜μ—ˆμŠ΅λ‹ˆλ‹€.