有哪些向量化写法让你拍案叫绝?

论坛 期权论坛 期权     
袁浩瀚   2018-10-17 22:48   13095   9
在很多数据分析中(还有函数式编程中),向量式(vectorized)写法可以大大提升计算效率(比如R、Python Pandas)里面,而且向量式写法也更加容易并行运算。有哪些你写过或者见过的向量式写法令你拍案叫绝的?我自己印象深刻的是向量式统计连续递增递减序列
分享到 :
0 人收藏

9 个回复

正序浏览
9#
120701101  2级吧友 | 2018-10-17 22:48:13 发帖IP地址来自
买一本《MATLAB向量化编程基础精讲》马良写的,某宝有卖。
8#
zakufish  2级吧友 | 2018-10-17 22:48:12 发帖IP地址来自
在MT4平台上写过外汇交易算法的都知道,MQL 4中,如果你想关单,如果只关掉单子得一部分volume,比如说一个buy了2手的order,你close时候只close1手,这样的话系统会给这个只剩下1手的order赋予一个全新的ticket number。这其实是一个很讨厌的东西,很多人—包括我,都对这个咬牙切齿。
一般人看种情况—包括我,第一反应就是自己实现一个int PartialCloseOrder()。
然后我某天在网上看(抄)代码的时候,看到一个人,将order的volume几等分,然后分别send order...再分别close掉。
当然这个写法也并不拍案叫绝,不算啥正儿八经的量化写法(只是一个小trick),而且是有很大漏洞的的。比如你不能在策略实际运行的时候决定关掉多少volume,以及有可能造成实际成交价格和你看到的报价/触发技术指标参数时的报价不同。
—————————————————————————
向量化看成量化...看来得少撸了。
以后答题一定要看问题描述。
折叠我吧
7#
匿名用户   | 2018-10-17 22:48:11 发帖IP地址来自
提示: 作者被禁止或删除 内容自动屏蔽
6#
邓可雯  4级常客 | 2018-10-17 22:48:10 发帖IP地址来自
temp = temp[-vec,]
5#
Whoum Whour  2级吧友 | 2018-10-17 22:48:09 发帖IP地址来自
全排列的题,做了一个小时才做出来,结果发现思路跟两位大神很接近,哈哈
  1. f = function(n){  if(n == 1) return(matrix(1))  else   {    l = 1:n    for(i in 1:n)    {      tmp = cbind(rep(i,factorial(n-1)),matrix(l[-i][f(n-1)],ncol = n-1))      if(i == 1) {res = tmp} else {res = rbind(res,tmp)}    }    return(res)  }}
复制代码
4#
H Yang  2级吧友 | 2018-10-17 22:48:08 发帖IP地址来自
写的再绝 人家还是觉得你用matlab的就是编程不行
3#
阿西喵  2级吧友 | 2018-10-17 22:48:06 发帖IP地址来自
pandas apply/ rolling_apply/expanding_apply/groupby……

我写的策略基本都是用这几个,再嵌入自己写的function。

另外,第一次知道pandas.pct_change的时候确实惊艳了一下

不过pandas在对location(index/colume)的vectorize上没有像对value那么友善,还是至少要对行或列进行遍历。也可能是我还没找到正确的方法,有知道的大神求赐教啊!
2#
练先森  2级吧友 | 2018-10-17 22:48:05 发帖IP地址来自
在实现最小二乘法做n次多项式拟合的时候,有这么一段我认为写得比较好的向量化代码,实验结果拟合速度甚至比matlab自带的polyfit函数还快一些。
  1. function coef=fitt(x, y, n)m = length(x);A = repmat(x', 1, 2*n);c = repmat(1:2*n, m, 1);vector =[m, sum(A.^c)];index = meshgrid(1:n+1);index = bsxfun(@plus,index, [0:n]');B =[ones(1,m); repmat(x, n,1)];cc = repmat([1,1:n]', 1, m);b = sum(B.^cc * y', 2);coef = fliplr((vector(index)\b)');
复制代码
上述函数完成最小二乘法算法计算后为了保持与matlab自带函数一样的输出格式,还另外将计算结果经装置与filplr函数处理。

亮点在于在构造方程组的系数矩阵时并没有直接用循环来构造每一个元素,而是生成了一个很有规律的系数向量,再向量化生成索引矩阵来最后生成系数矩阵。

与polyfit函数对比:
  1. x = linspace(0,1,5);y = 1./(1+x);ticp1 = polyfit(x,y,4)tocticp2 = fitt(x,y,4)tocp1 =    0.1524   -0.5333    0.8667   -0.9857    1.0000时间已过 0.003473 秒。p2 =    0.1524   -0.5333    0.8667   -0.9857    1.0000时间已过 0.000757 秒。>>
复制代码
1#
Harry Zhu  4级常客 | 2018-10-17 22:48:04 发帖IP地址来自
计算里面常用函数之一的 diff() 如果用向量化表示可以为:
  1. vector = seq(1,1000,1)today = append(vector[1:999],NaN)tommorow = append(NaN,vector[2:1000])diff_result = tommorow - today
复制代码
这个函数在做差分的时候经常用到,比如时间序列。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:74
帖子:5
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP