高频直播笔记

计算五分钟流动性因子

  • 分钟数据降采样到五分钟
  • 计算五分钟最短路径
  • 一小时累计成交额
  • 一小时累计最短路径
  • 5分钟流动性 = 成交额 / 最短路径

如何生成高频因子

  • 分钟数据得到小时/日线因子
  • 日线因子放入之前的回测框架

高频脚本功能

  • 时序
  • 截面
  • 兼容性
  • 增量计算

案例

  • illq = 1h成交额 / 1h最短路径
  • 高频化:
  • 1分钟 - 5分钟
  • 5m最短路径 - 标准化
  • 求和 - 1h最短路径
  • illq = 1h成交额 / 1h最短路径

这里的最短路径要了解一下

魔改

  • 上涨
  • 放量
  • 筛选出一小时内满足要求的五分钟数据,基于这些数据计算illq

代码

  • 股票的逻辑为:

1 日线数据,和指数数据合并,得到完整的市场交易日期

2 计算因子,resample选股周期,比如一个月,按照因子排序得到选股数据

3 选股,绘制资金曲线

  • 高频币的逻辑为:

1 分钟数据

2 创建基准数据

  • 读取币种数据

get_file_in_folder得到symbol_list

symbol_list中存储的是文件夹中的所有币种

  • 基准数据的创建逻辑

给定开始 结束时间,默认结束时间为当前时间

给定周期 1h 1D,在config里面factor_period

min_bench 分钟级别基准数据

min_bench 包括candle_begin_time 以及time_group

time_group是对分钟数据的一个概括,如果周期为1h,2017-01-01 00:00:00 2017-01-01 00:01:00 2017-01-01 00:02:00 2017-01-01 00:03:00 2017-01-01 00:04:00的time_group都为2017-01-01 00:00:00,如果周期为1D,time_group为2017-01-01

period_bench 以factor_period为单位,将所有的日期都为一列罗列出来

  • 计算高频因子

首先从factors中获取所有因子,存储在列表stg_file

factors_list中存储因子的绝对路径

判断是现货还是合约 candel_type

calculate_by_code 输入币种代码,输出dataframe

  • calculate_by_code

计算每个币的高频因子

首先读取ftr文件为mdf

然后令period_bench 的时间范围框定为mf的时间范围

合并min_bench和mdf,时间以min_bench为准,这里类似与股票和指数合并,目的是为了处理没有交易的时间,是的时间统一化

这里采用增量计算,增量计算的意思是,如果这个因子已经被计算了,那么就不会再计算第二次,每次计算出来的因子都在data/分钟因子那里

基于的时间基准来自于:period_list,min_bench的所有group_time

那么period_bench怎么用的?

如果因子已经被计算,那么读取数据,读取数据的时候,主要看已经计算出来的因子时间是不是包括所有的时间(小时/day)

如果因子没有被计算,则创建文件夹,(这里没有做计算因子的操作)

然后计算高频因子,高频因子的计算在cal_min_factors,这个函数在factors下面的因子中实现。

new_period_list表示的是那些没有被计算因子的时间点

  • 将每个币计算出来的数据合并,然后按照时间 symbol排序,symbol是啥
  • 遍历因子,处理数据,在界面范围计算因子
  • 根据因子对数据分组
  • 对每组数据

将因子保存在'分钟因子下面'

  • 因子的计算在factors下面的因子文件中实现
  • cal_min_factors

参数:mdf、ddf、date

mdf分钟级别的数据,包含数据

ddf 小时或者天级别的数据,这个就是所有的小时或者天,只有时间信息

date:需要计算的时间

dm_df:筛选出mdf当中时间为date的数据

进行resample,这里对数据resample成5分钟或者10分钟数据

计算因子

  • 整理数据

首先合并得到的所有数据,将数据按照日期 币种的顺序进行排序all_factor_data。

遍历所有因子,对于每一个因子,找到这个因子的所有相关因子,比如一个因子,可能计算了它的5min 10min数据,作为小因子

如果小因子的数量不为0,也就是说这个因子已经被计算出来了,那么调用process_all_data,这个函数输出为所有因子数据,输出也为所有因子数据,不知道干嘛的,可以看看,注释说是计算截面范围的因子。

  • 分组保存数据

根据币代码对数据分组,每组都包含一个币种类,包含这个币的名字和币的数据

然后找到所有的因子,如果这个币的因子数量为0,说明这个币没有因子,跳过

将这个币的时间 币种 因子选出来,作为一个新的dataframe

构建因子数据的保存路径:现货 / 合约 选币周期 因子名字 币种,这里的因子名字是大因子的名字,不是小因子

如果路径存在:读取路径 为 fdf,补充,去重

如果路径不存在:创建dataframe为fdf,将时间 币种 因子 都放进去

  • 最后到底在干嘛???

之前计算出了每个币种在选币周期得到的因子

然后对每个因子,计算截面范围上的因子,

接着对数据按照币种分类,对于每个币的每个大因子

将这个信息都存储在分钟因子文件中。

理解

  • 因子的构造:首先拥有的是分钟级别的数据,首先需要计算因子,然后选股,计算因子需要一个日期,选股需要一个日期
  • 比如这里,我们采用了以日为单位的选股,但是直接采用分钟数据进行选股需要很大的计算量,难么就先用五分钟的数据,然后用5分钟的数据计算日线因子,以计算出来的日线因子作为选股标准。

代码

  • 读取准备数据

读取原始文件

创建benchmark,这里的benchmark很有意思,我记得股票数据中的benchmark是指数数据,包含市场交易所有天数,这里的benchmark的作用也是为了衡量市场交易的所有时间,这个benchmark一共分为两个:period_bench和min_bench,这里的period_bench 包含是时间区间内的所有选股周期,比如小时,那么period_bench就包含了所有的小时数据,比如天,那么period_bench就包含了所有的天数据。min_bench是在时间区间内的所有分钟,每个分钟对应了选股周期的时间,如果选股周期是小时,那么就是时间区间内所有分钟和小时的对应关系,如果选股周期是天,那么就是时间区间内所有分钟和天的对应关系。

  • 导入每个因子

首先遍历factors文件夹下的所有文件,得到所有因子

  • 遍历每个币,并行或串行

遍历每个币,计算因子,这里用到了calculate_by_code函数,并行或串行

这里需要对calculate_by_code做进一步研究

对calculate_by_code的猜测:首先将分钟数据降采样为五分钟数据,然后根据选股周期,计算因子,排序,选出n只币,计算资金曲线

calculate_by_code的输入为虚拟币代码,输出为dataframe:

时间(选币周期1h / 1d) 币的代码 因子值(5min / 10min流动性指标)

那么可以推测出calculate_by_code的作用是计算出单个币种的选股周期的因子

在这个函数之后,还需要做的是:让所有的币的数据合并在一起,按照因子排序,选出前n只币,然后计算资金曲线

  • 最终整理数据

首先将上一步得到的dataframe都合并在一起

然后对每一个大因子,计算截面因子

接着按照币种和打因子,将信息存储起来。

calculate_by_code

  • 读取分钟数据

首先读取币种的历史数据,并且将其和min_bench合并,与period_bench合并之后,如果数据为空,那么直接退出

  • 遍历每个因子,计算因子值

这里做了一个看起来很奇怪的事情,它在读历史数据,它这里假设,历史上都跑完了,而且跑的就是这个币的这个因子,如果有多有少,就先删了再跑。

它做的事情是,如果这个因子之前跑过了,那就读取之前的文件,然后获取之前没有计算,而现在需要计算的时间list

如果这个因子没跑过,那就新建文件,然后有一个时间list

总的来说,这一段,就是为了处理之前已经计算过的数据,因为计算量太大了,所以这里如果存在之前已经计算过的数据,那就找到那些没有计算的周期。这里的时间是小时或者天

万一有些计算了一天 / 一小时中的某些数据,其他数据没有计算怎么办

这里的pdf是天或者小时数据,以period_bench 计算

在找到之前计算过的数据之后,将之前计算过的数据和pdf合并

开始计算因子cal_min_factors cal_daily_factors 这里不懂,为什么要分开计算,之后再看

  • 因子数据整理并输出

由于混杂了之前的历史数据,以及在计算的时候,可能会带入一些别的列,这里找到了所有因子,和时间 币种一起保留下来,这里的数据是小时 / 天数据

calculate_by_code

  • 读取分钟数据

pdf为period_bench的dataframe

mdf是min_bench的dataframe和币的历史数据的合并

  • 遍历每个因子,计算因子值

由于计算量较大,如果之前有计算过该数据,那么就找到之前的数据,并整理没有计算过的时间周期

cal_min_factors cal_daily_factors计算因子

这里对这两个数据的猜测是:cal_min_factors计算1分钟到5分钟的数据,cal_daily_factors的作用是由五分钟数据计算小时或者填数据

  • 因子数据整理并输出

保存数据

cal_min_factors

  • 参数:时间(小时/天)mdf pdf

mdf 为数据和min_bench合并之后的结果

pdf(ddf)为period_bench数据,如果有已经计算好的数据,则pdf和已经计算好的数据合并

  • 需要计算的是特定时间的数据,所以,先获取mdf中特定时间下的数据
  • 现在的数据是分钟数据,首先要得到五分钟/10分钟数据。减小数据量
  • 然后计算小时/天数据。
  • 这里的周期开始交易日什么意思
  • temp复制分钟数据
  • 然后resample成5/10分钟数据,周期开始交易日为第一个分钟,并将名字改回candle_begin_time
  • 得到5/10分钟数据之后,计算最短路径,这里可以再看看,因为我也不知道最短路径是啥???
  • 这里为什么要计算5和10分钟,只计算5不行吗???
  • 最短路径:2*(最高价 - 最低价) / abs(开盘价 - 收盘价)
  • 最短路径标准化:最短路径 / 当天/小时的第一个开盘价
  • 标准化的作用:让值在0-1之间
  • 计算小时/日的成交额之和,计算最短路径之和
  • 将计算出来的小时/日的因子合并到ddf中。
  • 所以说这里的5分钟和10分钟,在计算出来之后,这些因子都要被合并在ddf中
  • 现有的代码,只计算了因子,基于分钟数据,首先resample成5/10分钟,基于5/10分钟的数据,计算小时/日的因子
  • 计算出因子之后,选股,绘制资金曲线不在考虑范围之内。
  • 放量流动性

只看一小时内放量k线的illq

成交量 > 平均成交量 + 标准差

其中平均成交量是这一小时/天的五分钟数据求平均

其中标准差是这一小时/天的五分钟数据求标准差

cal_min_factors

  • 总的来说,这个函数,传入mdf和pdf,其中mdf是分钟级别的原数据,pdf是小时/天级别的目标数据
  • 根据分钟数据,这个函数可以计算5/10/20分钟的因子
  • 首先将分钟数据resample为5/10分钟数据
  • 然后计算因子,写到pdf
  • 甚至可以魔改,挑选一定条件下的因子,放到pdf

cal_daily_factors

  • 这个函数的调用是在计算完cal_min_factors之后,对pdf进行处理
  • 这里在处理的数据是计算出来小时/天的因子之后,对数据进行rolling操作,是一个时序操作,计算的是小时/天的rolling操作
  • 这里有n和d,n表示的是5/10分钟,d表示的是rolling的天数

process_all_data

处理截面数据,比如5分钟和10分钟数据做加减乘除。。。

朋友圈文案

个人做量化可行吗?

机器学习做量化可行吗?

自学量化

没有计划

抄我的就行

神经网络做量化,效果咋样?

相关推荐
2401_858286114 小时前
L7.【LeetCode笔记】相交链表
笔记·leetcode·链表
龙中舞王5 小时前
Unity学习笔记(2):场景绘制
笔记·学习·unity
青椒大仙KI116 小时前
24/11/7 算法笔记 PCA主成分分析
笔记·算法·信息可视化
光明中黑暗6 小时前
机器学习 笔记
人工智能·笔记·机器学习
明辉光焱8 小时前
Node.js笔记
javascript·笔记·node.js
RationalDysaniaer8 小时前
gin入门
笔记·gin
在下方方9 小时前
【快捷入门笔记】mysql基本操作大全-SQL表
笔记·sql·mysql
kjyzx6610 小时前
期刊论文查重率多少,才会不被认定为学术不端?
笔记
CXDNW10 小时前
【网络面试篇】其他面试题——Cookie、Session、DNS、CDN、SSL/TLS、加密概念
网络·笔记·面试·cdn·dns·cookie
dal118网工任子仪10 小时前
web安全漏洞之xss(1)
笔记·学习·web安全·网络安全·xss