精华内容
下载资源
问答
  • 新用户添加特性(诸如注解)和专家用户添加特性(诸如快捷方式),能够丰富界面设计并提高可感知的系统质量。  3. 提供信息反馈 。  4. 设计对话框以产生结束信息 。一组动作后的信息反馈,给予操作者...

    界面设计的8条黄金规则

        1.争取保持一致性。在类似的环境中要求一致的动作序列;在提示菜单和帮助屏幕中应使用相同的术语;应始终使用一致的颜色、布局、大写和字体等。异常情况诸如要求确认、删除命令或口令没有回显,应是可理解的且数量不限。

        2.满足普遍可用性的需要。认识到不同用户和可塑性设计的要求,可是内容的转换更加便捷。新手到专家的差别、年龄范围、残疾情况和技术多样性,这些都能丰富指导设计的需求范围。为新用户添加特性(诸如注解)和为专家用户添加特性(诸如快捷方式),能够丰富界面设计并提高可感知的系统质量。

        3.提供信息反馈

        4.设计对话框以产生结束信息。一组动作后的信息反馈,给予操作者完成任务的满足感、轻松感。例如电商把用户从选择商品一直移送到结账,最后以一个清楚的、完成交易的确认页面结束。

        5.预防错误。要尽可能设计用户不能犯严重错误的系统。例如,将不适用的菜单项变成灰色和不允许数值输入域中出现字母字符。如果用户犯错,界面应该监测处错误并且给出简单的说明来恢复。

        6.允许动作回退

        7.支持内部控制点。有经验的用户强烈戒网那种他们掌管界面且界面响应他们动作的感觉。他们不希望熟悉的行为发生改变或者意外。

        8.减轻短期记忆负担。我们能够在短期内记忆5~9个信息快(7+-2法则),这就要求设计人员避免在设计的界面中,要求用户必须记住一个屏幕上的信息,然后再另外一个屏幕使用这些信息。

    展开全文
  • win10家庭版默认是没有组策略的 组策略对于优化和维护...根据微软官方有关Win10各版本操作系统中对于组策略gpedit.msc的支持可以看出,Win10家庭版是没有组策略编辑功能的,如图所示:https://jingyan.baidu.com...

     

     win10家庭版默认是没有组策略的

     组策略对于优化和维护Windows系统来说十分重要。组策略编辑器是Windows最核心的功能之一,用于实现更高级的操作系统管理功能,具有非常实用的许多功能。  

    根据微软官方有关Win10各版本操作系统中对于组策略gpedit.msc的支持可以看出,Win10家庭版是没有组策略编辑功能的,如图所示:https://jingyan.baidu.com/article/0aa22375401ef788cd0d647a.html

    Win10家庭版找不到组策略gpedit.msc怎么办

     

    一、win10家庭版调出组策略(gpedit.msc)

     1)首先我们打开记事本,并输入以下内容(注意空格):

    @echo off
    
    pushd "%~dp0"
    
    dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt
    
    dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt
    
    for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i"
    
    pause

    如下图: 

     2)把它保存下来。名称随意 ,然后将扩展名改为为“.cmd”, 如下图

      

     3)接下来右键以管理员身份运行这个文件,完成后,win + R 输入“gpedit.msc”,你熟悉的组策略就有了OK。

        

     

     

    二、远程连接提示要求的函数不受支持如何解决?

      1)win +R 弹出运行窗口输入 gpedit.msc

            计算机配置  >> 管理模板 >> 系统 >> 凭据分配
     

        

    2)然后选择加密oracle修正选项,单击它,

             选择已启用勾选框,将保护级别改为易受攻击级别单击,应用并确定。ok

        

     本人实测 win10家庭版设置之后,还是远程连接提示要求的函数不受支持,

    貌似这种设置针对于win10 专业版有效吧!!!  

    对于win10家庭版,需修改注册表信息  >>  https://blog.csdn.net/qq_42402854/article/details/82995478

     

     

     

     

    展开全文
  • 你遇到过什么重复提交数据的现实例子吗? 转载自: http://www.bkjia.com/jingyan/471187.html 5.使用客户端脚本 提到客户端脚本,经常使用的是JavaScript进行常规输入验证。在下面的例子中,我们使用它处理表单的...

    表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如:

    点击提交按钮两次。
    点击刷新按钮。
    使用浏览器后退按钮重复之前的操作,导致重复提交表单。
    使用浏览器历史记录重复提交表单。
    浏览器重复的HTTP请求。

    用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。下面帮客之家收集了8种常见的有效防止表单重复提交的方法:来源www.bkjia.com


    1、js禁掉提交按钮。

    表单提交后使用Javascript使提交按钮disable。这种方法防止心急的用户多次点击按钮。但有个问题,如果客户端把Javascript给禁止掉,这种方法就无效了。


    我之前的文章曾说过用一些Jquery插件效果不错。参考:js防止表单重复提交的方法和代码

     

    2、使用Post/Redirect/Get模式。

    在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面。

    这能避免用户按F5导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样问题。

     

    3、在session中存放一个特殊标志。

    在服务器端,生成一个唯一的标识符,将它存入session,同时将它写入表单的隐藏字段中,然后将表单页面发给浏览器,用户录入信息后点击提交,在服务器端,获取表单中隐藏字段的值,与session中的唯一标识符比较,相等说明是首次提交,就处理本次请求,然后将session中的唯一标识符移除;不相等说明是重复提交,就不再处理。

    这使你的web应用有了更高级的XSRF保护。

    请见如下代码:

    1. <?php
    2. session_start();
    3. //根据当前SESSION生成随机数
    4. $code = mt_rand( 0, 1000000);
    5. $_SESSION[ 'code'] = $code;
    6. ?>
    7. 在页面表单上将随机数作为隐藏值进行传递,代码如下:
    8. <input type="hidden" name="originator" value="<?=$code?>">
    9. 在接收页面的PHP代码如下:
    10. <?php
    11. session_start();
    12. if( isset($_POST[ 'originator'])) {
    13. if($_POST[ 'originator'] == $_SESSION[ 'code']){
    14. // 处理该表单的语句,省略
    15. } else{
    16. echo ‘请不要刷新本页面或重复提交表单!’;
    17. }
    18. }
    19. ?>

    4.使用header函数转向

    除了上面的方法之外,还有一个更简单的方法,那就是当用户提交表单,服务器端处理后立即转向其他的页面,代码如下所示。

    if (isset($_POST['action']) && $_POST['action'] == 'submitted') {

    //处理数据,如插入数据后,立即转向到其他页面

    header('location:submits_success.php');

    }

    这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。

    5.表单过期的处理

    在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现。

    1.使用header头设置缓存控制头Cache-control。

    header('Cache-control: private, must-revalidate'); //支持页面回跳

    2.使用session_cache_limiter方法。

    session_cache_limiter('private, must-revalidate'); //要写在session_start方法之前

    下面的代码片断可以防止用户填写表单的时候,单击“提交”按钮返回时,刚刚在表单上填写的内容不会被清除:

    session_cache_limiter('nocache');

    session_cache_limiter('private');

    session_cache_limiter('public');

    session_start();

    //以下是表单内容,这样在用户返回该表单时,已经填写的内容不会被清空

    将该段代码贴到所要应用的脚本顶部即可。

    Cache-Control消息头域说明

    Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。

    请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh和only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate和max-age。各个消息中的指令含义如表5-3所示。

    表5-3

    缓存指令

     

    public

    指示响应可被任何缓存区缓存

    private

    指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效

    no-cache

    指示请求或响应消息不能缓存

    no-store

    用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存

    max-age

    指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应

    min-fresh

    指示客户机可以接收响应时间小于当前时间加上指定时间的响应

    max-stale

    指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息

    有关Session和Cookie的介绍,详细内容请参阅第10章“PHP会话管理”。

    6.判断表单动作的技巧

    表单可以通过同一个程序来分配应该要处理的动作,在表单中有不同的逻辑,要怎么判别使用者按下的按钮内容不过是个小问题。

    其实只要通过提交按钮的name 就可以知道了,表单在提交出去的时候,只有按下的submit类型的按钮才会被送到表单数组去,所以只要判断按钮的值就可以知道使用者按下哪一个按钮,以如下表单为例:

    <FORM method="POST" Action=test.php>

    <input type=submit name="btn" value="a">

    <input type=submit name="btn" value="b">

    </FORM>

    当使用者按下“a”按钮的时候btn=a,按下“b”按钮,则btn=b。

    另外也可以通过提交按钮的名字(name)来判断,请见如下代码:

    <FORM method="POST" Action=test.php>

    <input type=submit name="a" value="提交A">

    <input type=submit name="b" value="提交B">

    </FORM>

    这样只要POST/GET的参数里面有a或b,就可以知道按下的按钮是哪个。

    <?php

    print_r($_POST);

    ?>

     

    7、在数据库里添加约束。

    在数据库里添加唯一约束或创建唯一索引,防止出现重复数据。这是最有效的防止重复提交数据的方法。

    你是如何克服数据重复提交问题的?你遇到过什么重复提交数据的现实例子吗?

    转载自:http://www.bkjia.com/jingyan/471187.html

    5.使用客户端脚本

    提到客户端脚本,经常使用的是JavaScript进行常规输入验证。在下面的例子中,我们使用它处理表单的重复提交问题,请看下面的代码:

    <form method="post" name="register" action="test.php" enctype="multipart/form-data">

    <input name="text" type="text" id="text" />

    <input name="cont" value="提交" type="button" onClick="document.register.cont.value='正在提交,请等待...';document.register.cont.disabled=true;document.the_form.submit();">

    </form>

    当用户单击“提交”按钮后,该按钮将变为灰色不可用状态。

    上面的例子中使用OnClick事件检测用户的提交状态,如果单击了“提交”按钮,该按钮立即置为失效状态,用户不能单击按钮再次提交。

     

    8.使用Cookie处理

    使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单,请见下面的代码:

    <?php

    if(isset($_POST['go'])){

    setcookie("tempcookie","",time()+30);

    header("Location:".$_SERVER[PHP_SELF]);

    exit();

    }

    if(isset($_COOKIE["tempcookie"])){

    setcookie("tempcookie","",0);

    echo "您已经提交过表单";

    }

    ?>

    如果客户端禁止了Cookie,该方法将不起任何作用,这点请注意。关于Cookie的详细介绍,请参阅第10章“PHP会话管理”。

    PS:这几种防止重复提交表单的方法可以做参考,自己使用过第一种方式来防止表单多次提交。

    来源帮客之家收集整理,转载请注明出处:www.bkjia.com/jingyan/

    展开全文
  • VNPY - CTA策略模块策略回测

    千次阅读 2018-08-10 16:50:05
    通过回测历史数据可以验证策略有效性,了解策略的历史收益、最大回撤和回撤时长,对策略参数进行优化等等。CTA策略模块的主要回测目标是验证交易信号是否正确,仓位大小的问题在实盘中则由交易员来确定。...

    作者:魔元

    目录

    量化策略主要是从历史数据统计或者发现规律然后应用于实盘交易。当然历史不是简单的重复,这就要求策略需要根据市场调整和优化参数。通过回测历史数据可以验证策略的有效性,了解策略的历史收益、最大回撤和回撤时长,对策略参数进行优化等等。CTA策略模块的主要回测目标是验证交易信号是否正确,仓位大小的问题在实盘中则由交易员来确定。

    使用回测引擎

    vnpy的回测引擎位于vnpy/trader/app/ctaStrategy/ctaBacktesting.py,此文件中主要包含以下几个类:

    • BacktestingEngine

      • 回测引擎类,主要功能是设置回测参数,初始化策略对象,运行回测并输出结果。类接口和实盘引擎类(CtaEngine)保持一致,从而实现同一套策略代码从回测到实盘。用户主要是调用本类的接口来回测策略
    • TradingResult

      • 撮合好的交易结果类,由回测引擎计算回测结果时使用。类成员包含开仓价格,平仓价格,交易数量,成交金额,滑点成本,手续费成本及净盈亏等。

      这里面有一点注意是交易数量的正负代表开仓方向。以股指IF为例,3000点时开1手多单,3010点平仓,这时就会生成一个TradingResult实例,交易数量为1。若3000点时开1手空单,3010点平仓,这时生成的TradingResult实例的交易数量为-1。
      代码如下:

        ```Python
        self.entryPrice = entryPrice    # 开仓价格
        self.exitPrice = exitPrice      # 平仓价格
      
        self.entryDt = entryDt          # 开仓时间datetime    
        self.exitDt = exitDt            # 平仓时间
      
        self.volume = volume    # 交易数量(+/-代表方向)
      
        self.turnover = (self.entryPrice+self.exitPrice)*size*abs(volume)   # 成交金额
        self.commission = self.turnover*rate                                # 手续费成本
        self.slippage = slippage*2*size*abs(volume)                         # 滑点成本
        self.pnl = ((self.exitPrice - self.entryPrice) * volume * size
                    - self.commission - self.slippage)                      # 净盈亏
        ```
      
    • OptimizationSetting

      • 参数优化设置类,主要是生成优化参数组合。每个参数组合都由回测引擎执行一遍,以得到不同参数组合的回测结果。优化参数回测时会使用此类。

    回测引擎API介绍

    由于用户主要是调用本类的接口来回测策略,所以将对本类的接口做逐一介绍。一方面回测引擎类的接口跟实盘策略引擎保持一样,这方面的接口主要是被策略调用; 另一方面回测引擎类也要提供回测相关的接口,所以将回测引擎类的接口从功能性分成这几个方面介绍:

    • 用户回测策略接口

      • 配置相关接口

        • setBacktestingMode

          • 设置回测模式,支持两种模式,一种是Tick模式,另一种是K线模式

          • 参数类型说明
            modestring回测模式,支持两种模式:BacktestingEngine.TICK_MODE和BacktestingEngine.BAR_MODE

            返回值:None

        • setStartDate

          • 设置回测开始日期

          • 参数类型说明
            startDatestring回测开始日期
            initDaysint策略回测开始前需要准备多少日的数据。默认是10日。举个例子,假设策略是日K线回测,数据库里的数据是日K线,如果策略里需要5日均线,这里此参数设为4。假设策略是1分钟K线回测,数据库里的数据是1分钟K线,如果策略里需要5分钟均线,这里此参数则设为1。因为1日里的1分钟K线数据远远大于4,已经足够满足策略开始的准备数据了。

            返回值:None

        • setEndDate

          • 设置回测结束日期

          • 参数类型说明
            endDatestring回测结束日期。默认是''。若使用默认参数,则是数据在数据库里的最近日期。

            返回值:None

        • setDatabase

          • 设置产品(合约)数据的数据库名及表名,这样回测引擎可以载入对应的数据。

          • 参数类型说明
            dbNamestring数据库名
            symbolstring数据库表名

            返回值:None

        • setSlippage

          • 设置每一手产品(合约)的滑点,单位是产品(合约)的价格

          • 参数类型说明
            slippagefloat滑点数值

            返回值:None

        • setRate

          • 设置佣金比例,交易手续费=成交金额X佣金比例

          • 参数类型说明
            ratefloat佣金比例

            返回值:None

        • setSize

          • 设置产品(合约)大小,单位为元。成交金额=合约价格(面值)X合约大小

          • 参数类型说明
            sizefloat合约大小

            返回值:None

        • setPriceTick

          • 设置产品(合约)的最小价格变动,单位是产品(合约)的价格

          • 参数类型说明
            priceTickfloat最小价格变动

            返回值:None

      • 回测相关接口

        • initStrategy

          • 根据策略参数,实例化回测策略对象。

          • 参数类型说明
            strategyClassclass策略类
            settingdict策略参数配置,若使用策略的默认参数则为None

            返回值:None

        • runBacktesting

          • 运行回测。从数据库里载入数据,逐条推入策略做回测,同时模拟委托和成交,并保存回测过程的中间数据,以此可以计算回测结果并显示。

          • 参数:无

            返回值:None

        • calculateBacktestingResult

          • 逐条匹配交易,并计算回测结果。由于回测策略是假设初始资金为0,这样交易后资金可能为负值。这里跟实盘有区别,实盘需要保证金,回测时只考虑每笔交易的盈亏。

          • 参数:无

            返回值:dict

            键值值的类型说明
            capitalfloat当前资金,单位是元
            maxCapitalfloat资金最高净值,单位是元
            drawdownfloat当前回撤,非正值,单位是元
            totalResultint总成交次数
            totalTurnoverfloat总成交金额
            totalCommissionfloat总手续费
            totalSlippagefloat所有交易产生的滑点费用,单位是元
            timeListlist每笔交易的时间序列,时间为交易出场时间
            pnlListlist每笔盈亏序列
            capitalListlist每笔交易后的资金序列
            drawdownListlist每笔交易后的回撤序列
            winningRatefloat胜率(%)
            averageWinningfloat盈利交易平均值,单位是元
            averageLosingfloat亏损交易平均值,单位是元
            profitLossRatiofloat盈亏比
        • showBacktestingResult

          • 计算回测结果,输出回测报告,并显示回测结果图:资金子图,回撤子图,每笔交易盈亏子图

          • 参数:无

            返回值:None

        • calculateDailyResult

          • 按照逐日盯市的方式计算每日的交易盈亏和持仓盈亏,并汇总成最终按日统计的盈亏情况。

          • 参数:无

            返回值:dict

        • showDailyResult

          • 显示按照逐日盯市方式统计的回测结果和资金曲线,提供Sharpe Ratio的统计结果。

          • 参数:无

            返回值:None

      • 优化参数相关接口

        • runOptimization

          • 运行普通模式的优化参数,也就是说python主进程循环回测每一个参数组合,并输出每个参数组合的优化结果。普通模式下只能使用CPU的一个核。

          • 参数类型说明
            strategyClassclass策略类
            optimizationSettingclassOptimizationSetting对象,基于它生成优化参数组合,并获取优化目标

            返回值:None

        • runParallelOptimization

          • 运行多进程模式的优化参数,也就是说并行运行多个进程(等于CPU的核个数)回测每一个参数组合,并输出每个参数组合的优化结果。

          • 参数类型说明
            strategyClassclass策略类
            optimizationSettingclassOptimizationSetting对象,基于它生成优化参数组合,并获取优化目标

            返回值:None

    • 策略相关接口

      • 由于策略既可以跑在回测引擎又可以跑在实盘引擎,所以这部分接口保持跟实盘引擎一致。这部分接口只做功能介绍,不做具体参数的介绍,因为对用户回测策略来讲,这是一个黑盒。根据交易相关和非交易相关,这部分接口可以分为两类:
        • 交易相关接口

          • sendOrder
            • 模拟限价委托单,并把限价单保存在限价单字典和工作限价单字典中。工作限价单字典里是需要撮合成交的委托。限价单字典里则是所有委托。
          • cancelOrder
            • 模拟撤销限价委托单,并从工作限价单字典中删除。
          • sendStopOrder
            • 模拟本地停止单,并把停止单保存在停止单字典和工作停止单字典中。工作停止单字典里是需要撮合成交的委托。停止单字典里则是所有委托。
          • cancelStopOrder
            • 模拟撤销停止委托单,并从工作停止单字典中删除。
        • 非交易相关接口

          • insertData
            • 插入数据到数据库,回测时直接pass
          • loadTick
            • 载入初始化列表中的数据,即策略回测开始前的准备数据
          • loadBar
            • 载入初始化列表中的数据,即策略回测开始前的准备数据
          • writeCtaLog
            • 记录日志到日志列表
          • putStrategyEvent
            • 发送策略更新事件,回测中忽略
    • 内部接口

      • 这部分接口为回测引擎自己调用。后面在讲接口使用的时候,会通过流程图做细节介绍。这里先逐一简单做下介绍:
        • output
          • 输出到控制台
        • newTick
          • 生成新的Tick,完成撮合交易并推送给策略
        • newBar
          • 生成新的Bar,完成撮合交易并推送给策略
        • crossLimitOrder
          • 基于最新数据撮合限价单
        • crossStopOrder
          • 基于最新数据撮合停止单

    如何使用回测引擎API

    本节结合代码和流程图讲解如何使用回测引擎API。

    回测过程流程图

    下图为基于策略特定参数的回测过程

    Markdown

    回测过程详解

    1. 对用户来讲,首先要创建回测引擎实例
    # 创建回测引擎
    engine = BacktestingEngine()
    1. 设置回测引擎的相关参数(回测模式,回测起始日期,数据库)。历史数据得预先存储在MongoDB中,若没有, 则可执行vnpy/vn.trader/ctaAlgo/ctaHistroyData.py里的代码,把回测数据插入到数据库中, 如下
    # 这里将项目中包含的股指日内分钟线csv导入MongoDB,作者电脑耗时大约3分钟
    import os
    loadMcCsv(os.path.join(os.path.dirname(__file__), 'IF0000_1min.csv'), MINUTE_DB_NAME, 'IF0000')

    如果数据已经在数据库中,则运行下面的代码设置回测引擎的相关参数

    # 设置引擎的回测模式为K线
    engine.setBacktestingMode(engine.BAR_MODE)
    
    # 设置回测用的数据起始日期和结束日期
    engine.setStartDate('20110101')
    engine.setEndDate('20161231')
    
    # 设置使用的历史数据库
    engine.setDatabase(MINUTE_DB_NAME, 'IF0000')

    这里MINUTE_DB_NAME

    MINUTE_DB_NAME = 'VnTrader_1Min_Db'
    1. 设置产品(合约)相关参数(滑点,佣金,合约大小)。这里回测的合约是股指,滑点设为股指1跳,股指一手每点价格为300元
    # 设置产品相关参数
    engine.setSlippage(0.2)     # 股指1跳
    engine.setRate(0.3/10000)   # 万0.3
    engine.setSize(300)         # 股指合约大小    
    1. 在回测引擎中传入策略参数创建策略对象。这里回测vnpy/vn.trader/ctaAlgo/strategyAtrRsi.py里的AtrRsiStrategy策略,策略参数只设置了'atrLength'为11,其它则用策略默认参数。
    # 在引擎中创建策略对象
    d = {'atrLength': 11}
    engine.initStrategy(AtrRsiStrategy, d)

    策略的默认参数如下:

    # 策略参数
    atrLength = 22          # 计算ATR指标的窗口数   
    atrMaLength = 10        # 计算ATR均线的窗口数
    rsiLength = 5           # 计算RSI的窗口数
    rsiEntry = 16           # RSI的开仓信号
    trailingPercent = 0.8   # 百分比移动止损
    initDays = 10           # 初始化数据所用的天数
    fixedSize = 1           # 每次交易的数量
    1. 跑回测
    # 开始跑回测
    engine.runBacktesting()
    1. 显示回测结果
    # 显示回测结果
    # spyder或者ipython notebook中运行时,会弹出盈亏曲线图
    # 直接在cmd中回测则只会打印一些回测数值
    engine.showBacktestingResult()

    回测过程中主要步骤的流程图

    下面是回测过程主要步骤的流程图,这部分实现对用户回测策略来讲是黑盒,可以不关注。

    跑回测主要流程图

    Markdown

    显示回测结果主要流程图

    Markdown

    计算回测结果主要流程图

    计算回测结果是采用贪婪算法将成交单按时间顺序逐一做开平仓清算。下图只是给出主要的逻辑步骤,具体细节参考代码,即:

    def calculateBacktestingResult(self):
        """
        计算回测结果
        """
        ...

    Markdown

    读懂回测报告

    在IPython下运行AtrRsiStrategy策略的回测,示例中使用的是VS2013下的IPython环境。示例中的vnpy代码位于F:\vnpy。读者可自行调整为自己机器上的vnpy代码所在目录。

    In [2]: import sys
       ...: sys.path.append('F:\\vnpy\\vn.trader')
       ...: sys.path.append('F:\\vnpy\\vn.trader\ctaAlgo')
       ...: from __future__ import division
       ...: from datetime import datetime, timedelta
       ...: from collections import OrderedDict
       ...: from itertools import product
       ...: import multiprocessing
       ...: import pymongo
       ...: from ctaBase import *
       ...: from ctaSetting import *
       ...: from vtConstant import *
       ...: from vtGateway import VtOrderData, VtTradeData
       ...: from vtFunction import loadMongoSetting
       ...: from ctaBacktesting import *
       ...: from strategyAtrRsi import *
       ...:
    
    In [3]: # 创建回测引擎
       ...: engine = BacktestingEngine()
       ...:
    
    In [4]: # 设置引擎的回测模式为K线
       ...: engine.setBacktestingMode(engine.BAR_MODE)
       ...:
       ...: # 设置回测用的数据起始日期和结束日期
       ...: engine.setStartDate('20110101')
       ...: engine.setEndDate('20161231')
       ...:
       ...: # 设置使用的历史数据库
       ...: engine.setDatabase(MINUTE_DB_NAME, 'IF0000')
       ...:
    
    In [5]: # 设置产品相关参数
       ...: engine.setSlippage(0.2)     # 股指1跳
       ...: engine.setRate(0.3/10000)   # 万0.3
       ...: engine.setSize(300)         # 股指合约大小
       ...:
    
    In [6]: # 在引擎中创建策略对象
       ...: d = {'atrLength': 11}
       ...: engine.initStrategy(AtrRsiStrategy, d)
       ...:
    
    In [7]: # 开始跑回测
       ...: engine.runBacktesting()
       ...:
    2017-02-08 19:01:03.243000	开始载入数据
    2017-02-08 19:01:03.383000	载入完成,数据量:341851
    2017-02-08 19:01:03.383000	开始回测
    2017-02-08 19:01:03.396000	策略初始化完成
    2017-02-08 19:01:03.396000	策略启动完成
    2017-02-08 19:01:03.396000	开始回放数据
    2017-02-08 19:01:17.451000	数据回放结束
    
    In [8]: # 显示回测结果
       ...: engine.showBacktestingResult()
       ...:
    2017-02-08 19:01:24.706000	计算回测结果
    2017-02-08 19:01:24.790000	------------------------------
    2017-02-08 19:01:24.790000	第一笔交易:	2011-01-11 13:19:00
    2017-02-08 19:01:24.790000	最后一笔交易:	2016-04-01 13:17:00
    2017-02-08 19:01:24.790000	总交易次数:	3,965.0
    2017-02-08 19:01:24.790000	总盈亏:	695,298.02
    2017-02-08 19:01:24.791000	最大回撤: 	-197,106.11
    2017-02-08 19:01:24.791000	平均每笔盈利:	175.36
    2017-02-08 19:01:24.791000	平均每笔滑点:	120.0
    2017-02-08 19:01:24.791000	平均每笔佣金:	57.01
    2017-02-08 19:01:24.791000	胜率		36.39%
    2017-02-08 19:01:24.791000	盈利交易平均值	8,721.64
    2017-02-08 19:01:24.791000	亏损交易平均值	-4,714.52
    2017-02-08 19:01:24.791000	盈亏比:	1.85

    Markdown

    回测报告说明

    首先先解释一下回测报告里的交易是什么意思:

    • 以股指IF为例,3000点时开1手多单,3010点平仓,这1手开平仓即为一笔交易。若3000点时开2手多单,3010点平1手,这1手开平仓即为一笔交易;接下来3020点再平1手,这1手开平仓为另一笔交易。
    • 交易时间为平仓时间

    计算回测结果字段说明

    字段说明
    第一笔交易第一笔交易的平仓时间
    最后一笔交易最后一笔交易的平仓时间
    总交易次数整个回测的总交易次数
    总盈亏整个回测的总盈亏,由于回测时初始资金为0,总盈亏其实就是当前资金
    最大回撤每次交易后的回撤 = 每笔交易后的资金 - 回测中最大资金。由于回撤为非正值,所以最大回撤为所有交易后的回撤绝对值最大的
    平均每笔盈利总盈亏/总交易次数
    平均每笔滑点总滑点成本/总交易次数
    平均每笔佣金总佣金成本/总交易次数
    胜率盈利交易次数/总交易次数*100(%)
    盈利交易平均值总盈利交易的盈利/总盈利交易次数
    亏损交易平均值总亏损交易的盈利/总亏损交易次数
    盈亏比盈利交易平均值/亏损交易平均值

    计算回测结果图说明

    图里的X轴没有采用交易时间刻度,而是将每笔交易按时间顺序从0开始标成0,1,2,3,4,...

    子图名说明
    capital每笔交易后的资金序列图
    DDdropdown,每笔交易后的回撤序列图
    pnlprofit&loss,每笔交易的盈亏直方图(概率分布图)

    优化策略参数

    策略的参数优化是对指定的优化目标(比如胜率,总盈亏,盈亏比等),回测每个参数的网格组合,从而找到使优化目标最优的参数组合。比如AtrRsiStrategy策略,有七个参数:

    # 策略参数
    atrLength = 22          # 计算ATR指标的窗口数   
    atrMaLength = 10        # 计算ATR均线的窗口数
    rsiLength = 5           # 计算RSI的窗口数
    rsiEntry = 16           # RSI的开仓信号
    trailingPercent = 0.8   # 百分比移动止损
    initDays = 10           # 初始化数据所用的天数
    fixedSize = 1           # 每次交易的数量

    这里面'initDays'可以忽略。如果'atrLength'的取值范围是12-20,步长2;'atrMa'的取值范围是20-30,步长5。这样对于'atrLength'有5个取值[12,14,16,18,20],对于'atrMaLength'有3个取值[20,25,30],总共有5X3, 15个参数组合需要回测。如果设置更多的参数和更小的步长,由于参数的组合数量是幂次方,可想而知需要回测的参数组合的数量相当大,这样就要耗费大量的时间。 优化参数有两种模式:

    • 普通模式
      • Python主进程循环回测每一个参数组合,并输出每个参数组合的运行结果。由于GIL,普通模式下只能使用CPU的一个核。
    • 多进程模式
      • 并行运行多个进程(等于CPU的核个数)回测每一个参数组合,并输出每个参数组合的运行结果。

    本节主要讲解普通模式的参数优化。下图为普通模式的参数优化流程图:

    Markdown

    下表为支持的优化目标键值:

    键值值的类型说明
    capitalfloat当前资金,单位是元
    maxCapitalfloat资金最高净值,单位是元
    drawdownfloat当前回撤,单位是元
    totalResultint总成交次数
    totalTurnoverfloat总成交金额
    totalCommissionfloat总手续费
    totalSlippagefloat所有交易产生的滑点费用,单位是元
    winningRatefloat胜率(%)
    averageWinningfloat盈利交易平均值,单位是元
    averageLosingfloat亏损交易平均值,单位是元
    profitLossRatiofloat盈亏比

    参数优化主流程详解

    用户只需关注参数优化主流程,这里以AtrRsiStrategy策略为例,对每个步骤结合代码做以下详解:

    1. 对用户来讲,首先要创建回测引擎实例
    # 创建回测引擎
    engine = BacktestingEngine()
    1. 设置回测引擎的相关参数(回测模式,回测起始日期,数据库)。
    # 设置引擎的回测模式为K线
    engine.setBacktestingMode(engine.BAR_MODE)
    
    # 设置回测用的数据起始日期和结束日期
    engine.setStartDate('20110101')
    engine.setEndDate('20161231')
    
    # 载入历史数据到引擎中
    engine.setDatabase(MINUTE_DB_NAME, 'IF0000')
    1. 设置产品(合约)相关参数(滑点,佣金,合约大小)。这里回测的合约是股指,滑点设为股指1跳,股指一手每点价格为300元
    # 设置产品相关参数
    engine.setSlippage(0.2)     # 股指1跳
    engine.setRate(0.3/10000)   # 万0.3
    engine.setSize(300)         # 股指合约大小    
    1. 创建优化参数实例
    # 创建优化参数设置实例
    setting = OptimizationSetting()                 # 新建一个优化任务设置对象
    1. 设置优化目标和参数
    setting.setOptimizeTarget('capital')            # 设置优化排序的目标是策略净盈利
    setting.addParameter('atrLength', 12, 20, 2)    # 增加第一个优化参数atrLength,起始12,结束20,步进2
    setting.addParameter('atrMaLength', 20, 30, 5)  # 增加第二个优化参数atrMaLength,起始20,结束30,步进5
    setting.addParameter('rsiLength', 5)            # 增加一个固定数值的参数
    1. 运行单进程优化
    ## 运行单进程优化函数,自动输出结果
    engine.runOptimization(AtrRsiStrategy, setting)        

    示例在IPython下的运行结果

    浮点数由于精度问题,可能会出现误差。由于参数组合是无序字典,所以可能参数组合的回测顺序跟笔者的不一样。笔者电脑上,单进程优化耗时约3分40秒。

    In [12]: import sys
       ....: sys.path.append('F:\\vnpy\\vn.trader')
       ....: sys.path.append('F:\\vnpy\\vn.trader\ctaAlgo')
       ....: from __future__ import division
       ....: from datetime import datetime, timedelta
       ....: from collections import OrderedDict
       ....: from itertools import product
       ....: import multiprocessing
       ....: import pymongo
       ....: from ctaBase import *
       ....: from ctaSetting import *
       ....: from vtConstant import *
       ....: from vtGateway import VtOrderData, VtTradeData
       ....: from vtFunction import loadMongoSetting
       ....: from ctaBacktesting import *
       ....: from strategyAtrRsi import *
       ....:
    
    In [13]: # 创建回测引擎
       ....: engine = BacktestingEngine()
       ....:
    
    In [14]: # 设置引擎的回测模式为K线
       ....: engine.setBacktestingMode(engine.BAR_MODE)
       ....:
       ....: # 设置回测用的数据起始日期和结束日期
       ....: engine.setStartDate('20110101')
       ....: engine.setEndDate('20161231')
       ....:
       ....: # 载入历史数据到引擎中
       ....: engine.setDatabase(MINUTE_DB_NAME, 'IF0000')
       ....:
    
    In [15]: # 设置产品相关参数
       ....: engine.setSlippage(0.2)     # 股指1跳
       ....: engine.setRate(0.3/10000)   # 万0.3
       ....: engine.setSize(300)         # 股指合约大小
       ....:
    
    In [16]: # 创建优化参数设置实例
       ....: setting = OptimizationSetting()                 # 新建一个优化任务设置对象
       ....:
    
    In [17]: setting.setOptimizeTarget('capital')            # 设置优化排序的目标是策略净盈利
       ....: setting.addParameter('atrLength', 12, 20, 2)    # 增加第一个优化参数atrLength,起始12,结束20,步进2
       ....: setting.addParameter('atrMaLength', 20, 30, 5)  # 增加第二个优化参数atrMaLength,起始20,结束30,步进5
       ....: setting.addParameter('rsiLength', 5)            # 增加一个固定数值的参数
       ....:
    
    In [18]: ## 运行单进程优化函数,自动输出结果
       ....: engine.runOptimization(AtrRsiStrategy, setting)    
       ....:
    2017-02-08 19:06:19.279000	------------------------------
    2017-02-08 19:06:19.280000	setting: {'atrMaLength': 20, 'rsiLength': 5, 'atrLength': 12}
    2017-02-08 19:06:19.282000	开始载入数据
    2017-02-08 19:06:21.034000	载入完成,数据量:341851
    2017-02-08 19:06:21.034000	开始回测
    2017-02-08 19:06:21.050000	策略初始化完成
    2017-02-08 19:06:21.050000	策略启动完成
    2017-02-08 19:06:21.050000	开始回放数据
    2017-02-08 19:06:35.728000	数据回放结束
    2017-02-08 19:06:35.728000	计算回测结果
    2017-02-08 19:06:35.923000	------------------------------
    2017-02-08 19:06:35.924000	setting: {'atrMaLength': 25, 'rsiLength': 5, 'atrLength': 12}
    2017-02-08 19:06:35.925000	开始载入数据
    2017-02-08 19:06:36.015000	载入完成,数据量:341851
    2017-02-08 19:06:36.015000	开始回测
    2017-02-08 19:06:36.030000	策略初始化完成
    2017-02-08 19:06:36.030000	策略启动完成
    2017-02-08 19:06:36.030000	开始回放数据
    2017-02-08 19:06:50.140000	数据回放结束
    2017-02-08 19:06:50.140000	计算回测结果
    ...
    2017-02-08 19:09:30.237000	------------------------------
    2017-02-08 19:09:30.237000	setting: {'atrMaLength': 25, 'rsiLength': 5, 'atrLength': 20}
    2017-02-08 19:09:30.239000	开始载入数据
    2017-02-08 19:09:30.330000	载入完成,数据量:341851
    2017-02-08 19:09:30.330000	开始回测
    2017-02-08 19:09:30.343000	策略初始化完成
    2017-02-08 19:09:30.343000	策略启动完成
    2017-02-08 19:09:30.343000	开始回放数据
    2017-02-08 19:09:44.499000	数据回放结束
    2017-02-08 19:09:44.499000	计算回测结果
    2017-02-08 19:09:44.696000	------------------------------
    2017-02-08 19:09:44.696000	setting: {'atrMaLength': 30, 'rsiLength': 5, 'atrLength': 20}
    2017-02-08 19:09:44.697000	开始载入数据
    2017-02-08 19:09:44.787000	载入完成,数据量:341851
    2017-02-08 19:09:44.787000	开始回测
    2017-02-08 19:09:44.801000	策略初始化完成
    2017-02-08 19:09:44.801000	策略启动完成
    2017-02-08 19:09:44.801000	开始回放数据
    2017-02-08 19:09:58.942000	数据回放结束
    2017-02-08 19:09:58.942000	计算回测结果
    2017-02-08 19:09:59.242000	------------------------------
    2017-02-08 19:09:59.242000	优化结果:
    2017-02-08 19:09:59.242000	["{'atrMaLength': 30, 'rsiLength': 5, 'atrLength': 20}"]: 1127713.85011
    2017-02-08 19:09:59.242000	["{'atrMaLength': 30, 'rsiLength': 5, 'atrLength': 18}"]: 1030743.75807
    2017-02-08 19:09:59.242000	["{'atrMaLength': 25, 'rsiLength': 5, 'atrLength': 16}"]: 983294.726285
    2017-02-08 19:09:59.242000	["{'atrMaLength': 20, 'rsiLength': 5, 'atrLength': 18}"]: 975329.10312
    2017-02-08 19:09:59.242000	["{'atrMaLength': 30, 'rsiLength': 5, 'atrLength': 12}"]: 949746.520421
    2017-02-08 19:09:59.242000	["{'atrMaLength': 25, 'rsiLength': 5, 'atrLength': 12}"]: 914875.145592
    2017-02-08 19:09:59.243000	["{'atrMaLength': 30, 'rsiLength': 5, 'atrLength': 16}"]: 899113.140024
    2017-02-08 19:09:59.243000	["{'atrMaLength': 20, 'rsiLength': 5, 'atrLength': 14}"]: 896378.557181
    2017-02-08 19:09:59.243000	["{'atrMaLength': 30, 'rsiLength': 5, 'atrLength': 14}"]: 893726.622984
    2017-02-08 19:09:59.243000	["{'atrMaLength': 20, 'rsiLength': 5, 'atrLength': 16}"]: 883947.771514
    2017-02-08 19:09:59.243000	["{'atrMaLength': 25, 'rsiLength': 5, 'atrLength': 14}"]: 873221.532605
    2017-02-08 19:09:59.243000	["{'atrMaLength': 20, 'rsiLength': 5, 'atrLength': 12}"]: 857260.355525
    2017-02-08 19:09:59.243000	["{'atrMaLength': 20, 'rsiLength': 5, 'atrLength': 20}"]: 852615.557093
    2017-02-08 19:09:59.243000	["{'atrMaLength': 25, 'rsiLength': 5, 'atrLength': 20}"]: 790618.233326
    2017-02-08 19:09:59.243000	["{'atrMaLength': 25, 'rsiLength': 5, 'atrLength': 18}"]: 726949.447939

    优化结果的输出格式是:参数组合:优化目标值

    多进程优化

    本节主要讲解参数的优化的多进程模式。由于Python的GIL原因,多进程模式可以更好的利用CPU的多核,提高优化参数速度。由于vnpy已经提供RPC模块,所以可以基于RPC模块实现分布式参数优化。

    多进程参数优化主流程图和优化函数流程图 Markdown

    多进程参数优化主流程详解

    用户只需关注多进程参数优化主流程,这里以AtrRsiStrategy策略为例,对每个步骤结合代码做以下详解。跟普通模式的参数优化的区别是最后调用多进程优化接口。笔者电脑上,示例中AtrRsiStrategy策略多进程回测的耗时约为52秒。

    1. 对用户来讲,首先要创建回测引擎实例
    # 创建回测引擎
    engine = BacktestingEngine()
    1. 设置回测引擎的相关参数(回测模式,回测起始日期,数据库)。
    # 设置引擎的回测模式为K线
    engine.setBacktestingMode(engine.BAR_MODE)
    
    # 设置回测用的数据起始日期和结束日期
    engine.setStartDate('20110101')
    engine.setEndDate('20161231')
    
    # 载入历史数据到引擎中
    engine.setDatabase(MINUTE_DB_NAME, 'IF0000')
    1. 设置产品(合约)相关参数(滑点,佣金,合约大小)。这里回测的合约是股指,滑点设为股指1跳,股指一手每点价格为300元
    # 设置产品相关参数
    engine.setSlippage(0.2)     # 股指1跳
    engine.setRate(0.3/10000)   # 万0.3
    engine.setSize(300)         # 股指合约大小    
    1. 创建优化参数实例
    # 创建优化参数设置实例
    setting = OptimizationSetting()                 # 新建一个优化任务设置对象
    1. 设置优化目标和参数
    setting.setOptimizeTarget('capital')            # 设置优化排序的目标是策略净盈利
    setting.addParameter('atrLength', 12, 20, 2)    # 增加第一个优化参数atrLength,起始12,结束20,步进2
    setting.addParameter('atrMaLength', 20, 30, 5)  # 增加第二个优化参数atrMaLength,起始20,结束30,步进5
    setting.addParameter('rsiLength', 5)            # 增加一个固定数值的参数
    1. 运行多进程优化
    ## 运行多进程优化函数,自动输出结果
    engine.runParallelOptimization(AtrRsiStrategy, setting)   
    展开全文
  • 注解支持使用EL表达式 这里就是支持使用相关的参数和属性来表示 #root.targetClass 是类名 #p0是第一个参数值 @Cacheable( value = "test" , key = "#root.targetClass + '_' + #p0 + '_' + #p1" ) ...
  • 学习也要有策略

    千次阅读 2013-08-01 21:58:17
    学习是一项非常复杂的工作,...在认知策略支持下,人能够有效地加工与整理学习中得到的信息,并且分门别类地形成记忆。在军事上,对不同的敌人,针对不同的作战目标,需要采用不同的战略战术。这一点,放在学习中同样
  • JavaScript 设计模式之策略模式

    万次阅读 2019-11-26 23:46:07
    什么是策略模式? 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 使用策略模式计算奖金 很多公司的年终奖是根据员工的工资基数和年底绩效情况来发放的。例 如,绩效S的人...
  • 浏览器的同源策略

    千次阅读 2013-02-20 16:46:32
    Web世界之所以能如此美好地呈现在我们面前,多亏了浏览器的功劳,不过浏览器不是一个花瓶——只负责呈现,它还制定了一些安全策略,这些安全策略有效地保障了用户计算机的本地安全与Web安全。  注: 计
  • Tigase负载均衡策略

    千次阅读 2015-11-17 13:18:37
    此Tigase的实现跟其他实现一样,是可扩展的,支持不同的、可插拨的重定向策略,实现了SeeOtherHostIfc接口。 当前有三种可用的策略: 1)SeeOtherHost策略策略是最基本的实现,它会返回init....
  • (七)策略模式详解

    千次阅读 2013-06-16 17:47:13
    作者:zuoxiaolong8810(左潇龙),转载请注明出处。... 策略模式在LZ第一次接触到的时候,LZ是这么理解的,就是如果我们想往一个方法当中插入随便一段代码的话,就是策略模式。即如下形式。 public cl
  • Redis 深入理解内存回收策略设计思想(过期键删除策略和内存淘汰策略
  • Redis-数据删除策略以及逐出(淘汰)策略

    千次阅读 多人点赞 2020-06-21 18:09:25
    文章目录Redis-删除策略以及逐出(淘汰)策略篇Redis简介删除策略以及逐出策略什么是过期数据?Redis提供的删除策略定时删除惰性删除|被动删除定期删除|主动删除删除策略比对逐出(淘汰)策略介绍逐出(淘汰)算法策略...
  • Clickhouse 多路径存储策略

    千次阅读 2020-06-14 17:32:45
    为了解决这种问题 在19.15版本开始支持MergeTree自定义存储策略的功能,支持以数据分区最小移动单元将分区目录写入多块磁盘目录。 根据配置策略的不同,目前大致有三类存储策略: 1.默认策略(default):...
  • 缓存更新策略

    千次阅读 2017-03-06 21:03:00
    缓存更新策略 转自:https://www.zhihu.com/question/27738066 更新缓存的的Design Pattern有四种:Cache aside, Read through, Write through, Write behind caching,我们下面一一来看一下这四种Pattern。 ...
  • ActiveMQ消息策略

    千次阅读 2016-05-29 12:34:33
    ActiveMQ中提供了众多的“策略”(policy),它们可以在broker端每个通道“定制”消息的管理方式。本文将简单描述主要的几种Policy。   一. DispatchPolcicy: 转发策略(Topic)  此策略表明broker端消息...
  • 路由策略策略路由配置与管理-2

    万次阅读 多人点赞 2017-03-05 20:18:34
    策略路由基础 “路由策略”(Routing Policy,RP)与“策略路由”(Policy-BasedRouting,PBR)有着本质上的区别。“路由策略”中的“路由”是名词,而“策略”是动词,操作对象是路由信息。“路由策略”主要用来...
  • 数据库Sharding的基本思想和切分策略

    万次阅读 多人点赞 2011-01-24 16:32:00
    本文着重介绍sharding的基本思想和理论上的切分策略,关于更加细致的实施策略和参考事例请参考我的另一篇博文:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示一、基本思想 Sharding的基本思想就要把一个...
  • 数字货币的趋势跟踪策略

    千次阅读 2018-10-09 18:19:17
    趋势跟踪策略是过去20年金融市场中最成功的策略之一。因其易操作,风险可控,收益高获得了许多基金经理和个人投资者的青睐。一般来说,流动性稍差,真实价值发现难度高,波动性高的金融标的都容易在趋势交易中获胜。...
  • 通用mapper主键策略

    千次阅读 2018-07-14 10:28:40
    首先主键策略和数据库关系很大,有些数据库支持主键自增,而有些数据库只能通过序列来获得。 新增的@KeySql 注解用于替换 @GeneratedValue 注解,因此 @KeySql 能以更简单方式实现原来的功能,下面的示例都先使用 @...
  • 策略模式

    千次阅读 2013-06-13 10:15:39
    提出需求:商场会不定时举办一系列的优惠活动,优惠方式暂定:打折扣,满多少还多少(例如:满300还100)   初步场景分析: 看到这个需求,第一感觉就会潜意识的认为“这个太简单了”。 1.商场收银系统:定义...
  • 本文讲的是 当redis设定了最大内存之后,缓存中的数据集大小超过了一定比例,实施的淘汰策略,不是删除过期键的策略,虽然两者非常相似。   redis系列文章目录 Redis 利用Hash存储节约内存 使用spring-data-...
  • HDFS存储策略

    千次阅读 2018-06-29 23:27:59
    请查看原文:http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html(如果转发,请标明出处)介绍归档存储(Archival Storage)是将不断增长的存储容量与计算...根据策略,...
  • 一、标准分片策略StandardShardingStrategy 提供对SQL语句中的=, IN和BETWEEN AND的分片操作支持 StandardShardingStrategy只支持单分片键,提供PreciseShardingAlgorithm(精准分片)和RangeShardingAlgorithm...
  • chaincode指定背书策略 背书策略的验证过程 背书策略 节点通过背书策略来确定一个交易是否被正确背书。当一个peer接收一个交易后,就会调用与该交易Chaincode相关的VSCC(validator system chaincode实例化时...
  • 随着经济全球一体化的发展,许多中小型企业的销售市场不再仅限于国内,国外市场也看的尤重要,而产品全球化也成为了一种趋势,与此同时对于订单的融合,资金付款和商品的流通迫切需要信息平台的支持。2010年4月,...
  • Redis缓存逐出策略

    千次阅读 2018-04-16 21:59:59
    《Redis缓存逐出策略》 把 ...Redis 仅支持 LRU 逐出策略。下文主要讲述 Redis maxmemory 指令,这个指令用于限定内存使用量,以及讲述了Redis 使用到的 LRU 算法,这是一种近似LRU算法。1. maxmemory 配置指令 ...
  • OpenLDAP的密码策略实现

    万次阅读 2013-12-16 09:57:10
    OpenLDAP的密码控制策略很强大,可以控制...支持自动或管理员解锁账号;优雅(Grace)绑定(允许密码失效后登录的次数);密码策略可以在任意DIT范围定义,可以是用户、组或任意组合。 具体ppolicy的规格细节参考:htt
  • 策略路由(Policy Route)

    千次阅读 2019-12-22 18:58:11
    目录什么策略路由?策略路由优点策略路由流程route-map概念定义route-map格式route-map特征相关配置基于源地址的策略路由基于目的地址的策略路由基于报文长度的策略路由 什么策略路由? 所谓策略路由,...
  • 机器学习多因子策略

    千次阅读 2019-04-29 13:58:50
    前言 在二级市场的量化策略中,多因子策略称得上是最早被创造但同时也是变化最多的投资策略之一,好的因子意味着长期稳定的收入,因此能够发现一个好的...与传统多元线性回归不同,本文采用了支持向量回归(Suppor...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 326,180
精华内容 130,472
关键字:

为什么支持策略是有效的