精华内容
下载资源
问答
  • 基于密度权值平均变化的CFSFDP聚类算法.pdf
  • 目录 1、AdaGrad ...动量算法可以在一定程度缓解这些问题,但这样做的代价是引入了另一个超参数,在这种情况下,自然会会问有没有其他方法。如果我们相信方向敏感度在某种程度是轴对称的,那么每个参...

    参考  计算机视觉中的细节问题 - 云+社区 - 腾讯云

    目录

    1、AdaGrad

    2、RMSProp

    3、Adam

    4、选择正确的优化算法


    神经网络研究员早就意识到肯定是最难设置的超参数之一,因为它对模型的性能有显著的影响。损失通常高度敏感域参数空间中的某些方向,而不敏感于其他。动量算法可以在一定程度缓解这些问题,但这样做的代价是引入了另一个超参数,在这种情况下,自然会会问有没有其他方法。如果我们相信方向敏感度在某种程度是轴对称的,那么每个参数设置不同的学习率,在整个学习过程中自动适应这些学习率是有道理的。

    Delta-bar-delta算法是一个早期的在训练时适应模型参数各自学习率的启发方式。该方法基于一个很简单的想法,如果损失对于某个给定模型参数的偏导数保持相同的符号,那么学习率应该增加。如果对于该参数的偏导变化了符号,那么学习率应该更小。最近,提出了一些增量(或者基于小批量)的算法来自适应模型参数的学习率。

    1、AdaGrad

    AdaGrad算法,独立地使用所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根。具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。净效果是在参数空间中更为平缓的斜率方向会取得更大的进步。在凸优化背景中,AdaGrad算法具有一些令人满意的理论性质。然而,经验上已经发现,对于深度神经网络模型而言,从训练开始时积累梯度平方会导致有效学习率过早和过量的减少。AdaGrad在某些深度学习模型上效果不错,但不是全部。

    Require:全局学习率\large \varepsilon

    Require:初始参数\theta

    Require:小常数\delta,为了数值稳定大约设置为\small 10^{-7}

         初始化梯度累积变量r=0

         while 没有达到停止准则 do

         从训练中采包含m个样本\{x^{(1)},...,x^{(m)}\}的小批量,对应目标为y^{(i)}

         计算梯度:\small g\leftarrow \frac{1}{m}\bigtriangledown _\theta\sum_{\color{Red} }i L(f(x^{(i)};\theta),y^{(i)}) 

         累积平方梯度:\small r\leftarrow r+g\odot g

        计算更新:\small \Delta \theta\leftarrow \frac{\varepsilon }{\delta+\sqrt{r}}\odot g(逐元素地应用除和求平方根)

        应用更新:\small \theta\leftarrow \theta+\Delta _\theta

    end while

    2、RMSProp

    RMSProp算法修改AdaGrad以在非凸设定下效果更好,改变梯度积累为指数加权的移动平均。AdaGrad旨在应用于凸问题时快速收敛。当应用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一个局部是凸碗的区域。AdaGrad根据平方梯度的整个历史收缩学习率,可能使得学习率在达到这样的凸结构前就变得太小收敛。它就像一个初始化与该碗状结构的AdaGrad算法实例。

    RMSProp的标准如下所示,结合Nesterov动量的形式如下下一个算法所示。相比于AdaGrad,使用移动平均引入了一个新的超参数\large \fn_jvn \tiny \rho\large \rho,用来控制移动平均的长度范围。

    Require:全局学习率\large \varepsilon,衰减速率\large \rho

    Require:初始参数\large \theta

    Require:小常数\small \delta,通常设为\small 10^{-6}(用于被小数除时的数值稳定)

          初始化累积变量\small r=0

      while 没有达到停止准则 do

          从训练集中采包含m个样本\small \{x^{(1)},...,x^{(m)}\}的小批量,对应目标为\tiny y^{(i)}

          计算梯度:\small g\leftarrow \frac{1}{m}\bigtriangledown _\theta \sum_i L(f(x^{(i)};\theta),y^{(i)})

          累积平方梯度:\small r\leftarrow \rho r + (1-\rho)g\odot g

          计算参数更新:\large \Delta_\theta=-\frac{\varepsilon }{\sqrt{\delta +r}}\odot g(\large \frac{1}{\sqrt{\delta +r}})

          应用更新:\small \theta \leftarrow \theta + \Delta_ \theta

    end while

    Require:全局学习率\large \varepsilon,衰减速率\large \rho,动量系数\large \alpha

    Requie:初始参数\small \theta,初始参数\small v

          初始化累积变量\small r=0

          while 没有达到停止准则 do

               从训练集中采包含m个样本\small \{x^{(1)},...,x^{(m)}\}的小批量,对应目标为\small y^{(i)}

               计算临时更新:\small \widetilde{\theta}\leftarrow \theta+\alpha v

               计算梯度:\small g\leftarrow \frac{1}{m}\bigtriangledown _{\widetilde{\theta}}\sum_i L(f(x^{(i)};\widetilde{\theta}),y^{(i)})

               累积梯度:\small r\leftarrow \rho r+(1-\rho)g\odot g

               计算速度更新:\small v\leftarrow \alpha v-\frac{\epsilon }{\sqrt{r}}\odot g(\small \frac{1}{\sqrt{r}}逐元素应用)

               更新应用:\small \theta\leftarrow \theta+v

    end while

    经验上,RMSProp已被证明是一种有效且实用的深度神经网络的优化算法,目前它是深度学习从业者经常采用的优化算法之一。

    3、Adam

    Require:步长\small \varepsilon(建议默认为:0.001)

    Require:矩估计的指数衰减速率,\large \rho_1\large \rho_2在区间[0,1)内。(建议默认为:分别为0.9和0.999)

    Require:用于数值稳定的最小常数\large \delta(建议默认为:10^{-8})

    Require:初始参数\small \theta

         初始化一阶和二阶矩变量\small s=0\small r=0

         初始化时间步\small t=0

         while 没有达到停止准则 do

             从训练集中采包含m个样本\small \{x^{(1)},...,x^{(m)}\}的小批量,对应目标为\small y^{(i)}

             计算梯度:\small g\leftarrow \frac{1}{m}\bigtriangledown _\theta\sum_i L(f(x^{(i)};\theta),y^{(i)})

             \small t\leftarrow t+1

            更新有偏一阶矩估计:\small s\leftarrow \rho _1s+(1-\rho _1)g

            更新有偏二阶矩估计:\small r\leftarrow \rho_2 r+(1-\rho_2)g\odot g

            修正一阶矩的偏差:\small \hat{s}\leftarrow \frac{s}{1-\rho^t_2}

            修正二阶矩的偏差:\small \Delta \theta = -\varepsilon \frac{\hat{s}}{\sqrt{\hat{r}+\delta}} (逐元素应用操作)

            应用更新:\small \theta =\theta +\Delta \theta

         end while

    "Adam"这个词派生自短语“adaptive moments”。早期算法背景下,它也许最好被看做结合RMSProp和具有一些重要区别的动量的变种。首先,在Adam中,动量直接并入了梯度一阶矩(指数加权)的估计。将动量加入RMSProp最直观的方法是将动量应用于缩放后的梯度。结合缩放的动量没有明确的理论动机。其次,Adam包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩的估计。RMSProp也采用了(非中心的)二阶矩估计,然而缺失了修正因子。因此,不像Adam,RMSProp二阶矩估计可能在训练初期有很高的偏置。Adam通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。

    4、选择正确的优化算法

    目前,最流行的算法并且使用很高的优化算法包括SGD、具动量的SGD、RMSProp、具动量的RMSProp、AdaDelta和Adam。此时,选择哪一个算法似乎主要取决于使用者对算法的熟悉程度(以便调节超参数)。

    展开全文
  • 梯度下降算法

    千次阅读 2019-11-29 14:14:14
    4.梯度下降 4.1什么是梯度下降? 梯度下降法的基本思想可以类比为一个下山的过程 ...这个时候,他就可以利用梯度下降算法来帮助自己下山。 具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭...
    4.梯度下降

    4.1什么是梯度下降?

    梯度下降法的基本思想可以类比为一个下山的过程

    假设这样一个场景:

    一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。

    因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。

    具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,(同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走)。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z0kl1M85-1575007819305)(file:///C:/Users/%E6%B8%85%E9%A3%8E/Desktop/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E4%BB%B6/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AE%B2%E4%B9%89/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88%E7%AE%97%E6%B3%95%E7%AF%87%EF%BC%89/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/images/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%951.png)]

    梯度下降的基本过程就和下山的场景很类似。

    首先,我们有一个可微分的函数。这个函数就代表着一座山。

    我们的目标就是找到这个函数的最小值,也就是山底。

    根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数值变化最快的方向。 所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。

    4.2 梯度的概念

    梯度是微积分中一个很重要的概念

    在单变量函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率;

    在多变量函数中,梯度就是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向;

    这也就说明了我们为什么要千方百计是求取梯度!

    4.3 梯度下降举例

    • 1.单变量函数的梯度下降

      我们假设有一个单变量的函数 :J(θ) = θ2

      函数的微分:J、(θ) = 2θ

      初始化,起点为: θ0 = 1

      学习率:α = 0.4

      我们开始进行梯度下降的迭代计算过程:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L5kQu5OQ-1575007819311)(file:///C:/Users/%E6%B8%85%E9%A3%8E/Desktop/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E4%BB%B6/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AE%B2%E4%B9%89/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88%E7%AE%97%E6%B3%95%E7%AF%87%EF%BC%89/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/images/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%952.png)]

    如图,经过四次的运算,也就是走了四步,基本就抵达了函数的最低点,也就是山底

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBLbDfTm-1575007819312)(file:///C:/Users/%E6%B8%85%E9%A3%8E/Desktop/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E4%BB%B6/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AE%B2%E4%B9%89/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88%E7%AE%97%E6%B3%95%E7%AF%87%EF%BC%89/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/images/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%953.png)]

    • 2.多变量函数的梯度下降

      我们假设有一个目标函数 ::J(θ) = θ12 + θ22

      现在要通过梯度下降法计算这个函数的最小值。我们通过观察就能发现最小值其实就是 (0,0)点。但是接下 来,我们会从梯度下降算法开始一步步计算到这个最小值! 我们假设初始的起点为: θ0 = (1, 3)

      初始的学习率为:α = 0.1

      函数的梯度为:▽:J(θ) =< 2θ1 ,2θ2>

      进行多次迭代:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cwJGzvFs-1575007819313)(file:///C:/Users/%E6%B8%85%E9%A3%8E/Desktop/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E4%BB%B6/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AE%B2%E4%B9%89/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88%E7%AE%97%E6%B3%95%E7%AF%87%EF%BC%89/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/images/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%954.png)]

      我们发现,已经基本靠近函数的最小值点

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o1IOVpd5-1575007819314)(file:///C:/Users/%E6%B8%85%E9%A3%8E/Desktop/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E4%BB%B6/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AE%B2%E4%B9%89/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88%E7%AE%97%E6%B3%95%E7%AF%87%EF%BC%89/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/images/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%955.png)]

    4.4 梯度下降的公式

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kVwcTw2n-1575007819315)(file:///C:/Users/%E6%B8%85%E9%A3%8E/Desktop/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E4%BB%B6/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AE%B2%E4%B9%89/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88%E7%AE%97%E6%B3%95%E7%AF%87%EF%BC%89/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/images/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E5%85%AC%E5%BC%8F.png)]

    1)a是什么含义?

    a在梯度下降算法中被称作学习率或者步长,意味着我们可以通过a来控制每一步走的距离,以保证不要步子跨的太大,错过最低点,同时也不要走的太慢,导致效率很低。所以a的选择在梯度下降法中很重要。a不能太大也不能太小。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MJyer6Th-1575007819316)(file:///C:/Users/%E6%B8%85%E9%A3%8E/Desktop/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E4%BB%B6/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AE%B2%E4%B9%89/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88%E7%AE%97%E6%B3%95%E7%AF%87%EF%BC%89/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/images/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95%CE%B1%E8%AF%B4%E6%98%8E.png)]

    2)为什么梯度要乘以一个负号?

    梯度前面加上一个负号,就意味着朝梯度相反的方向走。

    所以有了梯度下降这样一个优化算法,回归就有了“自动学习”的能力

    5.梯度下降和正规方程的对比
    梯度下降正规方程
    需要选择学习率不需要
    需要迭代求解一次运算得出
    特征数量较大可以使用需要计算方程,时间复杂度高O(n3)
    6.算法选择依据
    • 小规模数据
      • 正规方程 : LinearRegression(不能解决拟合问题)
      • 岭回归
    • 大规模数据
      • 梯度下降法:SGDRegressor

    五、梯度下降法再次介绍

    常见的梯度下降算法有:

    • 全梯度下降算法(Full gradient descent),
    • 随机梯度下降算法(Stochastic gradient descent),
    • 小批量梯度下降算法(Mini-batch gradient descent),
    • 随机平均梯度下降算法(Stochastic average gradient descent)
    1.全梯度下降算法(FG)

    计算训练集所有样本误差,对其求和再取平均值作为目标函数。

    权重向量沿梯度相反方向移动,从而使当前目标函数减少的最多。

    因为在执行每次更新时,我们需要在整个数据集上计算所有的梯度,所以速度会很慢,同时,无法处理超出内存限制的数据集。

    批梯度下降法同样也不能在线更新模型,即在运行的过程中,不能增加新的样本。

    其是在整个训练数据集上计算损失函数关于参数 θ的梯度:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cfuUOqu2-1575007819317)(file:///C:/Users/%E6%B8%85%E9%A3%8E/Desktop/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E4%BB%B6/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AE%B2%E4%B9%89/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88%E7%AE%97%E6%B3%95%E7%AF%87%EF%BC%89/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/images/GD%E4%B8%8B%E9%99%8D%E5%85%AC%E5%BC%8F.png)]

    2.随机梯度下降法(SG)

    由于FG每迭代更新一次权重都需要重新计算所有样本误差,而实际问题中经常有上亿的训练样本,故效率偏低,且容易陷入局部最优解,因此提出了随机梯度下降算法。

    其每轮计算的目标函数不再是全体样本误差,而仅是单个样本误差,即每次只带入计算一个样本目标函数的梯度来更新权重,再取下一个样本重复此过程,知道损失函数值停止下降或损失函数值小于某个可以容忍的阈值。

    此过程简单,高效,通常可以较好地避免更新迭代收敛到局部最优解。其迭代形式为

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IrdEcxdr-1575007819318)(file:///C:/Users/%E6%B8%85%E9%A3%8E/Desktop/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E4%BB%B6/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AE%B2%E4%B9%89/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88%E7%AE%97%E6%B3%95%E7%AF%87%EF%BC%89/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/images/SG%E4%B8%8B%E9%99%8D%E5%85%AC%E5%BC%8F.png)]

    其中,x(i)表示一条训练样本的特征值,y(i)表示一条训练样本的标签值

    但是由于,SG每次只使用一个样本迭代,若遇上噪声则容易陷入局部最优解。

    3.小批量梯度下降算法(mini-barch)

    小批量梯度下降算法是FG和SG的这种方案,在一定程度上兼顾了以上两种方法的优点。

    每次从训练样本集上随机抽取一个小样本集,在抽出来的小样本集上采用FG迭代更新权重。

    被抽出的小样本集所含样本点的个数称为batch_size,通常设置为2的幂次方,更有利于GPU加速处理。

    特别的,若batch_size=1,则变成了SG;若batch_size=n,则变成了FG.其迭代形式为

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhK9Qh5L-1575007819318)(file:///C:/Users/%E6%B8%85%E9%A3%8E/Desktop/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AF%BE%E4%BB%B6/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E8%AE%B2%E4%B9%89/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%EF%BC%88%E7%AE%97%E6%B3%95%E7%AF%87%EF%BC%89/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92/images/mini-batch%E4%B8%8B%E9%99%8D%E5%85%AC%E5%BC%8F.png)]

    4.随机平均梯度下降算法(SAG)

    在SG方法中,虽然避开了运算成本大的问题,但对于大数据训练而言,SG效果常不尽如人意,因为每一轮梯度更新都完全与上一轮的数据和梯度无关。

    随机平均梯度算法客服了这个问题,在内存中为每一个样本都维护一个旧的梯度,随机选择第i个样本来更新此样本的梯度,其他样本的梯度保持不变,然后求得所有梯度的平均值,进而更新了参数。

    如此,每一轮更新仅需计算一个样本的梯度,计算成本等同于SG,但收敛速度快得多。

    展开全文
  • 为什么要引入TWAP和 VWAP? 为了评估策略的资金容量,我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展,支持了策略...TWAP (Time Weighted Average Price),时间加权平均价格算法,是一种最简单的传

    为什么要引入TWAP和 VWAP?

    为了评估策略的资金容量,我们对M.trade模块里买入点和卖出点这两个参数进行了更丰富的扩展,支持了策略能够按更丰富的算法交易价格(WAP)进行撮合。

    如果资金是10万的话,那么在开盘买入基本上没有什么问题,如果资金量是300万、或者1000万呢?开盘如果只买入几只股票的话,本身的交易行为就会改变市场状态,冲击成本巨大。因此我们支持了算法交易里TWAP和VWAP。

    TWAP (Time Weighted Average Price),时间加权平均价格算法,是一种最简单的传统算法交易策略。TWAP模型设计的目的是使交易对市场影响减小的同时提供一个较低的平均成交价格,从而达到减小交易成本的目的。在分时成交量无法准确估计的情况下,该模型可以较好地实现算法交易的基本目的。

    VWAP (Volume Weighted Average Price), 成交量加权平均价格。VWAP策略即是一种拆分大额委托单,在约定时间段内分批执行,以期使得最终买入或卖出成交均价尽量接近该段时间内整个市场成交均价的算法交易策略。

    上述两种方式是最常用的算法交易执行方式。其实在我们实际交易的过程中也会发现,如果是一笔较大的订单,我们肯定不会直接全部下单,而是把订单进行拆分,逐渐成交。因此如果我们在回测的过程中也可以使用TWAP和VWAP的价格进行撮合,最直接的目的就是能够检验我们策略的资金容量,如果按照TWAP和VWAP进行撮合以后,收益率变动不大,那我们对策略的资金容量会有很大信心,即策略不再是只能管理几十万,管理上百万、上千万是没有问题的。

    我们在stockranker模板策略的基础上,用多组WAP价格进行回测,并和默认回测价格做了一个对比,回测结果如下表所示:

    买点卖点夏普比率年化收益总收益最大回撤
    openclose1.91108.29%314.1%47.39%
    twap_1twap_81.87110.21%321.51%46.48%
    twap_2twap_71.797.49%273.53%45.07%
    twap_3twap_61.78101.26%287.48%43.16%
    twap_4twap_51.8398.75%278.14%43.11%
    twap_9twap_101.7286.66%234.89%40.13%
    vwap_1vwap_81.87110.77%323.69%45.46%
    vwap_2vwap_71.74100.74%285.53%44.63%
    vwap_3vwap_61.78103.06%294.2%43.63%
    vwap_4vwap_51.7895.54%266.4%43.55%
    vwap_9vwap_101.8191.45%251.72%37.73%

    可以看到使用WAP价格回测和使用默认的open买入close卖出回测相比,各项指标变化不大,这也一定程度上表明单一策略的资金容量其实比我们想象地要大很多。

    字段查看

    最近我们升级了数据文档,WAP相关的文档见:WAP算法交易字段,截图如下:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PqOvr9os-1606876933758)(upload://8KAWOhZNmaS1MfaNGY2oeZ3L7cG.png)]

    设置方法

    在回测模块右侧属性栏中,可以看到有买入点和卖出点的参数设置:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ziyctSpn-1606876933763)(upload://rMcSsoaEo4Vv7G4z4nTzFm3upQS.png)]

    下拉即可选择想要的WAP价格。

    字段介绍

    • 我们支持了TWAP,VWAP 两种WAP价格

    • 每个字段对应了1-11 共11种时间规则指标,具体时间规则如下:

      字段时间规则明细
      twap_1/vwap_1早盘前5分钟9:30到9:35
      twap_2/vwap_2早盘前15分钟9:30到9:45
      twap_3/vwap_3早盘前30分钟9:30到10点
      twap_4/vwap_4早盘前60分钟9:30到10:30
      twap_5/vwap_5尾盘前60分钟14:00到15:00
      twap_6/vwap_6尾盘前30分钟14:30到15:00
      twap_7/vwap_7尾盘前15分钟14:45到15:00
      twap_8/vwap_8尾盘前5分钟14:55到15:00
      twap_9/vwap_9上午9:30到11:30
      twap_10/vwap_10下午13:00到15:00
      twap_11/vwap_11全天上午+下午
    • 每一个字段对应了买卖两个方向

    • 每一个字段又对应了两种数据:价格和成交量

    综上,字段示例如下:

    字段解释
    wap_1_twap_buy早盘前5分钟买单的twap价格
    wap_1_twap_sell早盘前5分钟卖单的twap价格
    wap_1_vwap_buy早盘前5分钟买单的vwap价格
    wap_1_vwap_sell早盘前5分钟卖单的vwap价格
    wap_1_buy_volume早盘前5分钟买单的成交量(经调整后)
    wap_1_sell_volume早盘前5分钟卖单的成交量(经调整后)

    以上字段均储存在 bar1d_wap_CN_STOCK_A表 和 bar1d_wap_CN_STOCK_A_adj表 中,如果要手动核查下撮合价格的话,可以访问这两个表来获取股票的TWAP,VWAP价格以及成交量。(其中第一个表是真实的加权价格数据,后一个表是后复权的价格加权数据,两表中的字段相同)。

    DataSource('bar1d_wap_CN_STOCK_A_adj').read(start_date='2017-12-28',end_date='2017-12-28',instruments=['000002.SZA'],fields=['date','instrument','wap_1_buy_volume', 'wap_1_sell_volume', 'wap_1_twap_buy','wap_1_twap_sell', 'wap_1_vwap_buy', 'wap_1_vwap_sell'])
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mRxKXTQq-1606876933765)(upload://9e3mKpp7aBFI5wBLegTzU30iwEK.png)]

    也可以查询到表中所有字段如下:

    DataSource('bar1d_wap_CN_STOCK_A_adj').read(start_date='2017-12-28',end_date='2017-12-28',instruments=['000002.SZA']).columns
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yL83KWws-1606876933767)(upload://mSObLRaktH31OSvDPiXD6YndxLs.png)]

    我们选择买入点为twap_1,卖出点为twap_8,回测价格类型选择后复权,回测结果部分截图如下:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kcBsR8ze-1606876933769)(upload://2O4TVUcb1yuNQYkO6WLiBsvXvgt.png)]

    可以看到002801.SZA的买入价为128.17,000503.SZA的卖出价为319.99。

    我们再从bar1d_wap_CN_STOCK_A_adj 表(如果回测价格类型选择的是真实价格,则用bar1d_wap_CN_STOCK_A 表)中读出这两只股票的wap_1_twap_buy和wap_8_twap_sell价格:

    DataSource('bar1d_wap_CN_STOCK_A_adj').read(start_date='2016-12-30',end_date='2016-12-30',instruments=['002801.SZA','000503.SZA'],fields=['date','instrument','wap_1_twap_buy','wap_8_twap_sell'])
    

    在这里插入图片描述

    可以看到表中的价格和回测中的成交价是一致的,回测时确实使用了我们选择的WAP价格进行撮合成交。

    计算方法和成交逻辑

    • 成交量:
      如果对应的是买,将涨停的分钟k线去除,不参与计算,即非涨停的量
      如果对应的是卖,将跌停的分钟k线去除,不参与计算,即非跌停的量
      例如:
      假设000002股票在上午【2h】成交100手,涨停;下午【1h】打开涨停(非跌停),成交200手,收盘【1h】跌停,成交50手。
      则,买入经调整的成交量是250 ,卖出经调整的成交量是 300

    600339.SHA在2016-12-30这天盘中涨停,我们读这天的价量数据可以看到,当天的总成交量为15055283.0

    DataSource('bar1d_CN_STOCK_A').read(start_date='2016-12-30',end_date='2016-12-30',instruments=['600339.SHA'])
    

    在这里插入图片描述

    而我们读取这个股票这一天的全天的buy_volume,可以看到交易量为8937100.0,去除了涨停的量:

    DataSource('bar1d_wap_CN_STOCK_A_adj').read(start_date='2016-12-30',end_date='2016-12-30',instruments=['600339.SHA'],fields=['date','instrument','wap_11_buy_volume'])
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Giua37VL-1606876933771)(upload://kBJJb7bAxtiWygnw3OUD7k2fW3Y.png)]

    • 平均价格:
      如果对应的是买,将涨停的分钟k线去除
      如果对应的是卖,将跌停的分钟k线去除
      TWAP:
      Time Weighted Average Price, 是时间加权平均价格。
      计算公式为 mean(Pm,n) ,其中n为k线数量,Pm为典型价格(等于 (high+low+close)/3)。
      VWAP:
      Volume Weighted Average Price, 是交易量加权平均价格。
      计算公式为 (close_0 * volume_0 + close_1 * volume_1 +close_2 * volume_2 +…+close_59* volume_59) / (volume_0+volume_1+…+volume_59) 。

    • 成交逻辑:
      实际成交量会受到我们选择的买点卖点的价格类型所对应的的成交量的影响,例如:
      假设某天A股票成交1万手,而我们想买入2万手,假如买入点选择close,则实际可以成交1万手;假如买入点选择twap1,而当天wap_1_buy的成交量为500手,则实际只会成交500手。

    更新后的WAP功能相比之前做了更进一步的细化和优化,考虑到了真实交易的涨跌和跌停情形,因此计算出来的算法交易平均价格更精准和符合实际,进一步提高了回测的准确性。欢迎大家使用和反馈意见。

    展开全文
  • 遗传算法python实现(适合初学者)

    万次阅读 多人点赞 2019-05-31 14:10:19
    在某网页上碰巧看到了 遗传算法 ,就决定学习整理一下这个熟悉又陌生的经典算法。 遗传算法有趣的应用有:寻路问题,8数码问题,囚犯困境,动作控制,找圆心问题,TSP问题,生产调度问题,人工生命模拟等。 遗传...

    某天午睡醒来,打开电脑感觉十分茫然,不知道该做什么。在某网页上碰巧看到了 遗传算法 ,就决定学习整理一下这个熟悉又陌生的经典算法。


    遗传算法有趣的应用有:寻路问题,8数码问题,囚犯困境,动作控制,找圆心问题,TSP问题,生产调度问题,人工生命模拟等。

    遗传算法中的每一条染色体,对应于遗传算法的一个解决方案。一般我们用适应性函数(fitness function)来衡量这个解决方案的优劣。

    提出问题和解决方案(简单案例)

     一个简单的问题:

                                          

     如何找出(-1,2)区间 f(x) 的最大值(足够大值)?                                    

                               

     通过遗传算法,可以逐渐取得较大解。

    对遗传算法的一些理解:

    遗传算法不一定能找到最大解,但随着迭代的进行,适应能力更强(通过适应度函数)的解(即染色体序列)总是更有机会存活下来。通过交叉和变异,产生新的适应能力更强的个体,最后得到一个较高适应能力的种群(停止迭代的条件可以是自定义的收敛或达到设定的迭代次数)。

    遗传算法的一般步骤:

     

    1. 初始化原始种群。(染色体)
    2. 计算种群每个个体的适应值。
    3. 以一定的策略选择个体。(适应值高的被选择的机会更大)
    4. 交叉和变异(产生新的染色体),形成新的个体。
    5. 重复2,3,4步,直到达到收敛条件或达到设定的迭代次数。

    代码奉上

    import matplotlib.pyplot as plt
    import numpy as np
    import random
    
    
    # (-1, 2)
    # 初始化原始种群
    def ori_popular(num):
        popular = []
        for i in range(num):
            x = random.uniform(-1, 2)  # 在此范围内生成一个随机浮点数
            popular.append(x)
        return popular
    
    
    # 编码,也就是由表现型到基因型,性征到染色体
    def encode(popular):  # popular应该是float类型的列表
        popular_gene = []
        for i in range(0, len(popular)):
            data = int((popular[i]-(-1)) / 3 * 2**18)  # 染色体序列为18bit
            bin_data = bin(data)  # 整形转换成二进制是以字符串的形式存在的
            for j in range(len(bin_data)-2, 18):  # 序列长度不足补0
                bin_data = bin_data[0:2] + '0' + bin_data[2:]
            popular_gene.append(bin_data)
        return popular_gene
    
    
    # 解码,即适应度函数。通过基因,即染色体得到个体的适应度值
    def decode(popular_gene):
        fitness = []
        for i in range(len(popular_gene)):
            x = (int(popular_gene[i], 2) / 2**18) * 3 - 1
            value = x * np.sin(10 * np.pi * x) + 2
            fitness.append(value)
        return fitness
    
    
    # 选择and交叉。选择用轮牌赌,交叉概率为0.66
    def choice_ex(popular_gene):
        fitness = decode(popular_gene)
        sum_fit_value = 0
        for i in range(len(fitness)):
            sum_fit_value += fitness[i]
        # 各个个体被选择的概率
        probability = []
        for i in range(len(fitness)):
            probability.append(fitness[i]/sum_fit_value)
        # 概率分布
        probability_sum = []
        for i in range(len(fitness)):
            if i == 0:
                probability_sum.append(probability[i])
            else:
                probability_sum.append(probability_sum[i-1] + probability[i])
    
        # 选择
        popular_new = []
        for i in range(int(len(fitness)/2)):
            temp = []
            for j in range(2):
                rand = random.uniform(0, 1)  # 在0-1之间随机一个浮点数
                for k in range(len(fitness)):
                    if k == 0:
                        if rand < probability_sum[k]:
                            temp.append(popular_gene[k])
                    else:
                        if (rand > probability_sum[k-1]) and (rand < probability_sum[k]):
                            temp.append(popular_gene[k])
    
            # 交叉,交叉率为0.66。
            is_change = random.randint(0, 2)
            if is_change:
                temp_s = temp[0][9:15]
                temp[0] = temp[0][0:9] + temp[1][9:15] + temp[0][15:]
                temp[1] = temp[1][0:9] + temp_s + temp[1][15:]
    
            popular_new.append(temp[0])
            popular_new.append(temp[1])
        return popular_new
    
    
    # 变异.概率为0.05
    def variation(popular_new):
        for i in range(len(popular_new)):
            is_variation = random.uniform(0, 1)
            # print([len(k) for k in popular_new])
            if is_variation < 0.02:
                rand = random.randint(2, 19)
                if popular_new[i][rand] == '0':
                    popular_new[i] = popular_new[i][0:rand] + '1' + popular_new[i][rand+1:]
                else:
                    popular_new[i] = popular_new[i][0:rand] + '0' + popular_new[i][rand+1:]
        return popular_new
    
    
    if __name__ == '__main__':  # alt+enter
        # 初始化原始种群, 一百个个体
        num = 100
        ori_popular = ori_popular(num)
        # 得到原始种群的基因
        ori_popular_gene = encode(ori_popular)  # 18位基因
        new_popular_gene = ori_popular_gene
        y = []
        for i in range(1000):  # 迭代次数。繁殖1000代
            new_popular_gene = choice_ex(new_popular_gene)  # 选择和交叉
            new_popular_gene = variation(new_popular_gene)  # 变异
            # 取当代所有个体适应度平均值
            new_fitness = decode(new_popular_gene)
            sum_new_fitness = 0
            for j in new_fitness:
                sum_new_fitness += j
            y.append(sum_new_fitness/len(new_fitness))
        
        # 画图
        x = np.linspace(0, 1000, 1000)
        fig = plt.figure()  # 相当于一个画板
        axis = fig.add_subplot(111)  # 坐标轴
        axis.plot(x, y)
        plt.show()
    

    结果简单展示:

    •  

    水平有限。有问题请大佬指点。 

    参考:

    遗传算法详解(GA)(个人觉得很形象,很适合初学者)

    展开全文
  • 遗传算法(二)改进:自适应、遗传退火算法

    万次阅读 多人点赞 2017-08-25 13:51:31
    笔记(二) 遗传算法的优化改进 自适应遗传算法and模拟退火遗传算法
  • 经典算法平均复杂度分析

    千次阅读 2019-04-23 19:43:01
    经典算法平均复杂度分析改进的冒泡排序Quick Sort闭哈希查找失败查找成功查找开哈希表查找 改进的冒泡排序 由于没有改变相邻逆序对互换的本质,数组内平均有n2n^2n2的逆序对就决定了算法必然复杂度为O(n2)\Omicron...
  • 创建一个ExponentialMovingAverage(指数滑动平均)对象,衰减 decay 一般会设置非常大,接近于1, num_updates 不仅是更新(平滑)次数,也是指数滑动平均类ExponentialMovingAverage提供用来动态设置 decay 的...
  • SMA移动平均算法

    千次阅读 2020-11-05 16:18:29
    当x日的移动平均线上升并且交叉穿过Y日的移动平均线的时候买入 当x日的移动平均线下降并且交叉穿过Y日的移动平均线的时候卖出 python实现 import psycopg2 import pandas as pd import matplotlib.pyplot as plt ...
  • 基于平均幅度和加权过零的VAD算法及其FPGA实现.pdf
  • 深度学习之自适应学习率算法

    万次阅读 2018-06-08 18:29:07
    动量算法可以在一定程度缓解这些问题,但这样做的代价是引入了另一个超参数。在这种情况下,自然会问有没有其他方法。如果我们相信方向敏感度在某种程度是轴对齐的,那么每个参数设置不同的学习,在整个学习过程...
  • F值 = 精确 * 召回 * 2 / ( 精确 + 召回) (F 值即为精确和召回的调和平均值) 1、准确(Accuracy) 准确(accuracy)计算公式为: 注: 准确是我们最常见的评价指标,而且很容易理解,...
  • 再利用自适应指数加权移动平均滤波算法对透射进行优化;之后修复明亮区域透射,避免颜色失真;最后通过变换大气散射模型求解得到去雾图像。实验结果表明:本文算法具有很快的执行速度,且经本文算法处理后的去雾图像...
  • 提出一种半色调可视加密算法的综合评价算法,综合考虑信息隐藏对载体图像造成的干扰和提取秘密图像的错误,选择平均每像素干扰值(ADPP)衡量信息隐藏对载体图像造成的干扰,为保证ADPP和BER数据范围的一致性,...
  • 为解决视频图像在互联网中进行传输时,其质量易受网络丢包、时延等因素的影响而显著降低的问题...该算法不但降低了视频传输的平均时延和丢包,而且提高了接收端视频图像的重建质量,具有复杂度低、实现简单的特点。
  • 基于短时能量和平均过零的语音信号的特征参数提取的算法介绍
  • 为了提高容迟网络的传递、降低传输延迟、对节点缓存进行更有效的管理,结合已有的PROPHET和Spray and Wait算法,提出了一种基于平均传递概率的容迟网络路由算法RAB-ADP。在该算法中设置了一个与时间有关的平均传递...
  • 目录简介一、监督学习1、决策树(Decision Tree,DT)2、朴素贝叶斯分类器(Naive Bayesian Model,NBM)3、最小二乘法(Least squares)4、逻辑回归(Logistic Regression)5、支持向量机(SVM)6、K最近邻算法...
  • 元启发式算法之一:蝙蝠算法BA

    千次阅读 多人点赞 2019-06-18 14:51:27
    一、算法 1. 定义 2. 步骤 3. 特点 二、蝙蝠 1.描述 2.先进技能-声纳 1) 回声定位-Acoustics of Echolocation 2) 行为参数化分析 3. 技能属性 三、 蝙蝠算法 1.算法模型建立之规则理想化简化 2....
  • 机器学习经典算法(三)–指数加权平均 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;指数加权平均(Exponentially Weighted Averages)是一些改进梯度下降法重要理论,如上篇博文梯度下降法(2)...
  • DAG任务调度是当前研究的热点,DAG任务模型中任务的调度顺序一方面会影响用户服务满意质量,另一方面也会影响云服务资源的利用,高效的任务调度算法能够使多核处理器的资源分配和并行计算能力更强.表调度算法HEFT...
  • 最早截止期优先(EDF-Earliest Deadline First)调度算法是最简单的实时电梯调度算法,它的缺点就是造成电梯任意地寻找楼层,导致极低的电梯吞吐。它与 FCFS 调度算法类似,EDF 算法是电梯实时调度算法中最简单的...
  • OCR算法识别怎么评估?

    千次阅读 2020-12-11 18:52:20
    关于OCR算法: 一、测试方法: 人工检验(效率低、需要提升) 二、算法指标: 1、文字识别准确 字符准确:单字识别,就是按单字算,一百个字里错5个字,识别95%。 字符识别准确,即识别对的字符数占...
  • 遗传算法实现图像分割(MATLAB)

    万次阅读 多人点赞 2018-11-24 20:13:49
    本文是对于Omar Banimelhem and Yahya Ahmed Yahya 发表论文《Multi-Thresholding Image ...用遗传算法对图像进行多阈值分割(Multi-Thresholding Image Segmentation Using Genetic Algorithm) 摘要:...
  • 算法的最坏情况与平均情况

    千次阅读 2016-04-03 16:45:26
    算法也一样,在输入1的情况下和输入2的情况下,其执行效率不一定一样。即算法会随着输入数据的不同而有秩序效率的不同,有时候会快点儿,有时候会慢点儿。例如,对一个已经排好序的序列进行排序就要相对容易一些。...
  • 针对K-均值聚类算法对初始聚类中心存在依赖性的缺陷,提出一种基于数据空间分布选取初始聚类中心的改进算法....实验表明,改进后的算法不仅提高了聚类结果的稳定性和正确,而且迭代次数明显减少,收敛速度快.
  • 神经网络算法,是使用计算机模拟生物神经系统,来模拟人类思维方式的算法。它的基本单位就是人工神经元。通过相互连接形成一张神经网络。 生物神经网络中,每个神经元与其他神经元连接,当它“激活”时,会传递...
  • 平均感知机算法(Averaged Perceptron)感知机算法是非常好的二分类算法,该算法求取一个分离超平面,超平面由w参数化并用来预测,对于一个样本x,感知机算法通过计算y = [w,x]预测样本的标签,最终的预测标签通过...
  • 游戏中常用的伪随机算法之PRD暴击算法 PRD伪随机算法常用于游戏中的暴击算法,因此本文的标题将其称为 PRD暴击算法。...设一个角色的暴击为50%,即 0.5。那么该角色进行100次攻击,理想状态下,应该会产生
  • 基于实数编码的参数自适应遗传算法(matlab代码)

    万次阅读 多人点赞 2018-12-26 22:13:13
    实数编码的遗传算法寻优: 遗传算法的基本操作算子: (1)选择算子 选择算子的作用主要是避免优良基因的丢失,使得性能高的个体能以更大的概率被选中,有机会作为父代繁殖下一代,从而提 高遗传算法的全局收敛...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 165,180
精华内容 66,072
关键字:

平均率算法