Lucida is a quantitative hedge fund. Falcon is a Web3 investment infra.

LUCIDA:用多因子模型去选赛道、选币种
投资小币种,无论是一级还是二级,我把整个过程分成四个部分:选、买、管、卖。『 选 』选包括两部分,选赛道和选币种。『 买 』买有两种方式,一级或者二级,这两个需要的核心能力不一样,一级看重行业资源,二级看重投研能力,目前我没看到,二者各有优劣,目前没看到两个能力都有的机构,这里不展开讲。『 管 』管是指管理投资组合。包括对冲风险、增强收益、调仓等等。『 卖 』卖不解释了。如果你是屯币者或者对某类资产有特殊信仰,当我没说。仅靠逻辑分析,不太靠谱这四块里最难的还是选。市场中的小币种太多,光CMC收录的就有9000多个,再怎么筛选,潜在的投资标的也得有大几十个。 关于选赛道和选币种,我发现目前行业的主流做法还是靠逻辑分析。列一堆看好某个赛道和币种的理由作为买某类资产的依据,这算不上错,但是有缺陷。首先,当你处在某个时间截面下,你都能找到无数个看多或看空某一赛道和资产的理由,因为凡事都是一体两面的,所以靠逻辑分析还是主观的,再深入讨论下去就成辩论了,二是不定量,缺乏客观数据的支撑。关于多因子模型,80%靠算法,20%靠经验我希望通过多因子模型去解决“选”的问题。 市场是有统计规律的,为什...

用多因子策略构建强大的加密资产投资组合 #理论基础篇#
前言在去年6月份,我设想了用多因子模型去择币的简单构思。 https://mirror.xyz/lucidafund.eth/UdOfxxKgD_Xuc_KrvGvsjrWZZCwKlWPAYNx991ZgmIA nft://undefined/undefined/undefined?showBuying=true&showMeta=true 一年后,我们已经着手研发针对加密资产市场的多因子策略,并把整体的策略框架写成系列的文章《用多因子策略构建强大的加密资产投资组合》。 本系列的大体框架如下(不排除微调的可能):一、多因子模型理论基础 二、单因子构建因子数据预处理数据筛选异常值处理:极值、错误值、空值标准化中性化:行业、市场、市值因子有效性判断信息比率IC、收益率、夏普比率、换手率三、大类因子合成因子共线性分析正交消除因子共线性经典加权方法→合成因子等权、滚动IC加权、IC_IR加权合成因子的测试:收益率、分组收益率、因子值加权收益率、合成因子IC、分组换手率其他加权方法(因子与收益率存在非线性关系):机器学习、强化学习(由于加密货币行业的特殊性,不考虑)四、风险组合优化以下是...

用多因子策略构建强大的加密资产投资组合 #数据预处理篇#
前言书接上回,我们发布了《用多因子策略构建强大的加密资产投资组合》系列文章的第一篇 - 理论基础篇,本篇是第二篇 - 数据预处理篇。 在计算因子数据前/后,以及测试单因子的有效性之前,都需要对相关数据进行处理。具体的数据预处理涉及重复值、异常值/缺失值/极端值、标准化和数据频率的处理。一、重复值数据相关定义:键(Key):表示一个独一无二的索引。eg. 对于一份有全部token所有日期的数据,键是“token_id/contract_address - 日期”值(Value):被键索引的对象就称之为“值”。诊断重复值的首先需要理解数据“应当”是什么样子。通常数据的形式有:时间序列数据(Time Series)。键是“时间”。eg.单个token5年的价格数据横截面数据(Cross Section)。键是“个体”。eg.2023.11.01当日crypto市场所有token的价格数据面板数据(Panel)。键是“个体-时间”的组合。eg.从2019.01.01-2023.11.01 四年所有token的价格数据。原则:确定了数据的索引(键),就能知道数据应该在什么层面没有重复值。检...

LUCIDA:用多因子模型去选赛道、选币种
投资小币种,无论是一级还是二级,我把整个过程分成四个部分:选、买、管、卖。『 选 』选包括两部分,选赛道和选币种。『 买 』买有两种方式,一级或者二级,这两个需要的核心能力不一样,一级看重行业资源,二级看重投研能力,目前我没看到,二者各有优劣,目前没看到两个能力都有的机构,这里不展开讲。『 管 』管是指管理投资组合。包括对冲风险、增强收益、调仓等等。『 卖 』卖不解释了。如果你是屯币者或者对某类资产有特殊信仰,当我没说。仅靠逻辑分析,不太靠谱这四块里最难的还是选。市场中的小币种太多,光CMC收录的就有9000多个,再怎么筛选,潜在的投资标的也得有大几十个。 关于选赛道和选币种,我发现目前行业的主流做法还是靠逻辑分析。列一堆看好某个赛道和币种的理由作为买某类资产的依据,这算不上错,但是有缺陷。首先,当你处在某个时间截面下,你都能找到无数个看多或看空某一赛道和资产的理由,因为凡事都是一体两面的,所以靠逻辑分析还是主观的,再深入讨论下去就成辩论了,二是不定量,缺乏客观数据的支撑。关于多因子模型,80%靠算法,20%靠经验我希望通过多因子模型去解决“选”的问题。 市场是有统计规律的,为什...

用多因子策略构建强大的加密资产投资组合 #理论基础篇#
前言在去年6月份,我设想了用多因子模型去择币的简单构思。 https://mirror.xyz/lucidafund.eth/UdOfxxKgD_Xuc_KrvGvsjrWZZCwKlWPAYNx991ZgmIA nft://undefined/undefined/undefined?showBuying=true&showMeta=true 一年后,我们已经着手研发针对加密资产市场的多因子策略,并把整体的策略框架写成系列的文章《用多因子策略构建强大的加密资产投资组合》。 本系列的大体框架如下(不排除微调的可能):一、多因子模型理论基础 二、单因子构建因子数据预处理数据筛选异常值处理:极值、错误值、空值标准化中性化:行业、市场、市值因子有效性判断信息比率IC、收益率、夏普比率、换手率三、大类因子合成因子共线性分析正交消除因子共线性经典加权方法→合成因子等权、滚动IC加权、IC_IR加权合成因子的测试:收益率、分组收益率、因子值加权收益率、合成因子IC、分组换手率其他加权方法(因子与收益率存在非线性关系):机器学习、强化学习(由于加密货币行业的特殊性,不考虑)四、风险组合优化以下是...

用多因子策略构建强大的加密资产投资组合 #数据预处理篇#
前言书接上回,我们发布了《用多因子策略构建强大的加密资产投资组合》系列文章的第一篇 - 理论基础篇,本篇是第二篇 - 数据预处理篇。 在计算因子数据前/后,以及测试单因子的有效性之前,都需要对相关数据进行处理。具体的数据预处理涉及重复值、异常值/缺失值/极端值、标准化和数据频率的处理。一、重复值数据相关定义:键(Key):表示一个独一无二的索引。eg. 对于一份有全部token所有日期的数据,键是“token_id/contract_address - 日期”值(Value):被键索引的对象就称之为“值”。诊断重复值的首先需要理解数据“应当”是什么样子。通常数据的形式有:时间序列数据(Time Series)。键是“时间”。eg.单个token5年的价格数据横截面数据(Cross Section)。键是“个体”。eg.2023.11.01当日crypto市场所有token的价格数据面板数据(Panel)。键是“个体-时间”的组合。eg.从2019.01.01-2023.11.01 四年所有token的价格数据。原则:确定了数据的索引(键),就能知道数据应该在什么层面没有重复值。检...
Lucida is a quantitative hedge fund. Falcon is a Web3 investment infra.

Subscribe to LUCIDA & FALCON

Subscribe to LUCIDA & FALCON
Share Dialog
Share Dialog
<100 subscribers
<100 subscribers


书接上回,关于《用多因子模型构建强大的加密资产投资组合》系列文章中,我们已经发布了四篇:《理论基础篇》、《数据预处理篇》、《因子有效性检验篇》、《大类因子分析:因子合成篇》。
在上一篇中,我们具体解释了因子共线性(因子之间相关性较高)的问题,在进行大类因子合成前,需要进行因子正交化来消除共线性。
通过因子正交化,重新调整原始因子的方向,使他们相互正交(,即两个向量相互垂直),本质是对原始因子在坐标轴上的旋转。这种旋转不改变因子之间的线性关系也不改变原本蕴含的信息,并且新因子之间的相关性为零(内积为零等价于相关性为零),因子对于收益的解释度保持不变。
从多因子截面回归角度,建立因子正交化体系。
每个截面上可以获得全市场token在各个因子上的取值,N代表截面上全市场token数量,K表示因子的数量,表示全市场token在第k个因子上的取值,并且已对每个因子进行了z-score归一化处理,即 。
为截面上K个线性独立的因子列向量组成的矩阵,假设以上因子线性无关(相关性不为100%或-100%,正交化处理的理论基础)。
通过对线性变换,得到一个新的因子正交矩阵 ,新矩阵的列向量相互正交,即任意两个新因子向量内积为零,。
定义一个从 旋转到$$\tilde{F}{N\times K}S{K\times K}$$
$$\tilde{F}{N\times K}=F{N\times K}\cdot S_{K\times K}(2)$$
1.1 过度矩阵
以下开始求解过渡矩阵,首先计算的协方差矩阵,则 的重叠矩阵,即
旋转后的是正交矩阵,根据正交矩阵的性质 ,则有
$$\begin{aligned} (\tilde{F}{N\times K})'\tilde{F}{N\times K}&=(F_{N\times K}S_{K\times K})'F_{N\times K}S_{K\times K}\ &=S_{K\times K}'F_{N\times K}'F_{N\times K}S_{K\times K}\ &=S_{K\times K}'M_{K\times K}S_{K\times K}\ &=I_{K\times K} \end{aligned} (4)$$
所以,
满足该条件的 即为一个符合条件的过渡矩阵。上面公式的通解为:
其中, 为任意正交矩阵
1.2对称矩阵
下面开始求解 ,因为 是对称矩阵,因此一定存在一个正定矩阵 满足:
其中,
分别为 的特征向量矩阵和特征根对角矩阵,并且 。 由公式(13)可得
由于 是对称矩阵,且 ,可基于上式得到 的一个特解为:
其中
将 的解带入公式(6)可求的过渡矩阵:
其中, 为任意正交矩阵。
根据公式(12),任何一种因子正交都可以转化为选择不同的正交矩阵 对原始因子进行旋转。
1.3消除共线性主要用到3种正交方法
故, 为上三角矩阵,
故, ,
故,,
有一组线性无关的因子列向量 ,可以逐步的构造出一组正交的向量组 ,正交后的向量为:
并对 进行单位化后:
经过以上处理,得到一组标准正交基。由于 与 等价,二者可以相互线性表示,即 是 的线性组合,有 ,因此对应于原矩阵 的过渡矩阵 为一个上三角矩阵,形如:
其中 。基于公式(17),施密特正交选取的任意正交矩阵为:
施密特正交是一种顺序正交方法,因此需要确定因子正交的顺序,常见的正交顺序有固定顺序(不同截面上取同样的正交次序),以及动态顺序(在每个截面上根据一定规则确定其正交次序)。施密特正交法的优点是按同样顺序正交的因子有显式的对应关系,但是正交顺序没有统一的选择标准,正交后的表现可能受到正交顺序标准和窗口期参数的影响。
# 施密特正交化
from sympy.matrices import Matrix, GramSchmidt
Schmidt = GramSchmidt(f.apply(lambda x: Matrix(x),axis=0),orthonormal=True)
f_Schmidt = pd.DataFrame(index=f.index,columns=f.columns)
for i in range(3):
f_Schmidt.iloc[:,i]=np.array(Schmidt[i])
res = f_Schmidt.astype(float)
选取正交矩阵 ,则过渡矩阵为:
其中 为特征向量矩阵,用于对因子旋转, 为对角矩阵,用于对旋转后因子的缩放。此处的旋转与不做降维的PCA一致。
# 规范正交
def Canonical(self):
overlapping_matrix = (time_tag_data.shape[1] - 1) * np.cov(time_tag_data.astype(float))
# 获取特征值和特征向量
eigenvalue, eigenvector = np.linalg.eig(overlapping_matrix)
# 转换为np中的矩阵
eigenvector = np.mat(eigenvector)
transition_matrix = np.dot(eigenvector, np.mat(np.diag(eigenvalue ** (-0.5))))
orthogonalization = np.dot(time_tag_data.T.values, transition_matrix)
orthogonalization_df = pd.DataFrame(orthogonalization.T,index = pd.MultiIndex.from_product([time_tag_data.index, [time_tag]]),columns=time_tag_data.columns)
self.factor_orthogonalization_data = self.factor_orthogonalization_data.append(orthogonalization_df)
施密特正交由于在过去若干个截面上都取同样的因子正交顺序,因此正交后的因子和原始因子有显式的对应关系,而规范正交在每个截面上选取的主成分方向可能不一致,导致正交前后的因子没有稳定的对应关系。由此可见,正交后组合的效果,很大一部分取决于正交前后因子是否有稳定的对应关系。
对称正交尽可能的减少对原始因子矩阵的修改而得到一组正交基。这样能够最大程度地保持正交后因子和原因子的相似性。并且避免像施密特正交法中偏向正交顺序中靠前的因子。
选取正交矩阵 ,则过渡矩阵为:
对称正交的性质:
与施密特正交相比,对称正交不需要提供正交次序,对每个因子是平等看待的
在所有正交过渡矩阵中,对称正交后的矩阵和原始矩阵的相似性最大,即正交前后矩阵的距离最小。
# 对称正交
def Symmetry(factors):
col_name = factors.columns
D, U = np.linalg.eig(np.dot(factors.T, factors))
U = np.mat(U)
d = np.diag(D**(-0.5))
S = U*d*U.T
#F_hat = np.dot(factors, S)
F_hat = np.mat(factors)*S
factors_orthogonal = pd.DataFrame(F_hat, columns=col_name, index=factors.index)
return factors_orthogonal
res = Symmetry(f)
Lucida (https://www.lucida.fund/ )是行业领先的量化对冲基金,在2018年4月进入Crypto市场,主要交易CTA / 统计套利 / 期权波动率套利等策略,现管理规模3000万美元。
Falcon (https://falcon.lucida.fund /)是新一代的Web3投资基础设施,它基于多因子模型,帮助用户“选”、“买”、“管”、“卖”加密资产。Falcon在2022年6月由Lucida所孵化。
书接上回,关于《用多因子模型构建强大的加密资产投资组合》系列文章中,我们已经发布了四篇:《理论基础篇》、《数据预处理篇》、《因子有效性检验篇》、《大类因子分析:因子合成篇》。
在上一篇中,我们具体解释了因子共线性(因子之间相关性较高)的问题,在进行大类因子合成前,需要进行因子正交化来消除共线性。
通过因子正交化,重新调整原始因子的方向,使他们相互正交(,即两个向量相互垂直),本质是对原始因子在坐标轴上的旋转。这种旋转不改变因子之间的线性关系也不改变原本蕴含的信息,并且新因子之间的相关性为零(内积为零等价于相关性为零),因子对于收益的解释度保持不变。
从多因子截面回归角度,建立因子正交化体系。
每个截面上可以获得全市场token在各个因子上的取值,N代表截面上全市场token数量,K表示因子的数量,表示全市场token在第k个因子上的取值,并且已对每个因子进行了z-score归一化处理,即 。
为截面上K个线性独立的因子列向量组成的矩阵,假设以上因子线性无关(相关性不为100%或-100%,正交化处理的理论基础)。
通过对线性变换,得到一个新的因子正交矩阵 ,新矩阵的列向量相互正交,即任意两个新因子向量内积为零,。
定义一个从 旋转到$$\tilde{F}{N\times K}S{K\times K}$$
$$\tilde{F}{N\times K}=F{N\times K}\cdot S_{K\times K}(2)$$
1.1 过度矩阵
以下开始求解过渡矩阵,首先计算的协方差矩阵,则 的重叠矩阵,即
旋转后的是正交矩阵,根据正交矩阵的性质 ,则有
$$\begin{aligned} (\tilde{F}{N\times K})'\tilde{F}{N\times K}&=(F_{N\times K}S_{K\times K})'F_{N\times K}S_{K\times K}\ &=S_{K\times K}'F_{N\times K}'F_{N\times K}S_{K\times K}\ &=S_{K\times K}'M_{K\times K}S_{K\times K}\ &=I_{K\times K} \end{aligned} (4)$$
所以,
满足该条件的 即为一个符合条件的过渡矩阵。上面公式的通解为:
其中, 为任意正交矩阵
1.2对称矩阵
下面开始求解 ,因为 是对称矩阵,因此一定存在一个正定矩阵 满足:
其中,
分别为 的特征向量矩阵和特征根对角矩阵,并且 。 由公式(13)可得
由于 是对称矩阵,且 ,可基于上式得到 的一个特解为:
其中
将 的解带入公式(6)可求的过渡矩阵:
其中, 为任意正交矩阵。
根据公式(12),任何一种因子正交都可以转化为选择不同的正交矩阵 对原始因子进行旋转。
1.3消除共线性主要用到3种正交方法
故, 为上三角矩阵,
故, ,
故,,
有一组线性无关的因子列向量 ,可以逐步的构造出一组正交的向量组 ,正交后的向量为:
并对 进行单位化后:
经过以上处理,得到一组标准正交基。由于 与 等价,二者可以相互线性表示,即 是 的线性组合,有 ,因此对应于原矩阵 的过渡矩阵 为一个上三角矩阵,形如:
其中 。基于公式(17),施密特正交选取的任意正交矩阵为:
施密特正交是一种顺序正交方法,因此需要确定因子正交的顺序,常见的正交顺序有固定顺序(不同截面上取同样的正交次序),以及动态顺序(在每个截面上根据一定规则确定其正交次序)。施密特正交法的优点是按同样顺序正交的因子有显式的对应关系,但是正交顺序没有统一的选择标准,正交后的表现可能受到正交顺序标准和窗口期参数的影响。
# 施密特正交化
from sympy.matrices import Matrix, GramSchmidt
Schmidt = GramSchmidt(f.apply(lambda x: Matrix(x),axis=0),orthonormal=True)
f_Schmidt = pd.DataFrame(index=f.index,columns=f.columns)
for i in range(3):
f_Schmidt.iloc[:,i]=np.array(Schmidt[i])
res = f_Schmidt.astype(float)
选取正交矩阵 ,则过渡矩阵为:
其中 为特征向量矩阵,用于对因子旋转, 为对角矩阵,用于对旋转后因子的缩放。此处的旋转与不做降维的PCA一致。
# 规范正交
def Canonical(self):
overlapping_matrix = (time_tag_data.shape[1] - 1) * np.cov(time_tag_data.astype(float))
# 获取特征值和特征向量
eigenvalue, eigenvector = np.linalg.eig(overlapping_matrix)
# 转换为np中的矩阵
eigenvector = np.mat(eigenvector)
transition_matrix = np.dot(eigenvector, np.mat(np.diag(eigenvalue ** (-0.5))))
orthogonalization = np.dot(time_tag_data.T.values, transition_matrix)
orthogonalization_df = pd.DataFrame(orthogonalization.T,index = pd.MultiIndex.from_product([time_tag_data.index, [time_tag]]),columns=time_tag_data.columns)
self.factor_orthogonalization_data = self.factor_orthogonalization_data.append(orthogonalization_df)
施密特正交由于在过去若干个截面上都取同样的因子正交顺序,因此正交后的因子和原始因子有显式的对应关系,而规范正交在每个截面上选取的主成分方向可能不一致,导致正交前后的因子没有稳定的对应关系。由此可见,正交后组合的效果,很大一部分取决于正交前后因子是否有稳定的对应关系。
对称正交尽可能的减少对原始因子矩阵的修改而得到一组正交基。这样能够最大程度地保持正交后因子和原因子的相似性。并且避免像施密特正交法中偏向正交顺序中靠前的因子。
选取正交矩阵 ,则过渡矩阵为:
对称正交的性质:
与施密特正交相比,对称正交不需要提供正交次序,对每个因子是平等看待的
在所有正交过渡矩阵中,对称正交后的矩阵和原始矩阵的相似性最大,即正交前后矩阵的距离最小。
# 对称正交
def Symmetry(factors):
col_name = factors.columns
D, U = np.linalg.eig(np.dot(factors.T, factors))
U = np.mat(U)
d = np.diag(D**(-0.5))
S = U*d*U.T
#F_hat = np.dot(factors, S)
F_hat = np.mat(factors)*S
factors_orthogonal = pd.DataFrame(F_hat, columns=col_name, index=factors.index)
return factors_orthogonal
res = Symmetry(f)
Lucida (https://www.lucida.fund/ )是行业领先的量化对冲基金,在2018年4月进入Crypto市场,主要交易CTA / 统计套利 / 期权波动率套利等策略,现管理规模3000万美元。
Falcon (https://falcon.lucida.fund /)是新一代的Web3投资基础设施,它基于多因子模型,帮助用户“选”、“买”、“管”、“卖”加密资产。Falcon在2022年6月由Lucida所孵化。
No activity yet