# Matlab 因子分析 # 因子分析是基于Auto-Trader Matlab Toolbox(以下简称Matlab工具箱)的一项额外功能,专门用于因子的分析,其功能包括因子函数的编写,因子结果的计算,因子的分析结果展示等。 与策略的结构框架不一样,Matlab工具箱没有使用复杂的事件驱动框架来实现,所以,因子分析不像策略,没有<font color=red>明确的账户、资金和持仓</font>的概念,也不存在在策略里常用的<font color=red>下单操作、资金查询,持仓信息查询,委托信息查询,成交信息查询、止盈止损</font>等操作,对应的API将<font color=red>**不允许**</font>在因子分析的功能中使用。 以下内容将着重描述因子分析的独特功能,其他部分请查阅[Matlab API说明](https://www.digquant.com.cn/at.php?mod=api) 以下API中带有”★” 的表示为只能在<font color=red>因子计算</font>中使用,无法在<font color=red>命令行</font>以及在<font color=red>策略函数</font>中使用 如仍无法解决您的问题,可以通过[社区](https://www.digquant.com.cn/forum.php?mod=forumdisplay&fid=3)、QQ群、电子邮件或者客服电话告诉我们,谢谢 # 因子计算函数的编写 # ### 主函数定义 ### ---------- 通过自定义主函数名初始化因子计算函数,启动时会通过函数名传递给执行脚本进行调用。函数的输入参数格式固定,为` bInit` 。与策略结构一样,具体可以参考[策略主函数定义](https://www.digquant.com.cn/at.php?mod=api#h3-u4E3Bu7B56u7565u51FDu6570u5B9Au4E49-13)。 **示例:因子主函数** ```matlab function fvalue=factorA(bInit) global g_idx; fvalue=[]; if bInit % 注册PE因子 g_idx = traderRegFactor('PE'); %注册因子 else % 获取注册的因子数据 result = traderGetRegFactor(g_idx,1); % 返回因子数列 fvalue = result(2:end); end end ``` 整个因子计算的步骤 1.定义主策略函数,通过`if bInit`判断是否开始 2.若`bIint`为True则注册数据频率 3.若`bInit`为False则因子计算逻辑 4.返回因子的数值序列 **初始化** 初始化是指通过`bIint`来判断策略开启时刻,与策略的初始化操作一样,每次启动时都会先执行初始化的操作,且只会执行一次,具体操作可以见[策略的初始化](https://www.digquant.com.cn/at.php?mod=api#h3-u4E3Bu7B56u7565u51FDu6570u5B9Au4E49-13) **因子计算** 因子计算是指根据 [因子计算入口](#traderCalcFactor) 处指定的投资域,根据因子计算的具体逻辑,<font color=red>**按日频(交易日)**</font>计算每一个成分股标的的因子数值并返回过程。类似于策略,通过 [因子主函数](#因子主函数) 实现因子计算的整体逻辑,可以完成以下几个操作· - 获取注册数据 通过 `traderGetRegKData` 获取注册的行情数据,使用方式与策略结构一样 通过 `traderGetRegFactor` 获取注册的因子数据,使用方式与策略结构一样 通过 `traderGetRegUserData` 获取注册的外部数据,使用方式与策略结构一样 通过 `traderGetRegUserIndi` 获取注册的自建函数结构,使用方式与策略结构一样 - 获取因子自序列数值 在一些特点的场景中,因子数值的计算有时间序列上的依赖,本期的因子数值会依赖于过去的因子数值计算,类似于AR(1),因此需要专门的API来获取过往期数的因子数据,具体的使用请见[获取因子自序列数值](#traderGetAutoValue)。 ### 执行脚本定义 ### ---------- 因子计算的启动入口函数,使用请见[`traderCalcFactor`](#traderCalcFactor) **示例:执行脚本** ```matlab clear all; clc; FactorName = 'factorA'; Targets = 'SZ50'; BeginDate = 20170101; EndDate = 20170301; %设置factorA中返回矩阵的长宽,当不为n*1时会报错 traderCalcFactor(FactorName, @factorA, Targets,BeginDate,EndDate,'NA'); ``` 具体的操作可以见[Maltab API说明-执行脚本定义](https://www.digquant.com.cn/at.php?mod=api#h3-u6267u884Cu64CDu4F5Cu811Au672Cu5B9Au4E49-14) ### 返回因子数值 ### ---------- 因子计算函数必需将因子的结果返回,目前仅支持<font color=red>**nx1的矩阵**</font>,其中n为投资域的成分股数量。 # 因子分析的结果 # 当因子的计算代码开始运行后,Auto-Trader(以下简称AT)的界面上会显示因子分析的结果,具体的分析结果解析,请见[新手指引-因子分析](#https://www.digquant.com.cn/documents/10)。 用户可以根据界面的指引和研究的需求,调整因子分析的参数,具体可参考[新手指引-因子分析](#https://www.digquant.com.cn/documents/10)。 # 因子分析API介绍 # ## 基本函数 ## <span id="traderCalcFactor"></span> ### traderCalcFactor - 因子计算入口 ### ---------- **函数原型:** traderCalcFactor(FactorName, @FactorFunc, Targets, BeginDate, EndDate,FQ) **参数:** |参数名|类型|说明 |:-|:-|:-| |FactorName|char|因子名 |@FactorFunc|函数|函数名称 |Targets|char|投资域简称,支持指数和行业的简称,其中'AllSecA'代表全A |BeginDate|int|开始日期,使用YYYYMMDD格式 |EndDate|int|结束日期,使用YYYYMMDD格式 |FQ|int|复权类型,"Fward"-前复权,"Bward"-后复权,"NA"-不复权 **示例:** ```matlab traderCalcFactor("FactorExample", @factorA, "SZ50", 20170101, 20170301,'NA'); ``` **注意:** 1. <font color=red size=3>` FactorName `</font>会出现在AT的页面中,用于方便用户对不同因子进行区分 2. 因子计算只支持<font color=red size=3>` 2007年1月1日 `</font>之后的数据 ## 因子数据获取 ## <span id="traderGetAutoValue"></span> ### ★ traderGetAutoValue - 获取因子自序列数据 ### ---------- **函数原型:** traderGetAutoValue(Length) **参数:** |参数名|类型|说明 |:-|:-|:-| |Length|int|获取过往因子自序列的期数 **输出:** ` 1*(n*Length) `的struct结构体,n为投资域的成分股个数 |key|类型|说明| |:-|:-|:-| |date|datenums|交易日| |market|char|市场| |code|char|标的代码| |target_idx|int|标的索引号| |value|double|因子数值| **示例:** ```matlab % 获取过往2期的因子数值 data = traderGetAutoValue(2) ``` **注意:** 1. <font color=red size=3>` Length为1 `</font>表示获取前1期的因子自序列数值。当获取过往期数的日期超过[因子计算入口](#traderCalcFactor)中定义的开始日期,则会返回`NaN` 2. 若在因子计算主函数里没有按照要求的数据格式返回时,报错 # 示例 # ### 过去10天收益率因子 ### ---------- **执行脚本** ```matlab % 适用于Matlab 2015版本以上(包含2015) clear all; clc; FactorName = 'past_ten_day'; Targets = 'SZ50'; BeginDate = 20170101; EndDate = 20171213; %设置factorA中返回矩阵的长宽,当不为n*1时会报错 traderCalcFactor(FactorName, @factorA, Targets,BeginDate,EndDate,'NA'); ``` **因子函数** ```matlab function fvalue=factorA(bInit) global idexD; global data; fvalue=[]; if bInit idexD = traderRegKData('day',1); %注册日频K线数据 else result = traderGetRegKData(idexD,10,true);%每次取十根 if sum(sum(isnan(result))) %如果时间长度不够就返回NAN fvalue = ones(length(idexD),1)*nan; else open = result(2:8:length(result),1); %获取第一天开盘价 open(find(open==0) )= nan; %将停牌的股票开盘价设为nan close = result(5:8:length(result),10);%获得最后一天收盘价 fvalue = close./open-1; %返回10日收益作为因子值 end end end ``` ### alpha 101 N日内的背离程度 ### ---------- **执行脚本** ```matlab % 适用于Matlab 2015版本以上(包含2015) clear all; clc; FactorName = 'correlation_return_volume'; Targets = 'SZ50'; BeginDate = 20170101; EndDate = 20171213; %设置factorA中返回矩阵的长宽,当不为n*1时会报错 traderCalcFactor(FactorName, @factorB, Targets,BeginDate,EndDate,'NA'); ``` **因子函数** ```matlab function fvalue=factorB(bInit) global idexD; fvalue=[]; if bInit idexD = traderRegKData('day',1); %注册K线数据 else result = traderGetRegKData(idexD,10,true);%每次取两根 if sum(sum(isnan(result))) %如果时间长度不够就返回NAN fvalue = ones(length(idexD),1)*nan; else fvalue=zeros(50,1); open = result(2:8:length(result),:); %获取开盘价 open(find(open==0) )= nan; %将停牌的股票开盘价设为nan close = result(5:8:length(result),:);%获得收盘价 return_list = close./open-1; %获得当日收益,停牌股票为nan volume = result(6:8:length(result),:); %获得交易量 for index_i = 1:length(idexD )%遍历标的算因子值 if sum(isnan(return_list(index_i,:))) %如果有nan 因子值就为nan fvalue(index_i) = nan; else corr_single=corr(return_list(index_i,:)', volume(index_i,:)', 'type' , 'Spearman');%计算spearmanr相关系数 fvalue(index_i) = corr_single; %赋值 end end end end end ``` ### 复合因子 ### ---------- **执行脚本** ```matlab clear all; clc; FactorName = 'factorA1'; Targets = 'SZ50'; BeginDate = 20170101; EndDate = 20170301; %设置factorA中返回矩阵的长宽,当不为n*1时会报错 traderCalcFactor(FactorName, @factorA1, Targets,BeginDate,EndDate,'NA'); ``` **因子函数** ```matlab function fvalue=factorA1(bInit) global g_idx1; fvalue=[]; if bInit % 注册估值PE,流动市值NegMktValue因子 g_idx1 = traderRegFactor('PE','NegMktValue'); else % 获取注册的因子数据,2个因子的数据形式是N*1的数据 [date,fator1,factor2],date是日期, factor1是第一个因子的系列值 % factor2是第二个因子的系列值,在本例中,第一个值是date, 因为选股标的是上证50,所以factor1是上证50中50只标的的PE值 % factor2是50只标的的NegMktValue值 result1 = traderGetRegFactor(g_idx1,1); % 第一个因子PE, i=1; factor_data1 = result1(2+50*(i-1):50*i+1,:); % 对PE因子小于0的标的用NAN值替代 factor_data1(find(factor_data1<0)) = nan; % 将因子标准化去除量纲 mean_f1= mean(factor_data1,'omitnan'); std_f1= std( factor_data1,'omitnan' ); factor_data1 = (factor_data1- mean_f1)/std_f1; % % 第二个因子mktvalue j=2; factor_data2 = result1(2+50*(j-1):50*j+1,:); mean_f2= mean(factor_data2,'omitnan'); std_f2= std( factor_data2,'omitnan' ); factor_data2 = (factor_data2-mean_f2)/std_f2; result= factor_data1+factor_data2 % 返回因子数列 fvalue = result; % end end ```
contact@digquant.com.cn

联系

邮箱

0755-8695-2080

联系

电话

关注

微信

关注

QQ

回到

顶部