查看R语言中dll文件中的代码

Python015

查看R语言中dll文件中的代码,第1张

dll文件是编译好的,不再存在源代码了。不过R语言是开源的,如果要阅读源代码,要专门去下载R语言的源代码。

比如

http://cran.cnr.berkeley.edu/src/base/R-3/R-3.3.2.tar.gz

点过程基础

假设你蹲在一个交通站台后面,看着人来人往。你觉得乘客的到达似乎存在某种数学规律, 于是你把每个人到达的时刻记录了下来。有什么办法可以对这些人到达的时刻进行建模?你渐渐进入了沉思状态。也许提炼这些点形成的集合所具有的特征是一个好办法。你想到乘客到来的速率肯定是一个重要特征,如果是在一个偏僻的小公交站,可能半天也看不到一个人 ; 到了市中心的大车站,人潮涌动可能让你难以计数。不同人到来的间隔是另外一个有意思的特征,乘客不是从工厂出来的产品,肯定不会乖乖地等间隔的到来,那么不同乘客到来的间隔有什么规律呢?要回答这些问题,必须要借助概率的语言,更确切地说,是点过程。

泊松过程

泊松过程有以下几个性质:

不相交的时间段上到来的数量是相互独立的;两个点几乎肯定不会同时到达;在某个给定的时间段到达的数量服从泊松分布,分布均值正比于时间段的长度。

从数学层面来描述具有这样性质的过程,首先我们从第二个性质开始 , 我们用 N(a,b] 表示 a <t <= b 这段时间发生的事件数。

对于一个趋近于0的 Δt , 我们声明 , 对任意t

P(N(t, t + Δt]=1)=λΔt

由于 λ 的含义是单位时间内事件的数量 , 所以可以定义为事件发生的强度。

由于两个点不会同时到达 , 在小段时间里发生两次的概率约等于0

P(N(t, t + Δt >= 2) → 0

那么对于任意时间段 (a,b] , 我们可以先将其划分为多个小时间段 , 然后由不同时间段的 独立性, 用二项分布来计算概率分布 , 再用泊松分布近似:

可以看到 N(a,b] 近似服从参数为 λ(b-a) 的泊松分布。

现在我们来看一看两个事件的间隔服从什么分布 , 间隔为t0 意味着这t 0 时间段没有事件发生, 那么可以很容易的进行计算:

我们可以利用间隔服从指数分布的性质,模拟服从泊松过程的事件,第k个事件的时刻就是第 k-1 个事件时刻加参数为λ 的指数分布的随机变量:

举个例子, 我们可以模拟一个 λ 为 0.5 的泊松过程 , 总共模拟 50 个事件, 可以画出事件与时间的关系:

还可以画出累积事件与时间的关系 , 按照我们的估算 , 发生 50 个 λ 为 0.5 的事件大约要用 100 的时间,我们可以从图中进行验证。

** Hawkes过程**

在泊松过程中,强度保持恒定,事件的发生遵循“无记忆性”的原则,在现实世界中,很多情况 都不符合这样的假定,例如犯罪行为往往具有空间上的聚集性,这是由于罪犯在得手后倾向于在附近继续作案;而在高频交易中趋势交易者会跟踪大订单,使得市场在短时间涌入大量订单。在这些系统中,事件发生的速率都是不均匀的。如何描述这种空间上的聚集性,或者说是正反馈的机制呢?我们需要对模型进行扩展,不再把 λ 固定为一个确定的值,而是让他成为一个关于时间的函数,即 λ(t) 。

比较精确的定义是当 Δt 趋近为 0 时:

P(N(t, t + Δt]=1)=λ(t)Δt

其余的假设相似 , 在小间隔内发生2次或以上事件的概率趋近为0 。

λ(t) 的定义则为:

的 λ0(t) 代表的是背景的强度 , 而 v(t - ti) 则代表发生在 t 时刻之前的事件对时刻 t 产生的正向影响 , v 函数就是核函数 , 简单来说 , ti离t 越近 , 对t时刻造成的影响就应更大。

先使用一个比较简单的核函数:指数函数来看一看 Hawkes 过程究竟有什么特性:可以定义

模拟了 100 个事件,可以把事件和对应的强度画在一张图上

可以通过数值验算一下我们的结果是否合理:

强度的实际平均值为 Nt / t大约为 100/150 ,而我们可以推导理论的平均值:

图片里的 λ0 是我们定义的 μ , 而图片里的 μ 代表我们要算来和实际对比的强度的平均值 E[λ(t)],注意从第一排到第二排的变换是根据 λ(t) 的定义。

可以计算出理论值

E[λ(t)] = μ / (1 - (α/β)) = 2/3

与实际的较为接近,说明模拟是正确的。

指数核Hawkes过程模拟优化

对指数核函数的 Hawkes 过程进行模拟 , 当我们把 事件个数调大时,比如从 100 调到 1000 时,可以发现程序运行的时间大大增加了, 这是由于在算时刻对应的强度时需要调用前面所有的事件时刻,所以复杂度是 O(N^2).

Hawkes 过程参数估计

因为后面的函数 nlminb 所做的是使函数的值最小化 , 上面的似然函数中我们输入的是负的似然函数。

经过优化得到的参数非常接近我们的真实参数(0.5,0.3,1.2) , 这说明极大似然估计非常有效。

Hawkes 过程的核函数可以指定多种形式 , 除了指数核函数以外 , 还可以使用幂律核函数 ,甚至不指定核函数的具体形式, 使用非参数的方法求取核函数 。

订单流数据表示

在金融市场上做交易时 , 可以看到一个委托单簿,上面陈列着买价和卖价以及它们对应的量 , 举个例子,比特币市场的订单簿:

action_itme 的含义是订单类型 , 其中 “M” 代表对 order book 的改变 , 换句话说就是限价单;而 “T” 代表的是 trade ,也可以说是市价单。 ask price 和 ask vol 分别代表最优卖价和量 , bid price 和 bid vol 分别代表最优买价和量 。 price 和 vol 分别代表订单对应的价格和量。 time 是以 1970 年开始计算的秒数。

时间的精度 , 达到了10的负7次方 , 也就是达到了微秒级。

用函数将其转化为 R 语言中的时间格式 , 发现首个数据的时间是下午 5 点。

由于美国标普 500 的交易时间是上午 8 点半到下午 3 点 , 我们用一个二分搜索把交易时间内 的数据提取出来,并命名为 trade

订单间隔分析

75 分位数和均值大约 0.02s , 这可以说明标普 500 期货的交易非常频繁,流动性非常好。

上面是订单间隔的分布图,由于大于 0.01s 的间隔较少,我们选取小于 0.01s 的间隔进行可视化,可以观察到分布是高度有偏的,绝大多数间隔都非常小。

用指数分布去拟合小于 0.04 的订单间隔,发现实际数据衰减的速度远远高于对应最优参数模拟指数分布衰减的速度。由于指数分布的衰减速度是非常快的,这更说明小间隔的比例有多么大,可以说这是实实在在的“高频”交易。

高频交易中有一类交易者叫做做市商,它们在市场中挂买单和卖单,如果都成交了就可以赚取 其中的价差。它们一般下限价单,为市场提供流动性,当然它们也会有一些自己的策略,例如在市场上出现市价单时做市商一般会调整自己的订单,所以他们会马上下跟踪的限价单,我们从统计来看一看市场有没有这样的现象。

我们选取的是 1s 和 0.01s , 如果是平稳的那么 0.01s 对应的分位数应该是 1s 的百分之一左右。但是实际上在越高的分位数上这个规律就越不成立 ,在 99.99 分位和 99.999 分位上甚至超过了十分之一。

这说明事件的到来有高度聚集的特征,不能简单地用泊松过程来刻画 。

流动性研究

流动性的含义是当你想交易时,你是否有能力快速地进行大规模交易。它由三个要素组成,速度,深度和宽度。

深度主要与订单量有关,两方的订单量越多,能够承受的买压或卖压就更大,流动性就更好

而宽度主要与价格有关,在市场中我们可以看到一些交易量小的标的,它的 bid 和 ask 的距离非常之大,这样如果我们用市价单一买一卖,会有较大的损失,而对于一些交易量大的标的,bid 和 ask 的距离可能非常小,可以放心下市价单进行即时交易。

由于我们的数据里只有最优买价和最优卖价,没法对深度进行分析,我们只能通过分析 bid 和 ask 的距离(这个距离被称作 spread)来分析一下宽度。

可以看到绝大多数时候 spread 都是 25(1 个 tick) ,说明标普 500 期货 的流动性非常之好。

限价单相对价格分析

当在准备下限价单时,我们有很多选择,可以当一个保守的人,下一个离最优价格很远的单子,也可以下离最优价格很近的单子,这样很大概率能够快速成交。

我们把相对价格定义为

bid_relative_price = (best bid - 下单价格) / tick

ask_relative_price = (下单价格 - best ask) / tick

这样可以做一个统计,来看一看限价单相对价格的统计分布。

从图中我们可以看到 , 买单和卖单的相对价格在0之前分布基本相同

指数核 hawkes 过程拟合

形象地来看,限价单组建起了买方和卖方的堡垒,而市价单则对对手的堡垒发起冲击。 那么作为进攻部队,市价单对买方卖方力量的博弈是非常关键的。

把时间相同的订单进行合并,并把所有时间减去初始值

拟合得到的 beta 的值非常大,说明前面事件对后面事件的影响衰减得非常快。注意 1/beta 被定义为 Hawkes 过程的记忆时间 , 超过这个时间的后续事件基本不受这个事件的影响 。 这里我们可以看到影响周期小于一毫秒 , 说明频率确实非常快。

正反馈强度分析

索罗斯在他的“金融炼金术”中提出了一种叫做 reflexity(自反性)的理论 , 这个理论说的是投资者和交易者的认知偏差会改变标的的基本面。例如一支股票持续上涨,会使得投资者对提高对它基本面的认知 ,又反过来推动股价的进一步上升, 从而形成正反馈。

但是如何量化地对正反馈进行分析一直是一个问题。在 Hawkes 过程中,根据 lambda 的表达式我们可以把事件发生的强度分为两部分 , 一部分是背景的强度 , 一部分则是由前面事件激发而得到的强度,这部分“衍生”的强度的平均值可以被认为是正反馈的强度。

例如在指数核中,我们可以通过积分计算出正反馈机制的比例是 alpha / beta , 下面我们把一天的时间按照30分钟的间隔分为13段 , 看看每一段的背景强度和 reflexity 分别是多少。

然后我们可以开始尝试建模,将量的因素考虑进去:

订单数量的幂指数

前面我们假设订单量的影响是线性的,可真实是这样的吗,我们尝试在订单数量上加入一个幂指数,那么强度的表达式变为

从参数我们可以看到k的值大约是 0.5 , 说明订单的影响大约是数量的根号,并不是线性增长的。 这是非常有趣的一个现象 , 说明订单量的冲击是边际递减的。