JoinQuant single factor analyzer
Project description
jqfactor_analyzer
聚宽单因子分析工具
Github
https://github.com/JoinQuant/jqfactor_analyzer
使用示例
-
示例一
#载入函数库
import pandas as pd
import jqfactor_analyzer as ja
# 获取 jqdatasdk 授权
# 输入用户名、密码,申请地址:http://t.cn/EINDOxE
# 聚宽官网及金融终端,使用方法参见:http://t.cn/EINcS4j
import jqdatasdk
jqdatasdk.auth('username', 'password')
# 对因子进行分析
factor_analyzer = ja.analyze_factor(
factor_data, # factor_data 为因子值的 pandas.DataFrame
quantiles=10,
periods=(1, 10),
industry='jq_l1',
weight_method='avg',
max_loss=0.1
)
# 生成统计图表
factor_analyzer.create_full_tear_sheet(
demeaned=False, group_adjust=False, by_group=False,
turnover_periods=None, avgretplot=(5, 15), std_bar=False
)
-
示例二
# 载入函数库
import pandas as pd
import jqfactor_analyzer as ja
# 获取 jqdatasdk 授权
# 输入用户名、密码,申请地址:http://t.cn/EINDOxE
# 聚宽官网及金融终端,使用方法参见:http://t.cn/EINcS4j
import jqdatasdk
jqdatasdk.auth('username', 'password')
# 生成数据接口
dataapi = ja.DataApi(fq='post', industry='jq_l1', weight_method='avg')
# 对因子进行分析
factor_analyzer = ja.FactorAnalyzer(
factor_data, # factor_data 为因子值的 pandas.DataFrame
price=dataapi.get_price,
groupby=dataapi.get_groupby,
weights=dataapi.get_weights,
binning_by_group=False,
quantiles=10,
periods=(1, 10)
)
# 生成统计图表
factor_analyzer.create_full_tear_sheet(
demeaned=False, group_adjust=False, by_group=False,
turnover_periods=None, avgretplot=(5, 15), std_bar=False
)
函数说明
jqfactor_analyzer.analyze_factor(factor, industry='jq_l1', quantiles=5, periods=(1, 5, 10), weight_method='avg', max_loss=0.25)
单因子分析函数
参数
-
factor
: 因子值pandas.DataFrame
columns 为股票代码(如
'000001.XSHE'
), index 为日期的DatetimeIndex
-
industry
: 行业分类, 默认为'jq_l1'
'sw_l1'
: 申万一级行业'sw_l2'
: 申万二级行业'sw_l3'
: 申万三级行业'jq_l1'
: 聚宽一级行业'jq_l2'
: 聚宽二级行业'zjw'
: 证监会行业
-
quantiles
: 分位数数量, 默认为5
int
在因子分组中按照因子值大小平均分组的组数.
-
periods
: 调仓周期, 默认为 [1, 5, 10]int
orlist[int]
-
weight_method
: 基于分位数收益时的加权方法, 默认为'avg'
'avg'
: 等权重'mktcap'
:按总市值加权'ln_mktcap'
: 按总市值的对数加权'cmktcap'
: 按流通市值加权'ln_cmktcap'
: 按流通市值的对数加权
-
max_loss
: 因重复值或nan值太多而无效的因子值的最大占比, 默认为 0.25float
允许的丢弃因子数据的最大百分比 (0.00 到 1.00),
计算比较输入因子索引中的项目数和输出 DataFrame 索引中的项目数.
因子数据本身存在缺陷 (例如 NaN),
没有提供足够的价格数据来计算所有因子值的远期收益,
或者因为分组失败, 因此可以部分地丢弃因子数据
jqfactor_analyzer.DataApi(price='close', fq='post', industry='jq_l1', weight_method='avg')
数据接口, 用于因子分析获取数据
注册方法
数据接口需调用聚宽 jqdatasdk
接口获取金融数据(试用注册地址)
参数
-
price
: 用开盘价/收盘价计算收益 (请注意避免未来函数), 默认为'close'
'close'
: 使用当日收盘价和次日收盘价计算当日因子的远期收益'open'
:使用当日开盘价和次日开盘价计算当日因子的远期收益
-
fq
: 价格数据的复权方式, 默认为'post'
'post'
: 后复权'pre'
:前复权None
: 不复权
-
industry
: 行业分类, 默认为'jq_l1'
'sw_l1'
: 申万一级行业'sw_l2'
: 申万二级行业'sw_l3'
: 申万三级行业'jq_l1'
: 聚宽一级行业'jq_l2'
: 聚宽二级行业'zjw'
: 证监会行业
-
weight_method
: 基于分位数收益时的加权方法, 默认为'avg'
'avg'
: 等权重'mktcap'
:按总市值加权'ln_mktcap'
: 按总市值的对数加权'cmktcap'
: 按流通市值加权'ln_cmktcap'
: 按流通市值的对数加权
支持的接口
-
get_prices
: 获取价格数据 -
get_groupby
: 获取行业分类信息 -
get_weights
: 获取加权方法
jqfactor_analyzer.FactorAnalyzer(factor, prices, groupby=None, weights=1.0, quantiles=5, bins=None, periods=(1, 5, 10), binning_by_group=False, max_loss=0.25, zero_aware=False)
参数
-
factor
: 因子值pandas.DataFrame
columns 为股票代码(如
'000001.XSHE'
), index 为日期的DatetimeIndex
-
prices
: 用于计算因子远期收益的价格数据pandas.DataFrame
columns 为股票代码(如
'000001.XSHE'
), index 为日期的DatetimeIndex
价格数据必须覆盖因子分析时间段以及额外远期收益计算中的最大预期期数.
或可执行函数
function
输入参数为
securities
,start_date
,end_date
,count
返回值为价格数据的
pandas.DataFrame
-
groupby
: 分组数据, 默认为None
pandas.DataFrame
index 为日期, columns 为资产, 为每个资产每天的分组.
或
dict
资产-分组映射的字典. 如果传递了
dict
, 则假定分组映射在整个时间段内保持不变.或可执行函数
function
输入参数为 securities, start_date, end_date
返回值为分组数据的 DataFrame 或 dict
-
weights
: 权重数据, 默认为1
pandas.DataFrame
index 为日期, columns 为资产, 为每个资产每天的权重.
或
dict
资产-权重映射的字典. 如果传递了
dict
, 则假定权重映射在整个时间段内保持不变.或可执行函数
function
输入参数为 securities, start_date, end_date
返回值为权重数据的 DataFrame 或 dict
-
binning_by_group
: 默认为 Falsebool
如果为
True
, 则对每个组分别计算分位数.适用于因子值范围在各个组上变化很大的情况.
如果要分析分组(行业)中性的组合, 您最好设置为
True
-
quantiles
: 分位数数量, 默认为 Noneint
orlist[float]
在因子分组中按照因子值大小平均分组的组数.
或分位数序列, 允许不均匀分组
例如 [0, .10, .5, .90, 1.] 或 [.05, .5, .95]
quantiles
和bins
有且只能有一个不为None
-
bins
: 分组边界, 默认为 Nonelist[float]
在因子分组中使用的等宽 (按照因子值) 区间的数量.
或边界值序列, 允许不均匀的区间宽度
例如 [-4, -2, -0.5, 0, 10]
quantiles
和bins
有且只能有一个不为None
-
periods
: 调仓周期, 默认为[1, 5, 10]int
orlist[int]
-
max_loss
: 因重复值或nan值太多而无效的因子值的最大占比, 默认为 0.25float
允许的丢弃因子数据的最大百分比 (0.00 到 1.00),
计算比较输入因子索引中的项目数和输出 DataFrame 索引中的项目数.
因子数据本身存在缺陷 (例如 NaN),
没有提供足够的价格数据来计算所有因子值的远期收益,
或者因为分组失败, 因此可以部分地丢弃因子数据
设置 max_loss = 0 以停止异常捕获.
-
zero_aware
:bool
如果为True, 则分别为正负因子值计算分位数.
适用于您的信号聚集并且零是正值和负值的分界线的情况.
属性列表
-
clean_factor_data
: 去除nan
/inf
, 整理后的因子值、forward_return 和分位数- 类型:
pandas.DataFrame
- index: 为日期和股票代码的
MultiIndex
- columns: 根据period选择后的forward_return(如果调仓周期为1天, 那么forward_return为[第二天的收盘价-今天的收盘价]/今天的收盘价)、因子值、行业分组、分位数数组、权重
- 类型:
-
mean_return_by_quantile
: 按分位数分组加权平均因子收益- 类型:
pandas.DataFrame
- index:分位数分组
- columns:调仓周期
- 类型:
-
mean_return_std_by_quantile
: 按分位数分组加权因子收益标准差- 类型:pandas.DataFrame
- index:分位数分组
- columns:调仓周期
-
mean_return_by_date
: 按分位数及日期分组加权平均因子收益- 类型:pandas.DataFrame
- index:为日期和分位数的MultiIndex
- columns:调仓周期
-
mean_return_std_by_date
: 按分位数及日期分组加权因子收益标准差- 类型:pandas.DataFrame
- index:为日期和分位数的MultiIndex
- columns:调仓周期
-
mean_return_by_group
: 按分位数及行业分组加权平均因子收益- 类型:pandas.DataFrame
- index:为行业和分位数的MultiIndex
- columns:调仓周期
-
mean_return_std_by_group
: 按分位数及行业分组加权因子收益标准差- 类型:pandas.DataFrame
- index:为行业和分位数的MultiIndex
- columns:调仓周期
-
mean_return_spread_by_quantile
: 最高分位数因子收益减最低分位数因子收益每日均值- 类型:pandas.DataFrame
- index:日期
- columns:调仓周期
-
mean_return_spread_std_by_quantile
: 最高分位数因子收益减最低分位数因子收益每日标准差- 类型:pandas.DataFrame
- index:日期
- columns:调仓周期
-
ic
: 信息比率- 类型:pandas.DataFrame
- index:日期
- columns:调仓周期
-
ic_by_group
: 分行业信息比率- 类型:pandas.DataFrame
- index:行业
- columns:调仓周期
-
ic_monthly
: 月度信息比率- 类型:pandas.DataFrame
- index:月度
- columns:调仓周期表
-
quantile_turnover
: 换手率- 键:调仓周期
- 值:
pandas.DataFrame
换手率 - index:日期
- columns:分位数分组
方法列表
计算按分位数分组加权因子收益和标准差
mean, std = FactorAnalyzer.calc_mean_return_by_quantile(by_date=True, by_group=False, demeaned=False, group_adjust=False)
-
参数
by_date
:True
: 在分位数分组下, 得到每天的因子收益和标准差False
: 按分位数分组加权因子收益和标准差
by_group
:True
: 在分位数分组下, 得到每个行业的因子收益和标准差False
: 按分位数分组加权因子收益和标准差
demeaned
:True
: 对每天的因子收益和标准差去均值False
: 按分位数分组加权因子收益和标准差
group_adjust
:True
: 每天的因子收益和标准差按行业去均值False
: 按分位数分组加权因子收益和标准差
计算按因子值加权多空组合每日收益
FactorAnalyzer.calc_factor_returns(demeaned=True, group_adjust=False)
-
参数
demeaned
:True
: 对每天的因子收益去均值False
: 每日因子收益
group_adjust
:True
: 对每天的因子收益去均值按行业去均值False
: 计算按因子值加权多空组合每日收益
计算两个分位数相减的因子收益和标准差
mean, std = FactorAnalyzer.compute_mean_returns_spread (by_date=False, by_group=False, demeaned=False, group_adjust=False, upper_quant=1, lower_quant=8)
-
参数
by_date
:True
: 每天的两个分位数相减的因子收益和标准差False
: 两个分位数相减的因子收益和标准差
by_group
:True
: 每个行业的两个分位数相减的因子收益和标准差False
: 两个分位数相减的因子收益和标准差
demeaned
:True
: 两个分位数相减去均值后的每天的因子收益和标准差False
: 两个分位数相减的因子收益和标准差
group_adjust
:True
: 两个分位数相减按行业去均值后的因子收益和标准差False
: 两个分位数相减的因子收益和标准差
upper_quant
: 用upper_quant选择的分位数减去lower_quant选择的分位数, 只能在已有的范围内选择lower_quant
: 用upper_quant选择的分位数减去lower_quant选择的分位数, 只能在已有的范围内选择
计算因子的 alpha 和 beta
FactorAnalyzer.calc_factor_alpha_beta(demeaned=True, group_adjust=False)
-
参数
demeaned
:True
: 去均值后的因子收益计算得到的alpha和betaFalse
: 计算因子的 alpha 和 beta
group_adjust
:True
: 按行业去均值后的因子收益计算得到的alpha和betaFalse
: 计算因子的 alpha 和 beta
计算每日因子信息比率(IC值)
FactorAnalyzer.calc_factor_information_coefficient(group_adjust=False, by_group=False, method='rank')
-
参数
group_adjust
:True
: 按行业去均值后的因子收益计算得到的IC值False
: IC值
by_group
:True
: 得到每日因子信息比率的各行业IC值False
: IC值
method
:'rank'
: 用秩相关系数计算IC值'normal'
: 用普通相关系数计算IC值
计算因子信息比率均值(IC值均值)
FactorAnalyzer.calc_mean_information_coefficient(group_adjust=False, by_group=False, by_time=None, method='rank')
-
参数
group_adjust
:True
: 按行业去均值后的因子收益计算得到的IC值均值False
: IC值均值
by_group
:True
: 各行业IC值均值False
: IC值均值
by_time
:'Y'
: 按年求均值'M'
: 按月求均值None
: 对所有日期求均值
method
:'rank'
: 用秩相关系数计算IC值'normal'
: 用普通相关系数计算IC值
按照当天的分位数算分位数未来和过去的收益均值和标准差
FactorAnalyzer.calc_average_cumulative_return_by_quantile(periods_before=5, periods_after=15, demeaned=False, group_adjust=False)
-
参数
periods_before
: 计算过去的天数periods_after
: 计算未来的天数demeaned
: 对每日因子收益去均值后计算未来和过去的收益均值和标准差group_adjust
: 按行业对因子收益去均值后计算未来和过去的收益均值和标准差
计算指定调仓周期的各分位数每日累积收益
FactorAnalyzer.calc_cumulative_return_by_quantile(period=5)
-
参数
period
: 指定调仓周期
计算指定调仓周期的按因子值加权多空组合每日累积收益
FactorAnalyzer.calc_cumulative_returns(period=5, demeaned=False, group_adjust=False)
-
参数
period
: 指定调仓周期demeaned
:True
: 对每日因子收益去均值后按因子值加权多空组合每日累积收益False
: 按因子值加权多空组合每日累积收益
group_adjust
:True
: 按行业对因子收益去均值后按因子值加权多空组合每日累积收益False
: 按因子值加权多空组合每日累积收益
计算指定调仓周期和前面定义好的加权方式计算多空组合每日累计收益
FactorAnalyzer.calc_top_down_cumulative_returns(period=5, demeaned=False, group_adjust=False)
-
参数
period
: 指定调仓周期demeaned
:True
: 对每日因子收益去均值后按因子值加权多空组合每日累积收益False
: 按因子值加权多空组合每日累积收益
group_adjust
:True
: 按行业对因子收益去均值后按因子值加权多空组合每日累积收益False
: 按因子值加权多空组合每日累积收益
根据调仓周期确定滞后期的每天计算因子自相关性
FactorAnalyzer.calc_autocorrelation(rank=True)
-
参数
rank
:True
: 秩相关系数False
: 普通相关系数
滞后n天因子值自相关性
FactorAnalyzer.calc_autocorrelation_n_days_lag(n=9, rank=True)
-
参数
n
: 滞后 n 天到 1 天的因子值自相关性rank
:True
: 秩相关系数False
: 普通相关系数
各分位数换手率n天的移动平均
FactorAnalyzer.calc_quantile_turnover_mean_n_days_lag(n=10)
-
参数
n
: 滞后 n 天到 1 天的换手率
滞后 0 - n 天因子收益信息比率(IC)的移动平均
FactorAnalyzer.calc_ic_mean_n_days_lag(n=10, group_adjust=False, by_group=False, method=None)
-
参数
n
: 滞后 0 - n 天因子收益的信息比率(IC)的移动平均group_adjust
:True
: 按行业对因子收益去均值后滞后0-n天因子收益的信息比率(IC)的移动平均False
: 滞后 0 - n 天因子收益信息比率(IC)的移动平均
by_group
:True
: 滞后 0 - n 天各行业的因子收益信息比率(IC)的移动平均False
: 滞后 0 - n 天因子收益信息比率(IC)的移动平均
method
:'rank'
: 用秩相关系数计算IC值'normal'
: 用普通相关系数计算IC值
绘制结果
展示全部分析
FactorAnalyzer.create_full_tear_sheet(demeaned=False, group_adjust=False, by_group=False,
turnover_periods=None, avgretplot=(5, 15), std_bar=False)
-
参数
-
demeaned
:True
: 对每天的因子收益和标准差去均值False
: 按分位数分组加权因子收益和标准差
-
group_adjust
:True
: 每天的因子收益和标准差按行业去均值False
: 按分位数分组加权因子收益和标准差
-
by_group
:True
: 按行业展示False
: 不按行业展示
-
turnover_periods
: 调仓周期 -
avgretplot
: tuple 因子预测的天数-(计算过去的天数, 计算未来的天数) -
std_bar
:True
: 显示标准差False
: 不显示标准差
-
因子值特征分析
FactorAnalyzer.create_summary_tear_sheet(demeaned=False, group_adjust=False)
-
参数
-
demeaned
:True
: 对每日因子收益去均值求得因子收益表False
: 因子收益表
-
group_adjust
:True
: 按行业对因子收益去均值后求得因子收益表False
: 因子收益表
-
因子收益分析
FactorAnalyzer.create_returns_tear_sheet(demeaned=False, group_adjust=False, by_group=False)
-
参数
-
demeaned
:True
: 对每日因子收益去均值求得因子收益表False
: 因子收益表
-
group_adjust
:True
: 按行业对因子收益去均值后求得因子收益表False
: 因子收益表
-
by_group
:True
: 画各行业的各分位数平均收益图False
: 不画各行业的各分位数平均收益图
-
因子 IC 分析
FactorAnalyzer.create_information_tear_sheet(group_adjust=False, by_group=False)
-
参数
group_adjust
:True
: 按行业对因子收益去均值后求得因子收益表False
: 因子收益表
by_group
:True
: 画按行业分组信息比率(IC)图False
: 画月度信息比率(IC)图
因子换手率分析
FactorAnalyzer.create_turnover_tear_sheet(turnover_periods=None)
-
参数
turnover_periods
: 调仓周期
因子预测能力分析
FactorAnalyzer.create_event_returns_tear_sheet(avgretplot=(5, 15), demeaned=False, group_adjust=False, std_bar=False)
-
参数
avgretplot
: tuple 因子预测的天数-(计算过去的天数, 计算未来的天数)demeaned
:True
: 对每天的因子收益和标准差去均值False
: 按分位数分组加权因子收益和标准差
group_adjust
:True
: 每天的因子收益和标准差按行业去均值False
: 按分位数分组加权因子收益和标准差
std_bar
:True
: 显示标准差False
: 不显示标准差
打印因子收益表
FactorAnalyzer.plot_returns_table(demeaned=False, group_adjust=False)
-
参数
demeaned
:True
: 对每日因子收益去均值求得因子收益表False
: 因子收益表
group_adjust
:True
: 按行业对因子收益去均值后求得因子收益表False
: 因子收益表
打印换手率表
FactorAnalyzer.plot_turnover_table()
打印信息比率(IC)相关表
FactorAnalyzer.plot_information_table(group_adjust=False, method='rank')
-
参数
group_adjust
:True
: 按行业对因子收益去均值后求得因子收益用于计算ICFalse
: 因子收益用于计算IC
method
:'rank'
: 用秩相关系数计算IC值'normal'
: 用相关系数计算IC值
打印个分位数统计表
FactorAnalyzer.plot_quantile_statistics_table()
画信息比率(IC)时间序列图
FactorAnalyzer.plot_ic_ts(group_adjust=False, method='rank')
-
参数
group_adjust
:True
: 按行业对因子收益去均值后求得因子收益用于计算ICFalse
: 因子收益用于计算IC
method
:'rank'
: 用秩相关系数计算IC值'normal'
: 用相关系数计算IC值
画信息比率分布直方图
FactorAnalyzer.plot_ic_hist(group_adjust=False, method='rank')
-
参数
group_adjust
:True
: 按行业对因子收益去均值后求得因子收益用于计算ICFalse
: 因子收益用于计算IC
method
:'rank'
: 用秩相关系数计算IC值'normal'
: 用相关系数计算IC值
画信息比率 qq 图
FactorAnalyzer.plot_ic_qq(group_adjust=False, method='rank', theoretical_dist='norm')
-
参数
group_adjust
:True
: 按行业对因子收益去均值后求得因子收益用于计算ICFalse
: 因子收益用于计算IC
method
:'rank'
: 用秩相关系数计算IC值'normal'
: 用相关系数计算IC值
theoretical_dist
:'norm'
: 正态分布't'
: t分布
画各分位数平均收益图
FactorAnalyzer.plot_quantile_returns_bar(by_group=False, demeaned=False, group_adjust=False)
-
参数
by_group
:True
: 各行业的各分位数平均收益图False
: 各分位数平均收益图
demeaned
:True
: 对每日因子收益去均值后的各分位数平均收益图False
: 各分位数平均收益图
group_adjust
:True
: 按行业对因子收益去均值后的各分位数平均收益图False
: 各分位数平均收益图
画最高分位减最低分位收益图
FactorAnalyzer.plot_mean_quantile_returns_spread_time_series(demeaned=False, group_adjust=False, bandwidth=1)
-
参数
demeaned
:True
: 对每日因子收益去均值后的最高分位减最低分位收益图False
: 最高分位减最低分位收益图
group_adjust
:True
: 按行业对因子收益去均值后的最高分位减最低分位收益图图False
: 最高分位减最低分位收益图
bandwidth
: n, 加减n倍当日标准差
画按行业分组信息比率(IC)图
FactorAnalyzer.plot_ic_by_group(group_adjust=False, method='rank')
-
参数
group_adjust
:True
: 按行业对因子收益去均值后的行业分组信息比率图False
: 行业分组信息比率图
method
:'rank'
: 用秩相关系数计算IC值'normal'
: 用相关系数计算IC值
画因子自相关图
FactorAnalyzer.plot_factor_auto_correlation(rank=True)
-
参数
rank
:True
: 用秩相关系数False
: 用相关系数
画最高最低分位换手率图
FactorAnalyzer.plot_top_bottom_quantile_turnover(periods=(1, 3, 9))
-
参数
periods
: 调仓周期
画月度信息比率(IC)图
FactorAnalyzer.plot_monthly_ic_heatmap(group_adjust=False)
-
参数
group_adjust
:True
: 按行业对因子收益去均值后的月度信息比率图False
: 月度信息比率图
画按因子值加权多空组合每日累积收益图
FactorAnalyzer.plot_cumulative_returns(period=1, demeaned=False, group_adjust=False)
-
参数
periods
: 调仓周期demeaned
:True
: 对每日因子收益去均值后的按因子值加权多空组合每日累积收益图False
: 按因子值加权多空组合每日累积收益图
group_adjust
:True
: 按行业对因子收益去均值后的按因子值加权多空组合每日累积收益图False
: 按因子值加权多空组合每日累积收益图
画做多最高分位做空最低分位多空组合每日累计收益图
FactorAnalyzer.plot_cumulative_returns_by_quantile(period=(1, 3, 9), demeaned=False, group_adjust=False)
-
参数
periods
: 调仓周期demeaned
:True
: 对每日因子收益去均值后的多空组合每日累计收益图False
: 多空组合每日累计收益图
group_adjust
:True
: 按行业对因子收益去均值后的多空组合每日累计收益图False
: 多空组合每日累计收益图
因子预测能力平均累计收益图
FactorAnalyzer.plot_quantile_average_cumulative_return(by_quantile=False, std_bar=False)
-
参数
by_quantile
:True
: 各分位数分别显示因子预测能力平均累计收益图False
: 因子预测能力平均累计收益图
std_bar
:True
: 显示标准差False
: 不显示标准差
画有效因子数量统计图
FactorAnalyzer.plot_events_distribution(num_days=1)
-
参数
num_days
: 统计间隔天数
关闭中文图例显示
FactorAnalyzer.plot_disable_chinese_label()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for jqfactor_analyzer-1.0.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c0c82f0bf315aa5477e73c429e7a5006a541e8b654b0e1d588024b198d41b48c |
|
MD5 | 4935eff188d8e273c3f0a0b8e3bbf7d4 |
|
BLAKE2b-256 | 0f7bc22a51172a83cea1585071b552664bb8a0803c7707eb0d53e461f37c291b |