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

Преамбула

В последней части книги мы опубликовали первую статью из серии «Построение сильного портфеля криптоактивов с помощью многофакторных стратегий» - Теоретические основы, а это вторая статья - Предварительная обработка данных.

Данные должны быть обработаны до/после расчета факторных данных, а также перед проверкой валидности одного фактора. Специфическая предварительная обработка данных включает в себя обработку повторяющихся значений, выбросов/отсутствующих значений/экстремальных значений, нормализацию и частоту данных.

I. Повторяющиеся значения

Определения, связанные с данными:

  • Ключ: Указывает на уникальный индекс. Например. Для данных со всеми датами всех токенов ключ “token_id/contract_address - date”
  • Значение: Объект, который индексируется по ключу, называется “значением”.

Диагностика повторяющихся значений начинается с понимания того, как «должны» выглядеть данные. Обычно данные представлены в виде:

  1. Данные временных рядов. Ключ – «Время». Например, данные о ценах на один токен за 5 лет
  2. Данные поперечного сечения. Ключ – «индивидуальный». Например, 2023.11.01 Ценовые данные всех токенов на рынке криптовалют в этот день
  3. Панель. Ключевым моментом является комбинация «индивидуальное время». Например, данные о ценах всех токенов с 2019.01.01 по 2023.11.01 за четыре года.

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

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

  1. ПД. DataFrame.duplicated(subset=[key1, key2, …])

    1. Проверьте количество повторяющихся значений: pd. DataFrame.duplicated(subset=[key1, key2, …]). sum()
    2. Образец для просмотра дубликатов сэмплов: df[df.duplicated(subset=[…])]. sample(), а затем используйте df.loc для выбора всех повторяющихся выборок, соответствующих индексу
  2. pd.merge(df1, df2, on=[key1, key2, …], 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. Замените. Он часто используется для обработки экстремальных значений, таких как Winsorizing или логарифмы (которые обычно не используются).
  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
    return 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
    return np.clip(s.ini_data, low, high)

Def квантиль(s,l = 0.025, h = 0.975):
    low = s.ini_data.quantile(l)
    high = s.ini_data.quantile(h)
    return np.clip(s.ini_data, low, high)

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=(Рангₓi−min(Рангₓi))/max(Рангₓ)−min(Рангₓ)=Рангₓi/N

min(Rankₓ)=0, где N — общее количество точек данных в интервале.

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

class 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 normРанг(и):
    # Ранжировать указанные столбцы, method='min' означает, что одно и то же значение будет иметь тот же ранг, а не средний ранг
    ranks = s.ini_data.rank(method='min') 
    return ranks.div(ranks.max())

В-четвертых, частота передачи данных

Иногда получаемые данные не так часто, как нам нужно для нашего анализа. Например, если уровень анализа ежемесячный, а частота сырых данных ежедневная, нужно использовать «даунсемплинг», то есть агрегированные данные ежемесячные.

ПОНИЖЕНИЕ ДИСКРЕТИЗАЦИИ

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

  • Первое/последнее значение
  • Среднее/медианное значение *стандартное отклонение

Upsample

Это относится к разделению строки данных на несколько строк данных, таких как годовые данные для ежемесячного анализа. Обычно это простое повторение, а иногда необходимо агрегировать годовые данные пропорционально каждому месяцу.

Falcon ( /) — это новое поколение инвестиционной инфраструктуры Web3, основанное на многофакторной модели, которая помогает пользователям «выбирать», «покупать», «управлять» и «продавать» криптоактивы. Сокол был инкубирован Люсидой в июне 2022 года.

Более подробная информация доступна для посещения

Посмотреть Оригинал
На этой странице может содержаться сторонний контент, который предоставляется исключительно в информационных целях (не в качестве заявлений/гарантий) и не должен рассматриваться как поддержка взглядов компании Gate или как финансовый или профессиональный совет. Подробности смотрите в разделе «Отказ от ответственности» .
  • Награда
  • комментарий
  • Репост
  • Поделиться
комментарий
Добавить комментарий
Добавить комментарий
Нет комментариев
  • Закрепить