LUCIDA:如何利用多因數策略構建強大的加密資產投資組合(數據預處理篇)

序言

書接上回,我們發佈了《用多因數策略構建強大的加密資產投資組合》系列文章的第一篇 - 理論基礎篇,本篇是第二篇 - 數據預處理篇。

在計算因數數據前/后,以及測試單因數的有效性之前,都需要對相關數據進行處理。 具體的數據預處理涉及重複值、異常值/缺失值/極端值、標準化和數據頻率的處理。

一、重複值

資料相關定義:

  • 鍵(Key):表示一個獨一無二的索引。 eg. 對於一份有全部 token 所有日期的數據,鍵是“token_id/contract_address - 日期”
  • 值(Value):被鍵索引的對象就稱之為“值”。

診斷重複值的首先需要理解數據「應當」是什麼樣子。 通常資料的形式有:

  1. 時間序列數據(Time Series)。 鍵是“時間”。 eg.單個 token 5 年的價格數據
  2. 橫截面數據(Cross Section)。 鍵是“個體”。 eg.2023.11.01 當日 crypto 市場所有 token 的價格數據
  3. 面板數據(Panel)。 鍵是「個體-時間」的組合。 eg.從 2019.01.01-2023.11.01 四年所有 token 的價格數據。

原則:確定了數據的索引(鍵),就能知道數據應該在什麼層面沒有重複值。

檢查方式:

鈀。DataFrame.duplicated(subset=[鍵 1, 鍵 2, …])

  • 檢查重複值的數量:pd. DataFrame.duplicated(subset=[key 1, key 2, …]). sum()
  • 抽樣看重複的樣本:df[df.duplicated(subset=[…])]. sample()找到樣本后,再用 df.loc 選出該索引對應的全部重複樣本

pd.merge(df 1, df 2, on=[鍵 1, 鍵 2, …], 指標=True, validate=‘1: 1’)

  • 在橫向合併的函數中,加入 indicator 參數,會生成_merge 字段,對其使用 dfm[‘_merge’].value_counts()可以檢查合併後不同來源的樣本數量
  • 加入 validate 參數,可以檢驗合併的數據集中索引是否如預期一般(1 to 1、 1 to many 或 many to many,其中最後一種情況其實等於不需要驗證)。 如果與預期不符,合併過程會報錯並中止執行。

二、異常值/缺失值/極端值

產生異常值的常見原因:

  1. **極端情況。 **比如 token 價格 0.000001 $或市值僅 50 萬美元的 token,隨便變動一點,就會有數十倍的回報率。
  2. **資料特性。 **比如 token 價格數據從 2020 年 1 月 1 日開始下載,那麼自然無法計算出 2020 年 1 月 1 日的回報率數據,因為沒有前一日的收盤價。
  3. **資料錯誤。 **數據供應商難免會犯錯,比如將 12 元每 token 記錄成 1.2 元每 token。

針對異常值和缺失值處理原則:

  • 刪除。 對於無法合理更正或修正的異常值,可以考慮刪除。
  • 替換。 通常用於對極端值的處理,比如縮尾(Winsorizing)或取對數(不常用)。
  • 填充。 對於缺失值也可以考慮以合理的方式填充,常見的方式包括均值(或移動平均)、插值(Interpolation)、填 0 df.fillna( 0)、向前 df.fillna(‘ffill’)/向後填充 df.fillna(‘bfill’)等,要考慮填充所依賴的假設是否合。

機器學習慎用向後填充,有Look-ahead bias的風險

針對極端值的處理方法:

1.百分位法。

通過將順序從小到大排列,將超過最小和最大比例的數據替換為臨界的數據。 對於歷史數據較豐富的數據,該方法相對粗略,不太適用,強行刪除固定比例的數據可能造成一定比例的損失。

2.3σ / 三倍標準差法

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

對數據範圍內的所有因數做出如下調整:

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

該方法不足在於,量化領域常用的數據如股票價格、token 價格常呈現尖峰厚尾分佈,並不符合正態分佈的假設,在該情況下採用 3 σ方法將有大量數據錯誤地被識別為異常值。

3.絕對值差中位數法(Median Absolute Deviation, MAD)

該方法基於中位數和絕對偏差,使處理后的數據對極端值或異常值沒那麼敏感。 比基於均值和標準差的方法更穩健。

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

處理因數數據極端值情況

class Extreme(object): def __init__(s, this_data): s.ini_data = 這個_data

def three_sigma(s, n= 3): 均值 = .ini_data.mea() 標準 = s.ini_data.std() 低 = 平均值 - n*std 高 = 平均值 + n*std

返回 np.clip(s.ini_data, low, high)

def mad(s, n= 3): 中位數 = s.ini_data.median() 瘋狂_median = abs(s.ini_data - 中位數).median() 高 = 中位數 + n * MAD_median 低 = 中位數 - n * mad_median

返回 np.clip(s.ini_data, low, high)

定義分位數(s, L = 0.025, H = 0.975): 低 = s.ini_data.quantile(l) 高 = s.ini_data.quantile(h) 返回 np.clip(s.ini_data, low, high)

三、標準化

1.Z-score 標準化

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

2.最大最小值差標準化(Min-Max Scaling)

將每個因數數據轉化為在( 0, 1 ) 區間的數據,以便比較不同規模或範圍的數據,但它並不改變數據內部的分佈,也不會使總和變為 1 。

  • 由於考慮極大極小值,對異常值敏感
  • 統一量綱,利於比較不同維度的數據。

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

3.排序百分位(Rank Scaling)

將數據特徵轉換為它們的排名,並將這些排名轉換為介於0和1之間的分數,通常是它們在數據集中的百分位數。 *

  • **由於排名不受異常值影響,該方法對異常值不敏感。 **
  • 不保持數據中各點之間的絕對距離,而是轉換為相對排名。

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

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

標準化因子數據 class Scale(object):

def __init__(s, this_data, date): s.ini_data = 這個_data s.date = 日期 def zscore(s): 均值 = .ini_data.mea() 標準 = s.ini_data.std() 返回 s.ini_data.sub(mean).div(std) def 最大最小值: 最小值 = s.ini_data.min() 最大值 = s.ini_data.max() 返回 s.ini_data.sub(min).div(max - min) def norm排名:

對指定列進行排名,method='min’意味著相同值會有相同的排名,而不是平均排名

排名 = s.ini_data.rank(method=‘min’) 返回 ranks.div(ranks.max())

四、數據頻率

有時獲得的數據並非我們分析所需要的頻率。 比如分析的層次為月度,原始數據的頻率為日度,此時就需要用到“下採樣”,即聚合數據為月度。

下採樣

指的是將一個集合里的數據聚合為一行數據,比如日度數據聚合為月度。 此時需要考慮每個被聚合的指標的特性,通常的操作有:

  • 第一個值/最後一個值
  • 均值/中位數
  • 標準差

上採樣

指的是將一行數據的數據拆分為多行數據,比如年度數據用在月度分析上。 這種情況一般就是簡單重複即可,有時需要將年度數據按比例歸集於各個月份。

原文連結

查看原文
此頁面可能包含第三方內容,僅供參考(非陳述或保證),不應被視為 Gate 認可其觀點表述,也不得被視為財務或專業建議。詳見聲明
  • 讚賞
  • 留言
  • 轉發
  • 分享
留言
0/400
暫無留言
交易,隨時隨地
qrCode
掃碼下載 Gate App
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)