应用 queuing model 对 limit order book 进行预测

利用不同的排队论模型得到limit order book的平均队列长度QL和平均等待时间DLC,与收益率进行相关性分析。

模型假设

使用买一价和卖一价的平均值作为 reference price,用一段时间间隔下reference price 的变化率作为收益率。利用use.total_amount和use.net_amount可以得到买方和卖方的成交单量,分别作为队列的离开与到达。

使用数据

文件/data/intern/3_weeks.pq,每0.25s一个数据点。后面主要用到中频和高频两种取样方法。
中频:每10s的volume求和作为一个点。对于每个点,使用其前30分钟的数据作为队列计算,与后15min的收益率进行相关性检验。
高频:每1s的volume求和作为一个点。对每个点,使用其前60s的数据作为队列计算,与后15s的收益率进行相关性检验。

模型总结

M/M/1模型
假定到达与离开都服从poisson分布,参数记为\lambda, \mu,则有缓冲效用\rho=\frac{\lambda}{\mu}

QL=\frac{\rho}{1-\rho} , DLC=\frac{\rho}{\mu-\lambda}

M/M/1/N
在上模型基础上限定最大队长N

DLC=\rho*\frac{1-(N+1)\rho^N+N\rho^{N+1}}{(1-\rho)(1-\rho^{N+1})}

M/G/1模型
假定离开是独立同分布,其他同M/M/1

QL=\frac{\lambda^2 \overline {X^2}}{2(1-\rho)} , DLC=\frac{\lambda \overline {X^2}}{2(1-\rho)}

G/G/1模型
到达与离开都是独立同分布,没有直接的计算公式,需要先算出队列的概率密度函数再计算。具体到本limit order book的问题,概率分布的公式如下:

\pi_i(n)=\pi_i(0)\prod_{j=1}^n \rho_i(j-1)
\pi_i(0)=(1+\sum_{n=1}^\infty \prod_{j=1}^n\rho_i(j-1))^{-1}
则一般情况下可得:
DLY_i=1-\pi_i(0)
QL_i=\sum_{k=1}^\infty k\pi_i(1+k)

运算代码

M/M/1模型

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
from scipy.stats import pearsonr
data = pd.read_parquet('/data/intern/3_weeks.pq')

Pref=(data['ask1']+data['bid1'])/2
data["Pref"]=Pref
use=data.loc[:,['net_amount','total_amount','Pref']]
use['decrease_amount']=(use.total_amount+use.net_amount)/2#买方成交单量 离开
use['increase_amount']=(use.total_amount-use.net_amount)/2#卖方成交单量 到达

use=use.resample('10s').sum()#以10s的数据计算
lambda_=use.increase_amount.rolling('30T').mean()
mu_=use.decrease_amount.rolling('30T').mean()
rate=np.ones(len(use))
for i in range(len(use)):
    if i < 60:
        rate[i]=(use.Pref[i]-use.Pref[0])/use.Pref[0]
    else:
        rate[i]=(use.Pref[i-60]+use.Pref[i])/use.Pref[i-60]
use["rate"]=rate
#清除死亡率小于出生率的点
lambda0=[]
mu0=[]
rate0=[]
for i in range(len(mu_)):
    if mu_[i]>lambda_[i]:
        lambda0.append(lambda_[i])
        mu0.append(mu_[i])
        rate0.append(rate[i])
rho=np.array(lambda0)/np.array(mu0)
lambda_=np.array(lambda0)
mu_=np.array(mu0)
rate=np.array(rate0)
#平均等待时间W,平均队长N
W=rho/(mu_-lambda_)
N=lambda_*W
N_use=N[180:-60]
rate_use=rate[240:]
pearsonr(N_use,rate_use)

M/G/1模型

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math
from scipy.stats import pearsonr
data = pd.read_parquet('/data/intern/3_weeks.pq')
Pref=(data['ask1']+data['bid1'])/2
data["Pref"]=Pref
use=data.loc[:,['net_amount','total_amount','Pref']]
use['decrease_amount']=(use.total_amount+use.net_amount)/2#买方成交单量 离开
use['increase_amount']=(use.total_amount-use.net_amount)/2#卖方成交单量 到达

use=use.resample('10s').sum()#以10s的数据计算
lambda_=use.increase_amount.rolling('30T').mean()
mu_=use.decrease_amount.rolling('30T').mean()
rate=np.ones(len(use))
#计算10分钟平均收益率
for i in range(len(use)):
    if i < 90:
        rate[i]=(use.Pref[i]-use.Pref[0])/use.Pref[0]
    else:
        rate[i]=(use.Pref[i-90]+use.Pref[i])/use.Pref[i-90]
use["rate"]=rate
key=use.decrease_amount*use.decrease_amount
key=key.rolling('30T').mean()
#清除死亡率小于出生率的点
lambda0=[]
mu0=[]
rate0=[]
for i in range(len(mu_)):
    if mu_[i]>lambda_[i]:
        lambda0.append(lambda_[i])
        mu0.append(mu_[i])
        rate0.append(rate[i])
rho=np.array(lambda0)/np.array(mu0)
lambda_=np.array(lambda0)
mu_=np.array(mu0)
rate=np.array(rate0)
#平均等待时间W,平均队长N
W=(lambda_*key)/(2*(1-rho))
N=lambda_*W
N_use=N[180:-60]
rate_use=rate[240:]
pearsonr(N_use,rate_use)

G/G/1模型

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import pearsonr
data = pd.read_parquet('/data/intern/3_weeks_1s.pq')
use=data.loc[:,['net_amount','total_amount']]
use['decrease_amount']=(use.total_amount+use.net_amount)/2#买方成交单量 离开
use['increase_amount']=(use.total_amount-use.net_amount)/2#卖方成交单量 到达

use=use.resample('10s').sum()
use=use[:500]#确定队列长度

Pref=(data['ask1']+data['bid1'])/2
use["Pref"]=Pref
#计算队列
use['total_size']=np.add.accumulate(use.increase_amount)-np.add.accumulate(use.decrease_amount)
#用clip函数处理极值
use.decrease_amount=np.clip(use.decrease_amount.values,0.001,100000)
use.increase_amount=np.clip(use.increase_amount.values,0.001,100000)
use.total_size=use.total_size/4000#size减小倍,这样size的概率密度函数有意义,不然都是0或1
use.total_size=use.total_size.astype(int)#模型需要用整数计算
t=180#30min*6数据点个数
#frho函数,用于确定第i个点的rho(n)的值,
def frho(i,n):
  queue=use[i-t:i]
  sincrease=0.00001
  sdecrease=0.00001
  for j in range(len(queue)-1):
      if queue.total_size[j] == n:
          sincrease+=queue.increase_amount[j]
          sdecrease+=queue.decrease_amount[j+1]
  return sincrease/sdecrease
use['num']=range(len(use))
times=40#无穷次求和,设置一个大数,观察知rho_times=0,则设为t足够
def fpi(i,n):
  a_use1=[]
  onlyusethere=[]
  for j in range(times):
      x=frho(i,j+1)
      onlyusethere.append(x)
  a_use1=np.add.accumulate(onlyusethere)    
  t_use=np.multiply.accumulate(a_use1)
  pi_0=1/(1+t_use.sum())
  if n==0:
      return pi_0
  else:
      return pi_0*t_use[n-1]
QL=[]
for i in range(len(use))[t:len(use)]:
  sum=0
  for j in range(times):
      sum+=j*fpi(i,j)
  QL.append(sum)
  print(len(QL))
QL  
#将QL写入外部文件,便于并行时调用
output = open('1.pk', 'wb')
pickle.dump(QL, output)
output.close()
rate=np.ones(len(use))
#计算10分钟平均收益率
for i in range(len(use)):
  if i < 90:
      rate[i]=(use.Pref[i]-use.Pref[0])/use.Pref[0]
  else:
      rate[i]=(use.Pref[i-90]+use.Pref[i])/use.Pref[i-90]
use["rate"]=rate
N_use=QL[:-60]
rate_use=use.rate[240:]
pearsonr(N_use,rate_use)

结果分析

M/M/1

高频:
pearson相关系数:-8.09*10^{-5}
中频:
pearson相关系数:0.0104

M/M/1/N

N 取50时

高频:
pearson相关系数:-0.04734
中频:
pearson相关系数:-0.0378

N 取10时

高频:
pearson相关系数:-0.0059
中频:
pearson相关系数:0.04312

M/G/1

高频:
pearson相关系数:8.66*10^{-4}
中频:
pearson相关系数:0.0015

G/G/1

考虑到中频的相关性明显高于高频情况,只列出中频的结果,并用过去5min收益率、10min收益率、15min收益率作为信号,同未来15min收益率计算相关性进行对比。

计算1.5h的数据(540个数据点)

pearson相关系数:0.44798
前5min收益率与后15min收益率相关性:-0.3894
前10min收益率与后15min收益率相关性:-0.4175
前15min收益率与后15min收益率相关性:-0.5029

计算12小时的数据(4000个数据点)

pearson相关系数:0.08827
前5min收益率与后15min收益率相关性:-0.4396
前10min收益率与后15min收益率相关性:-0.4275
前15min收益率与后15min收益率相关性:-0.4147

计算24小时的数据(8000个数据点)

pearson相关系数:0.05169
前5min收益率与后15min收益率相关性:-0.4582
前10min收益率与后15min收益率相关性:-0.4570
前15min收益率与后15min收益率相关性:-0.4515

数据量变大时,前5min,10min,15min收益率和后15min收益率的相关性系数基本不变,维持较高的值,而GG1模型得出的相关系数持续减小

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 对于 D 题的原题意,出题人和验题人赛前都没有发现标算存在的问题,导致了许多选手的疑惑和时间的浪费,在此表示真诚的...
    _Carryon阅读 251评论 0 0
  • 古陶瓷的年轮 北京华夏物证古陶瓷鉴定技术研究所采用现代量子物理学检测技术,通过测定古陶瓷釉的老化程度来鉴定古陶瓷的...
    古风雅韵阅读 176评论 0 0
  • 来源: 微信号: Allen赵 ID:zhao456zhao 上映9...
    Allen赵阅读 554评论 0 1
  • 时隔一年,终于又身临其境,走进剧院去看场话剧,这次是非常林奕华四大名著终结篇《红楼梦What's sex?》 它借...
    cyliabai阅读 431评论 0 0
  • 第一种基本情况:没有使用position left 和 top设置属性无效. 效果图如下 符合文档流的基本顺序: ...
    司马捷阅读 1,427评论 0 1