🔥 Gate 广场活动|#发帖赢Launchpad新币KDK 🔥
KDK|Gate Launchpad 最新一期明星代币
以前想参与? 先质押 USDT
这次不一样 👉 发帖就有机会直接拿 KDK!
🎁 Gate 广场专属福利:总奖励 2,000 KDK 等你瓜分
🚀 Launchpad 明星项目,走势潜力,值得期待 👀
📅 活动时间
2025/12/19 12:00 – 12/30 24:00(UTC+8)
📌 怎么参与?
在 Gate 广场发帖(文字、图文、分析、观点都行)
内容和 KDK上线价格预测/KDK 项目看法/Gate Launchpad 机制理解相关
帖子加上任一话题:#发帖赢Launchpad新币KDK 或 #PostToWinLaunchpadKDK
🏆 奖励设置(共 2,000 KDK)
🥇 第 1 名:400 KDK
🥈 前 5 名:200 KDK / 人(共 1,000 KDK)
🥉 前 15 名:40 KDK / 人(共 600 KDK)
📄 注意事项
内容需原创,拒绝抄袭、洗稿、灌水
获奖者需完成 Gate 广场身份认证
奖励发放时间以官方公告为准
Gate 保留本次活动的最终解释权
LUCIDA:如何利用多因子策略构建强大的加密资产投资组合(数据预处理篇)
前言
书接上回,我们发布了《用多因子策略构建强大的加密资产投资组合》系列文章的第一篇 - 理论基础篇,本篇是第二篇 - 数据预处理篇。
在计算因子数据前/后,以及测试单因子的有效性之前,都需要对相关数据进行处理。具体的数据预处理涉及重复值、异常值/缺失值/极端值、标准化和数据频率的处理。
一、重复值
数据相关定义:
诊断重复值的首先需要理解数据“应当”是什么样子。通常数据的形式有:
原则:确定了数据的索引(键),就能知道数据应该在什么层面没有重复值。
检查方式:
pd.DataFrame.duplicated(subset=[key 1, key 2, …])
pd.merge(df 1, df 2, on=[key 1, key 2, …], indicator=True, validate=‘1: 1’)
二、异常值/缺失值/极端值
产生异常值的常见原因:
针对异常值和缺失值处理原则:
机器学习慎用向后填充,有 Look-ahead bias 的风险
针对极端值的处理方法:
1.百分位法。
通过将顺序从小到大排列,将超过最小和最大比例的数据替换为临界的数据。对于历史数据较丰富的数据,该方法相对粗略,不太适用,强行删除固定比例的数据可能造成一定比例的损失。
2.3σ / 三倍标准差法
对数据范围内的所有因子做出如下调整:
该方法不足在于,量化领域常用的数据如股票价格、token 价格常呈现尖峰厚尾分布,并不符合正态分布的假设,在该情况下采用 3 σ方法将有大量数据错误地被识别为异常值。
3.绝对值差中位数法(Median Absolute Deviation, MAD)
该方法基于中位数和绝对偏差,使处理后的数据对极端值或异常值没那么敏感。比基于均值和标准差的方法更稳健。
处理因子数据极端值情况
class Extreme(object):
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()
low = mean - n*std
high = mean + n*std
return np.clip(s.ini_data, low, high)
def mad(s, n= 3):
median = s.ini_data.median()
mad_median = abs(s.ini_data - median).median()
high = median + n * mad_median
low = median - n * mad_median
return np.clip(s.ini_data, low, high)
def quantile(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)
三、标准化
1.Z-score 标准化
2.最大最小值差标准化(Min-Max Scaling)
将每个因子数据转化为在( 0, 1) 区间的数据,以便比较不同规模或范围的数据,但它并不改变数据内部的分布,也不会使总和变为 1 。
3.排序百分位(Rank Scaling)
将数据特征转换为它们的排名,并将这些排名转换为介于 0 和 1 之间的分数,通常是它们在数据集中的百分位数。*
标准化因子数据 class Scale(object):
def __init__(s, ini_data, date):
s.ini_data = ini_data
s.date = 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())
四、数据频率
有时获得的数据并非我们分析所需要的频率。比如分析的层次为月度,原始数据的频率为日度,此时就需要用到“下采样”,即聚合数据为月度。
下采样
指的是将一个集合里的数据聚合为一行数据,比如日度数据聚合为月度。此时需要考虑每个被聚合的指标的特性,通常的操作有:
上采样
指的是将一行数据的数据拆分为多行数据,比如年度数据用在月度分析上。这种情况一般就是简单重复即可,有时需要将年度数据按比例归集于各个月份。
原文链接