Створення потужного портфеля криптоактивів за допомогою багатофакторних стратегій: попередня обробка даних

Преамбула

В останній частині книги ми опублікували першу статтю із серії «Побудова сильного портфеля криптоактивів за допомогою багатофакторних стратегій» – «Теоретичні основи», а це друга стаття – «Попередня обробка даних».

Дані повинні бути оброблені до/після розрахунку факторних даних, а також до того, як буде перевірено валідність одного фактора. Попередня обробка конкретних даних передбачає обробку повторюваних значень, викидів/відсутніх значень/екстремальних значень, нормалізацію та частоту даних.

I. Повторювані значення

Визначення, пов’язані з даними:

  • Ключ: Вказує на унікальний індекс. Наприклад. Для даних з усіма датами всіх токенів ключем є “token_id/contract_address - date”
  • Value: Об’єкт, який індексується ключем, називається “value”.

Діагностика повторюваних значень починається з розуміння того, як «повинні» виглядати дані. Зазвичай дані мають вигляд:

  1. Дані часових рядів. Ключ – «Час». Наприклад, дані про ціну за 5 років для одного токена
  2. Дані поперечного перерізу. Ключовим є «індивідуальний». eg.2023.11.01 дані про ціни всіх токенів на крипторинку в цей день
  3. Панельні. Ключовим моментом є поєднання «індивід-час». Наприклад, дані про ціни всіх токенів з 01.01.2019 по 01.2023.11.01 за чотири роки.

Принцип: Після того, як ви визначили індекс (ключ) даних, ви можете знати, на якому рівні дані не повинні мати повторюваних значень.

Метод перевірки:

  1. розм. DataFrame.duplicated(subset=[ключ1, ключ2, …])

    1. Перевірте кількість повторюваних значень: pd. DataFrame.duplicated(subset=[ключ1, ключ2, …]). sum()
    2. Зразок, щоб побачити повторювані зразки: df[df.duplicated(subset=[…])]. sample(), а потім за допомогою df.loc виберіть усі повторювані зразки, що відповідають індексу
  2. pd.merge(df1, df2, on=[ключ1, ключ2, …], indicator=True, validate=‘1:1’)

    1. Додайте параметр індикатора до функції горизонтального об’єднання, і буде згенеровано поле _merge, і ви можете використовувати dfm[‘_merge’].value_counts() для перевірки кількості вибірок з різних джерел після злиття
    2. Додайте параметр validate, щоб перевірити, чи індекси в об’єднаному наборі даних відповідають очікуванням (1 до 1, 1 до багатьох або багато до багатьох, останній випадок насправді не валідується). Якщо результати не відповідають очікуванням, буде повідомлено про помилку, і виконання буде перервано.

2. Викиди/Відсутні значення/Екстремальні значення

Поширені причини викидів:

  1. Крайні випадки. Наприклад, якщо ціна токена становить 0,000001$ або токен з ринковою вартістю лише $500 000, невелика зміна матиме коефіцієнт повернення в десятки разів.
  2. Характеристики даних. Наприклад, якщо дані про ціну токена завантажені з 1 січня 2020 року, то розрахувати дані про повернення на 1 січня 2020 року, природно, неможливо, тому що немає ціни закриття попереднього дня.
  3. Помилка даних. Постачальники даних неминуче будуть робити помилки, наприклад, записувати 12 юанів за токен як 1,2 юаня за токен.

Принципи обробки викидів та відсутніх значень:

  1. Видалити. Викиди, які не можуть бути обґрунтовано виправлені або виправлені, можуть бути розглянуті для видалення.
  2. Замінити. Він часто використовується для обробки екстремальних значень, таких як вінзоризація або логарифми (які зазвичай не використовуються).
  3. Наповнення. Для відсутніх значень ви також можете розглянути можливість заповнення розумним способом, поширені методи включають середні значення (або ковзні середні), інтерполяцію, заповнення 0 df.fillna(0), вперед df.fillna(‘ffill’)/зворотне заповнення df.fillna(‘bfill’) тощо, щоб перевірити, чи правильні припущення, від яких залежить відступи.

Машинне навчання слід використовувати з обережністю для засипки та ризику упередженого погляду вперед

Обробка екстремальних значень:

  1. Процентильний метод.

Розташувавши порядок від найменшого до найбільшого, замініть дані, що перевищують мінімальні та максимальні пропорції, критичними даними. Для даних з великою кількістю історичних даних цей метод є відносно грубим і незастосовним, а примусове видалення фіксованої частини даних може призвести до певного відсотка втрат.

2,3σ / метод потрійного стандартного відхилення

Стандартне відхилення σфактор відображає ступінь дисперсії розподілу даних фактора, тобто волатильність. Діапазон μ±3×σ використовувався для ідентифікації та заміни викидів у наборі даних, і близько 99,73% даних потрапили в діапазон. Передумова цього методу полягає в тому, що дані про фактори повинні підкорятися нормальному розподілу, тобто X∼N(μ,σ2).

де μ=∑ⁿi₌₁⋅Xi/N, σ²=∑ⁿi₌₁=(xi-μ)²/n, прийнятний діапазон значень факторів становить [μ−3×σ, μ+3×σ].

Внесіть наведені нижче корективи до всіх факторів у діапазоні даних.

用多因子策略构建强大的加密资产投资组合 :数据预处理篇

Недоліком цього методу є те, що дані, які зазвичай використовуються в кількісній сфері, такі як ціни на акції та ціни на токени, часто показують сплеск і товстий хвіст, що не відповідає припущенню про нормальний розподіл, і в цьому випадку велика кількість даних буде неправильно визначена як викиди за допомогою методу 3σ.

3.绝对值差中位数法(Середнє абсолютне відхилення, MAD)

Метод заснований на медіанному та абсолютному зміщенні, що робить оброблювані дані менш чутливими до екстремальних значень або викидів. Більш надійні, ніж методи, засновані на середньому і стандартному відхиленні.

Медіана абсолютного відхилення MAD=медіана ( ∑ⁿi₌₁(Xi - Xmedian) )

Обґрунтований діапазон значень факторів - [Xmedian-n×MAD, Xmedian + n×MAD]. Внесіть наведені нижче корективи до всіх факторів у діапазоні даних.

用多因子策略构建强大的加密资产投资组合 :数据预处理篇

Обробка крайніх значень даних про фактори

клас Extreme(об’єкт): def init(s, ini_data): s.ini_data = ini_data

def three_sigma(s,n=3):
    mean = s.ini_data.mean()
    std = s.ini_data.std()
    низький = середнє значення - n*std
    високий = середнє + n*std
    повертає np.clip(s.ini_data,low,high)

def mad(s, n=3):
    медіана = s.ini_data.median()
    mad_median = abs(s.ini_data - медіана).median()
    високий = медіана + n * mad_median
    низький = медіана - n * mad_median
    повертає np.clip(s.ini_data, низький, високий)

Def квантиль(s,l = 0,025, h = 0,975):
    low = s.ini_data.quantile(l)
    high = s.ini_data.quantile(h)
    повертає np.clip(s.ini_data, низький, високий)

III. Стандартизація

  1. Стандартизація Z-критерію
  • Умова: X N (μ, σ)
  • У зв’язку з використанням стандартного відхилення, цей метод чутливий до викидів у даних

x’i=(x−μ)/σ=(X−mean(X)))/std(X)2.Масштабування min-Max

Перетворення кожного множника в дані в інтервалі (0,1) дозволяє порівнювати дані різних розмірів або діапазонів, але не змінює розподіл всередині даних і не становить суму 1.

  • Чутливий до викидів через врахування максимальних мінімумів Уніфікований параметр, що дає змогу порівнювати дані з різних параметрів.

x’i=(xi−min(x))/max(x)-min(x)3.排序百分位(Rank Scaling)

Перетворюйте функції даних на їхні рейтинги та перетворюйте ці рейтинги на бали від 0 до 1, як правило, їхні процентилі в наборі даних. *

Оскільки на ранжування не впливають викиди, цей метод не чутливий до викидів. **

  • Замість того, щоб підтримувати абсолютну відстань між точками в даних, вони перетворюються на відносне ранжування.

NormRanki=(Rankₓi−min(Rankₓi))/max(Rankₓ)−min(Rankₓ)=Rankₓi/N

min(Rankₓ)=0, де N – загальна кількість точок даних в інтервалі.

Нормалізація даних факторів

клас Scale(об’єкт): def init(s, ini_data,date): s.ini_data = ini_data s.date = дата

def zscore(s):
    mean = s.ini_data.mean()
    std = s.ini_data.std()
    return s.ini_data.sub(mean).div(std)
  
def maxmin(s):
    min = s.ini_data.min()
    max = s.ini_data.max()
    return s.ini_data.sub(min).div(max - min)

def normRank(s):
    # Ранжувати вказані стовпці, method='min' означає, що одне і те ж значення буде мати однаковий ранг, а не середній ранг
    ranks = s.ini_data.rank(method='min') 
    return ranks.div(ranks.max())

По-четверте, частота даних

Іноді отримані дані зустрічаються не так часто, як нам потрібно для нашого аналізу. Наприклад, якщо рівень аналізу щомісячний, а частота вихідних даних щоденна, потрібно використовувати «даунсемплінг», тобто агреговані дані щомісячні.

ДАУНСЕМПЛІНГ

Це означає агрегування даних у колекції в рядок даних, наприклад, об’єднання щоденних даних у щомісячні дані. При цьому необхідно враховувати характеристики кожного агрегованого показника, а звичайними операціями є:

  • Перше значення/останнє значення
  • Середнє/медіанне значення *стандартне відхилення

Upsample

Це означає розбиття рядка даних на кілька рядків даних, наприклад, річні дані для щомісячного аналізу. Зазвичай це просте повторення, а іноді необхідно агрегувати річні дані пропорційно кожному місяцю.

Falcon (/) — це нове покоління інвестиційної інфраструктури Web3, яке базується на багатофакторній моделі, яка допомагає користувачам «вибирати», «купувати», «управляти» та «продавати» криптоактиви. Falcon був інкубований компанією Lucida у червні 2022 року.

Більше контенту доступно для відвідування

Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • Прокоментувати
  • Репост
  • Поділіться
Прокоментувати
Додати коментар
Додати коментар
Немає коментарів
  • Закріпити