精华内容
下载资源
问答
  • 策略
    千次阅读
    2020-05-11 14:50:15

    阿尔法策略:
    主动型策略、主动收益(阿尔法收益)、精选高品质个股、争取实现超越大盘收益、适合激进投资者、对选股和择时能力要求极高、大盘在牛市中表现强势、大盘在熊市中回落幅度比贝塔策略更大、牛市有优势、


    贝塔策略:
    被动型策略、被动收益(贝塔收益)、被动选择指数、实现对大盘指数的精准跟踪、适合稳健投资者、对择时能力要求极高、大盘在熊市中更加抗跌、大盘在牛市中比阿尔法策略涨幅偏小、


    1

    阿尔法策略,是一种主动型投资策略,主要依靠精选行业和个股来超越大盘。而阿尔法策略追求的就是阿尔法收益,指投资收益中超出市场收益的部分。激进投资者适合阿尔法策略,尤其在市场上涨阶段会有优势。

    纯粹阿尔法策略在成熟的市场是一类种常用且成功的投资策略,如全球最大的对冲基金桥水公司的PureAlpha。纯粹阿尔法策略要通过卖空指数剥离出纯粹的阿尔法收益,对操作能力和资金门槛要求较高,同时稳定性也较高。而在国内市场的阿尔法策略,通常不是纯粹阿尔法策略,因为稳定性相对较差。由于受到行业轮动显著及对冲受限的市场的影响,投资者在使用阿尔法策略时,其收益充满变数,很多时候包含了贝塔收益。

    贝塔策略,是一种被动型投资策略,主要依靠把握市场大势来获得超越大盘的收益。贝塔策略追求的是市场收益,也就是贝塔收益。稳健的投资者适合贝塔策略。

    由于国内市场已经有了众多跟踪不同市场指数的金融投资产品,使得贝塔策略广泛覆盖;继而,在中国市场牛短熊长的环境下,如果不主动择时操作,贝塔策略很容易出现负收益。在经济调结构的转型期间,预期的不确定性会导致市场波动加大,从而增加了贝塔策略的投资风险。中国股市牛短熊长,所以很容易出现负收益。

    阿尔法策略与贝塔策略是两类基于不同的出发点和侧重点来获取超越大盘表现的投资策略,市场中性策略则介于二者之间。一言以蔽之,基金投资的阿尔法策略就是选择那些善于自下而上发掘个股、轻选时重选股型基金经理所管理的基金,而贝塔策略则是依靠那些长于自上而下宏观判断、轻选股重选时型基金经理所管理的基金。由于出发点和侧重点有别,二者在资产配置、行业轮动、个股周期等方面都相去甚远,进而在牛熊殊异的行情下各有千秋。那么,作为基金投资者,究竟是选择阿尔法选手管理的基金,或是贝塔选手管理的基金,还是选择中性策略管理的基金呢?

    “时进则进”的阿尔法策略。例如2009年,沪深300指数从年初的1817.72点攀升至年底的3575.68点,涨幅高达96.71%。中国银河证券研究所《中国证券投资基金2009年业绩统计报告》研究结果表明,在主动管理的股票型基金中,银华优选、新华成长、兴业社会分列状元、榜眼、探花之位,收益实现翻番。进一步分析上述三只基金季报,全年股票仓位波动范围不大,基金经理主要通过精选行业个股战胜沪深300指数涨幅。反观那些2008年的贝塔明星,基于投资理念上或多或少想做绝对收益,在市场上涨时,因为心态谨慎,加仓迟缓,分散持股而集体失语,牵制了诸多基金的表现。事后想来,在2009年以来的这波牛市行情中,信心确实要比黄金和货币还要重要,该动则动,动如脱兔,飞蓬遇飘风而致千里,是乘势而为。

    “时退则退”的贝塔策略。例如2008年,沪深300指数从年初的5338.27点暴跌至年底的1817.72点,跌幅深达-65.95%。通过中国银河证券研究所《中国证券投资基金2008年业绩统计报告》同样可以看出,在主动管理的混合型基金中,泰达成长、华夏大盘、金鹰小盘等由于对贝塔的高度关注,对风险的严格控制,对仓位的小心谨慎,尽管没有实现绝对收益,但几近跑赢沪深300指数50%。对比那些基金界的“四大恶人”,熊市阶段不做贝塔,不降低仓位,覆巢之下安有完卵?风险管理成了2008年基金投资管理的核心,因此一役而跌得比别人少成就了贝塔基金经理显赫的名声。他们信奉好的投资者在衡量风险和挖掘机会上必须分配同样多时间,放弃风险的管制就是放任收益的流逝,该静则静,静如处子,伏蛰临岁寒而息百日,是藏地而眠。

    “动静不失其时”的中性策略。例如,纵观2008、2009两年以来的熊牛转换,既能在下跌阶段坚决实施贝塔策略来成功规避暴跌,又能在上涨阶段通过阿尔法策略来获取超额收益的基金犹如凤毛麟角。大多数上涨时能精选行业个股的阿尔法选手,涨势凌厉却疏于风险管理;而大多数下跌时能控制下行风险的贝塔选手,风格上又稳健有余进取不足。正所谓千金易买,一将难求!对基金投资者来说,激进型的可以关注阿尔法做得好的基金经理,在上涨阶段有优势;稳健型的可以关注组合贝塔值控制得好的基金经理,在下跌阶段能从容。对那些集激进与稳健于一身的“双面胶”投资者,要想取得能守善攻的投资绩效,除了遇到阿尔法策略和贝塔策略攻防转换灵活的基金经理之外,就得靠自己“动静不失其时”地运用中性策略,双手互搏,“射幸数跌,不如审发;日出而作,日落而息”和谐投资了。


    2

    投资者经常会有这样的想法:好股票总会涨的,所以会拿着貌似不错的股票焦虑地等待上涨;也常有这样的想法:最近大盘不错,我该拿点什么票,多少可以赚一些。其实不论我们有怎样的想法,最后总可以归入两类投资策略中的一类,其中一类属于主动性投资,而另一类属于被动性投资。在理论上前者被称为阿尔法策略而后者被称为贝塔策略,尽管这两种策略只是在一些高级投资论坛上被经常提到,但实际上每个投资者哪怕是最普通的投资者也在不知不觉中使用这两种策略或其中的一种。

    投资者经常会有这样的想法:好股票总会涨的,所以会拿着貌似不错的股票焦虑地等待上涨;也常有这样的想法:最近大盘不错,我该拿点什么票,多少可以赚一些。其实不论我们有怎样的想法,最后总可以归入两类投资策略中的一类,其中一类属于主动性投资,而另一类属于被动性投资。在理论上前者被称为阿尔法策略而后者被称为贝塔策略,尽管这两种策略只是在一些高级投资论坛上被经常提到,但实际上每个投资者哪怕是最普通的投资者也在不知不觉中使用这两种策略或其中的一种。

    单纯的阿尔法策略以选择个股为主,只要个股估值有足够的吸引力,或者成长性诱人,那么投资者就可以主动出击。由于回避了研判市要配套相应的做空机制,这样就可以减少净值的波动,不过国内在阿尔法策略运用中对于做空机制比较藐视。至于贝塔策略则主要聚焦于市场的趋势,一旦判断上涨趋势形成则跟随市场建仓。由于这种投资行为是由市场趋势决定的,所以属于被动性投资。一般来说我们在实际投资中不会采用单一的阿尔法策略或贝塔策略,可能会将资金分成两部分,分别采用阿尔法策略和贝塔策略。也就是拿一些中长线筹码,当然也包括无奈被深套的筹码,同时用另一些资金参与趋势性行情。也可能在不同的时段采用不同的策略,市场不好的时候拿着筹码死捂,市场大涨时跟着趋势跑。

    本栏主要跟踪上证指数的周线波段趋势,因此属于被动性的贝塔策略,甚至在被动跟随上证指数建仓的时候忽略个股而直奔行业,通过相应的ETF基金或分级基金参与。如果我们对于个股有独到研究,或者对于个股的资产重组有可靠的信息来源,

    场涨跌这个难题,所以阿尔法策略更适合对于市场波动茫然的投资者。当然真正的阿尔法策略还需或者对于某一行业的变化十分敏感,那么采用阿尔法策略无疑更合适。

    从更广泛的意义上说,阿尔法策略也并非一定是一家具体的上市公司。比如投资“一带一路”板块,就是一个广义的阿尔法策略。尽管这是一个板块,但因为持续向好,所以我们可以在不考虑市场波动的情况下进行主动性投资,这也是阿尔法策略的本质。上周一带一路指数(399991)上涨1.72%,CSSW丝路指数(000853)上涨1.42%,而同期上证指数则翻绿。这两个指数所对应的分级基金B份额则表现更佳,其中一带一B(502015)周涨幅为16.12%,一带一B(150276)为8.37%,表明在贝塔策略的前提下兼顾阿尔法策略可以获取更高的收益。如果把工作做得更细一些,实际上我们也还是可以从板块中选择个股的,比如在“一带一路”板块中选择更为强势的个股。

    看上去贝塔策略叠加阿尔法策略更好,那么反过来也是一样的,就是在阿尔法策略的基础上再结合贝塔策略选择合适的建仓时机。不过这两个策略要做到始终一致也是不可能的,只是建仓的买点可以尽量凑合在一起。比如看好一个个股,然后在市场形成上涨趋势时建仓,这样至少可以在拿到筹码之后尽快脱离成本区,我们知道保持账面的盈余对于持筹的信心会很有很大提升。

    从周线趋势的演变看,目前显然已经过了建仓期,也就是说已经过了贝塔策略中的买点,但阿尔法策略仍然是有效的,只要能够找到好的个股并且愿意承受较长时间的寂寞。而对于贝塔策略来说,尽管现在仍然处于持仓的阶段但也同样需要耐心和毅力,因为已经开始面临日线调整趋势的压力。

    在一轮日线调整中至少会出现一次较为像样的下跌,而现在只有上周五上证指数的一根小阴线。接下来预期会有两种选择,一种是本周一立马开杀,直接下到日线调整的低点。还有一种就是周初强势震荡然后逐步回落并探明日线调整的低点。不论怎么变,对于贝塔策略来说都是拿着筹码不为所动,耐心等待。

    推荐阅读:

    1.一个量化策略师的自白(好文强烈推荐)

    2.股票期货经典的量化交易策略都在这里了!(源码)

    3.期货/股票数据大全查询(历史/实时/Tick/财务等)

    4.三分钟弄明白为什么贝叶斯是量化工作者最常用的工具

    5.学习Python有哪些书籍?这里有一份书单送给你

    6.江湖中常说的“网格交易法”到底是什么?

    7.10种经典的日内交易策略模型思路

    8.干货 | 量化选股策略模型大全

    9.量化金融经典理论、重要模型、发展简史大全

    更多相关内容
  • Kafka分区策略

    千次阅读 2022-04-22 16:50:09
    生产者分区策略 1.分区的原因 (1)方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了; (2)可以提高并发,因为...

    生产者分区策略

    1.分区的原因

    (1)方便在集群中扩展,每个Partition可以通过调整以适应它所在的机器,而一个topic又可以有多个Partition组成,因此整个集群就可以适应任意大小的数据了;

    (2)可以提高并发,因为可以以Partition为单位读写了

    2.分区的原则

    (1) 指明 partition 的情况下,直接将指明的值直接作为 partiton 值;

    (2)没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition 数进行取余得到 partition 值;

    (3) 既没有 partition 值又没有 key 值的情况下, kafka采用Sticky Partition(黏性分区器),会随机选择一个分区,并尽可能一直使用该分区,待该分区的batch已满或者已完成,kafka再随机一个分区进行使用.(以前是一条条的轮询,现在是一批次的轮询)

    3.Kafka生产者3种分区分配策略

    1. DefaultPartitioner 默认分区策略

    全路径类名:org.apache.kafka.clients.producer.internals.DefaultPartitioner

    如果消息中指定了分区,则使用它
    如果未指定分区但存在key,则根据序列化key使用murmur2哈希算法对分区数取模。
    如果不存在分区或key,则会使用粘性分区策略,关于粘性分区请参阅 KIP-480。
    

    粘性分区Sticky Partitioner

    为什么会有粘性分区的概念?

    首先,我们指定,Producer在发送消息的时候,会将消息放到一个ProducerBatch中, 这个Batch可能包含多条消息,然后再将Batch打包发送。关于这一块可以看看我之前的文章 图解Kafka Producer 消息缓存模型
    在这里插入图片描述

    消息缓存

    这样做的好处就是能够提高吞吐量,减少发起请求的次数。

    但是有一个问题就是, 因为消息的发送它必须要你的一个Batch满了或者linger.ms时间到了,才会发送。如果生产的消息比较少的话,迟迟难以让Batch塞满,那么就意味着更高的延迟。

    在之前的消息发送中,就将消息轮询到各个分区的, 本来消息就少,你还给所有分区遍历的分配,那么每个ProducerBatch都很难满足条件。

    那么假如我先让一个ProducerBatch塞满了之后,再给其他的分区分配是不是可以降低这个延迟呢?

    详细的可以看看下面这张图、
    在这里插入图片描述
    这张图的前提是:

    Topic1 有3分区, 此时给Topic1 发9条无key的消息, 这9条消息加起来都不超过batch.size .
    那么以前的分配方式和粘性分区的分配方式如下

    可以看到,使用粘性分区之后,至少是先把一个Batch填满了发送然后再去填充另一个Batch。不至于向之前那样,虽然平均分配了,但是导致一个Batch都没有放满,不能立即发送。这不就增大了延迟了吗(只能通过linger.ms时间到了才发送)

    划重点:

    当一个Batch发送之后,需要选择一个新的粘性分区的时候
    ①. 可用分区<1 ;那么选择分区的逻辑是在所有分区中随机选择。
    ②. 可用分区=1; 那么直接选择这个分区。
    ③. 可用分区>1 ; 那么在所有可用分区中随机选择。
    当选择下一个粘性分区的时候,不是按照分区平均的原则来分配。而是随机原则(当然不能跟上一次的分区相同)
    
    例如刚刚发送到的Batch是 1号分区,等Batch满了,发送之后,新的消息可能会发到2或者3, 如果选择的是2,等2的Batch满了之后,下一次选择的Batch仍旧可能是1,而不是说为了平均,选择3分区。
    

    2.UniformStickyPartitioner 纯粹的粘性分区策略

    全路径类名:org.apache.kafka.clients.producer.internals.UniformStickyPartitioner

    他跟DefaultPartitioner 分区策略的唯一区别就是。

    DefaultPartitionerd 如果有key的话,那么它是按照key来决定分区的,这个时候并不会使用粘性分区
    UniformStickyPartitioner 是不管你有没有key, 统一都用粘性分区来分配。

    3. RoundRobinPartitioner 分区策略

    全路径类名:org.apache.kafka.clients.producer.internals.RoundRobinPartitioner

    如果消息中指定了分区,则使用它
    将消息平均的分配到每个分区中。
    与key无关
    
    
    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
        List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
        int numPartitions = partitions.size();
        int nextValue = nextValue(topic);
        List<PartitionInfo> availablePartitions = cluster.availablePartitionsForTopic(topic);
        if (!availablePartitions.isEmpty()) {
            int part = Utils.toPositive(nextValue) % availablePartitions.size();
            return availablePartitions.get(part).partition();
        } else {
            // no partitions are available, give a non-available partition
            return Utils.toPositive(nextValue) % numPartitions;
        }
    }
    

    上面是具体代码。有个地方需要注意;
    当可用分区是0的话,那么就是遍历的是所有分区中的。
    当有可用分区的话,那么遍历的是所有可用分区的。

    消费者分区策略

    Kafka默认的消费逻辑是,位于某个主题中的一个分区只能被同一个消费者组中的一个消费者消费。
    当主题分区发生变化时、或有新消费者加入群组时、或群组中有消费者挂掉时,Kafka会触发分区再均衡操作。 那分区再均衡有哪些优缺点呢?分区再平衡的优势在于能为消费者群组带来高可用性与伸缩性;但其缺点在于在发生再均衡这一期间内,消费者是无法读取信息的,所以这将会造成消费者群组会出现一小段时间不可用的情形。所以在应用Kafka的过程中,需要避免无用的分区再均衡发生。

    1. RoundRobinAssignor分配策略

    本策略的原理是,如果同一个消费者组内所有消费者订阅的主题都是相同的,那么策略的分区分配也是均匀的。假设在如下场景中,群组中的消费者订阅的主题都是相同的,消费者组中存在两个消费者C1、C2都订阅了主题T0、T1,若每个主题中都有3个分区,那么所订阅的所有分区可以标识为:
    在这里插入图片描述最终分配的结果为:
    在这里插入图片描述
    下面再看隶属于同一群组中的消费者订阅的主题不同的情况,若群组中内消费者订阅的主题是不同的,那么在执行分区分配的时候就不是完全的轮询分配了,会出现分区分配不均匀的情况。此处需要注意的是,如果某个消费者没有订阅某个Topic,那么在分区分配时,此消费者是分配不到这个Topic中的任何分区的。假设有如下场景,消费者组内有3个消费者C1、C2、C3,共同订阅了三个主题T0、T1、T2,若每个主题中分别有1、2、3个分区,其中消费者C1订阅了主题T0,消费者C2订阅了主题T0、T1,消费者C3订阅了主题T0、T1、T2,那么订阅的所有分区可以标识为:
    在这里插入图片描述最终分配的结果为:
    在这里插入图片描述之所以会产生这样的分配结果,是因为由于消费者C1只订阅了T0主题,那么分区T0P0会被分配给C1;消费者C2订阅了主题T0、T1,但由于T0中的分区已经被C1消费了,那么分区T1P0会被分配给消费者C2;已知T1分区同时被消费者C2、C3订阅,那么分区T1P1会分配给消费者C3;T2主题仅被消费者C3订阅了,所以T2主题中的所有分区都只能交给消费者C3消费。

    2. RangeAssignor分配策略

    本策略是以主题为基础的,在主题中根据数字编号对可用的分区排序,在消费者组中将消费者根据字典顺序排列。分区分配的依据是采用Topic中的分区总数除以消费者总数,来确定分配给每个消费者的分区个数,需要注意的是若不能平均分配的话,额外的分区将会分配给前几个消费者。假设有如下场景,消费者C1、C2都订阅了主题T0和T1且每个主题都有四个分区,那么要订阅的所有分区的标识为:
    在这里插入图片描述最终分配的结果为:
    在这里插入图片描述之所以产生这样的分配结果,是因为群组中存在消费者C1、C2,已知T0、T1主题中都存在四个分区,在这两个主题内部分别用分区数除以消费者数,最终每个消费者都将从主题中取出两个分区订阅。这样的分配是很均匀的,那么此分配策略是否能一直保持如此均匀的分配呢,我们再看另外一种情况,也就是分区数和消费者数不能整除的情况。假设有如下场景,群组中存在消费者C1、C2,有两个主题T0、T1其中都有3个分区,那么要订阅的所有分区标识为:
    在这里插入图片描述当不能整除时,前面的消费者会分配到额外的分区,那么此时的分配结果为:
    在这里插入图片描述

    综上可见这样的分配其实是不均匀的,如果类似的情况不断扩大则会出现部分消费者过载的情况。

    3. StickyAssignor分区分配策略

    本策略有两个目标, 首先是要实现分区分配要尽可能地均匀,其次当发生分区再平衡发生时,分区的分配会尽可能的与上次的分配结果保持一致,目的是为了防止分区的消费者发生变化,这有助于节约开销,也有助于避免消息重复消费的问题发生。需要注意的是,当以上两点发生冲突的时候,第一个目标是优先于第二个目标的。假设有如下场景,有三个消费者C1、C2、C3,它们都订阅了4个主题T0、T1、T2、T3且每个主题有2个分区,那么要订阅的所有分区的标识为:
    在这里插入图片描述最终的分配结果如下:
    在这里插入图片描述这样的分配结果似乎看上去与RoundRobinAssignor策略分配的结果相同,现假设此时消费者C2脱离了群组,那么群组将会执行分区再平衡操作,若采用的是RoundRobinAssignor策略,那么分配结果将是:
    在这里插入图片描述上述的分配结果中保留了上一次分配中对于消费者C1和C3的所有分配结果,并将原来消费者C2中分配的分区转移到了C1和C3中,最终消费者C1和C3的分区分配保持了均衡。若发生了分区再平衡,对于同一个分区而言,可能会出现之前的消费者和新指派的消费者不是同一个的情况,这就会导致消息的重复消费和浪费系统资源的情况。StickyAssignor策略如同其名字中的单词"sticky"一样,让分配的策略具备一定"粘性",以实现尽可能的让两次分配的结果是相同的,进而减少系统资源的损耗和其他异常情况的发生。

    下面看一下隶属于同一群组中的消费者订阅的主题不相同时分区分配策略结果是怎样的。假设有如下场景,群组内有3个消费者C1、C2、C3同时有三个主题T0、T1、T2,这三个主题分别有1、2、3个分区,消费者C1订阅了主题T0,消费者C2订阅了主题T0、T1,消费者C3订阅了主题T0、T1、T2,那么所要订阅的所有分区标识为:
    在这里插入图片描述如果此时采用RoundRobinAssignor策略,那么最终的分配结果如下:
    在这里插入图片描述若此时消费者C1脱离了群组,那么RoundRobinAssignor策略的分配结果为:
    在这里插入图片描述若采用的是StickyAssignor策略,那么最终的分配结果为:
    在这里插入图片描述若此时消费者C1离开了群组,那么StickyAssignor策略分配的结果是:
    在这里插入图片描述以上的分区分配结果较为理想,体现出了StickyAssignor策略所具有的两大特点,一是分区要尽可能的均衡,二是在发生分区再平衡时,分区的分配会尽可能的与上次的分配结果保持相同。

    https://www.modb.pro/db/242469
    https://di1shuai.com/Kafka%E2%80%94%E2%80%94%E5%88%86%E5%8C%BA%E7%AD%96%E7%95%A5.html#DefaultPartitioner-%E9%BB%98%E8%AE%A4%E5%88%86%E5%8C%BA%E5%99%A8
    https://developer.aliyun.com/article/890329
    https://qinjl.blog.csdn.net/article/details/108013204?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.pc_relevant_default&utm_relevant_index=2

    展开全文
  • 策略路由 路由策略 双点双向引入

    万次阅读 多人点赞 2020-07-10 01:33:17
    策略路由 路由策略 双点双向引入 一、策略路由 (一)策略路由–Policy-Based Routing—PBR 1、什么是策略路由: 对特定数据报文不按照路由表内的条目执行转发,根据需要按照某种策略改变数据报文转发路径。 2、...

    锲而不舍,金石可镂。

    策略路由 路由策略 双点双向引入

    一、策略路由

    (一)策略路由–Policy-Based Routing—PBR

    1、什么是策略路由:

    对特定数据报文不按照路由表内的条目执行转发,根据需要按照某种策略改变数据报文转发路径。

    2、运行机制:

    根据的报文的目的地址,报文的源地址,报文的大小和链路质量等属性制定策略路由,改变报文的转发路径。手动配置后基于策略转发,失败后再查找路由表转发。

    3、实现方式:

    华为设备支持3种策略路由:

    本地策略路由

    (1)名称:本地策略路由
    (2)对象:本设备产生流量
    (3)应用:对本机的ICMP,BGP等各种报文需要使用不同的源地址或者不同长度的报文通过不通方式进行发送时。

    接口策略路由

    (1)名称:接口策略路由
    (2)对象:流经本设备的数据
    (3)应用:针对用户不同源目地的数据按照流重定向选择下一跳,不按照路由表转发。

    智能策略路由(SSR)

    (1)名称:智能策略路由
    (2)对象:流经本设备的数据,基于链路质量信息为业务数据流选择最佳链路。
    (3)应用:对用户不同业务选择不同质量的链路。
    (4)注意:SSR的功能需要配合License来使用。

    (二)本地策略路由

    1、配置本地策略路由的匹配规则:

    可以通过ACL匹配到数据或者报文长度来进行对需要策略的数据执行匹配。

    2、配置本地策略路由的转发动作:

    可以通过接口或者下一跳地址发出。

    3、本地应用本地策略路由:

    在系统视图ip lcal policy-based-route X-X-----------调用名称为x-x的本地策略路由。

    (三)接口策略路由

    1、通过ACL匹配需要策略的流量

    2、定义流分类

    需要执行流策略的流量–即哪些流量需要转发
    通过ACL匹配需要策略的流量

    3、制定流行为

    指定需要执行流策略的动作,即如何转发

    4、制定流策略

    将流分类(匹配到需要转发的流量)和流行为(具体需要转发的动作)关联起来

    5、挂接流策略

    接口下在数据的进方向挂接流策略

    策略路由----PBR Policy Based Route—基于策略的路由(选址转发)

    策略路由----针对数据---------接口

    (四)策略路由配置

    1、策略路由指定的出接口要优于指定的下一跳
    2、策略路由指定的下一跳>路由表>策略部署的默认下一跳。

    二、路由策略

    路由策略----RP Route policy

    路由策略-------针对路由条目----路由协议----route policy
    人为的控制或者影响路由协议选路----过滤,cost,引入

    路由三要素----前缀----掩码----下一跳
    动态三要素----前缀----掩码----cost

    路由策略----路由条目

    对象:路由条目
    策略:过滤;修改路由属性

    1、路由匹配工具----抓取路由

    同意路由匹配工具

    ① ACL
    ② IP-preix----前缀列表
    ③ route-policy

    2、 BGP专属路由匹配工具

    ① ip murit-fiete----团体属性过滤列表
    ② ip as-patch-fiter----as路 径属性过滤列表

    3、路由策略工具----执行路由动作

    过滤

    ① route-policy
    ② fiter-policy

    属性修改

    route-policy

    2.1 前缀列表

    注意:由于route-policy不支持匹配Loopback接口,使用前缀列表来匹配loopbackO接口的路由。

    greater-equal X 掩码大约等于X
    less-equal X 掩码小于等于X

    如果只写前缀长度,掩码长度等于前缀长度
    如果只写greater-equal X,会自动补全less-equal 32

    在Route- policy同时调用ACL和ip-prix时,谁最后调用启用谁(ACL与ip-prix是覆盖关系)

    1、匹配任意掩码的路-------0.0.0.0 0 greater-equal x less-equal X
    2、匹配默认路----------------0.0.0.0 0 greater-equal 0 less-equal 0
    3、匹配所以明细路由-------0.0.0.0 0 greater-equal 1
    4、匹配所有的主机路-------0.0.0.0 0 greater-equal 32

    三、拓扑

    在这里插入图片描述

    四、策略配置

    AR-1的环回口loopback1 1.1.1.1/32模拟外部路由

    [AR-1]acl 2010
    [AR-1-acl-basic-2010] rule 5 permit source 1.1.1.1 0
    [AR-1-acl-basic-2010]rule 10 permit source 1.1.1.2 0
    
    [AR-1]route-policy di permit  node 10
    [AR-1-route-policy]if-match acl 2010
    
    [AR-1]ospf 
    [AR-1-ospf-1]import-route direct type 1 route-policy di
    

    4.1 网络互通

    在边界路由器完成双点双向路由引入实现全网互通与冗余备份

    [AR-3]isis 
    [AR-3-isis-1]network-entity 49.0001.0000.0000.0003.00
    [AR-3-isis-1]cost-style wide
    [AR-3-isis-1]quit
    [AR-3]int g0/0/0
    [AR-3-GigabitEthernet0/0/0]isis enable 
    [AR-3-GigabitEthernet0/0/0]int l0
    [AR-3-LoopBack0]isis enable 
    [AR-3-LoopBack0]quit
    [AR-3]ospf 1 router-id 3.3.3.3
    [AR-3-ospf-1]a 0   
    [AR-3-ospf-1-area-0.0.0.0]net 23.1.1.3 0.0.0.0、
    
    [AR-3]ospf 1	
    [AR-3-ospf-1]import-route isis
    [AR-3-ospf-1]isis 	
    [AR-3-isis-1]import-route ospf
    

    dis ip routing-table
    在这里插入图片描述

    4.2 网络优化

    通过路由策略消除存在次优路径与环路问题
    AR4:正常双向引入即可

    [AR-3]isis
    [AR-3-isis-1]undo import-route ospf
    [AR-3-isis-1]ospf 
    [AR-3-ospf-1]undo import-route  isis
    [AR-3-ospf-1]quit
    [AR-3]ospf 
    [AR-3-ospf-1]import-route  isis
    [AR-3-ospf-1]quit
    [AR-3]isis
    [AR-3-isis-1]import-route ospf
    [AR-3-isis-1]quit
    

    次优路径

    tracert 1.1.1.1
    在这里插入图片描述

    [AR-3]ospf 
    [AR-3-ospf-1]import-route  isis 1 type 1
    

    环路

    tracert 1.1.1.1
    在这里插入图片描述
    消除环路

    [AR-4]ip ip-prefix ospf index 10 permit 1.1.1.1 32
    [AR-4]ip ip-prefix ospf index 20 permit 2.2.2.2 32
    [AR-4]ip ip-prefix ospf index 30 permit 3.3.3.3 32
    [AR-4]ip ip-prefix ospf index 40 permit 4.4.4.4 32
    [AR-4]ip ip-prefix ospf index 50 permit 1.1.1.2 32
    
    [AR-4]route-policy ospf-->isis permit node 20
    [AR-4-route-policy]if-match  ip-prefix ospf
    [AR-4-route-policy]apply tag 100
    [AR-4-route-policy]quit
    [AR-4]isis	
    [AR-4-isis-1]import-route ospf 1 route-policy  ospf-->isis 
    [AR-4-isis-1]quit
    
    [AR-3]route-policy isis-->ospf deny node 10 //创建名称为isis-->ospf的路由策略组,此组的节点10执行拒绝路由的过滤动作
    [AR-3-route-policy]if-match tag 100         //此节点过滤带有100 tag标记的路由
    [AR-3-route-policy]quit
    [AR-3]route-policy isis-->ospf permit node 20
    
    [AR-3]ospf
    [AR-3-ospf-1]import-route isis route-policy  isis-->ospf  type 1 
    //在ospf进程中将isis进程1的路由导入,进入OSPF的IS-IS路由需要经过名称为isis-->ospf 的策略过滤 
    

    tracert 1.1.1.1
    在这里插入图片描述
    tracert 1.1.1.1
    在这里插入图片描述

    [AR-3]ip ip-prefix ospf index 10 permit 1.1.1.1 32
    [AR-3]ip ip-prefix ospf index 20 permit 2.2.2.2 32
    [AR-3]ip ip-prefix ospf index 30 permit 3.3.3.3 32
    [AR-3]ip ip-prefix ospf index 40 permit 4.4.4.4 32
    [AR-3]ip ip-prefix ospf index 50 permit 1.1.1.2 32
    
    [AR-3]route-policy ospf-->isis permit node 20
    [AR-3-route-policy]if-match ip-prefix ospf
    [AR-3-route-policy]apply  tag 200
    [AR-3-route-policy]isis
    [AR-3-isis-1]import-route ospf 1 route-policy  ospf-->isis 
    
    [AR-4]route-policy isis-->ospf deny node 8
    [AR-4-route-policy]if-match tag  200
    [AR-4-route-policy]quit
    [AR-4]route-policy isis-->ospf permit node 20
    
    [AR-4-ospf-1]import-route  isis route-policy  isis-->ospf  type 1
    

    tracert 1.1.1.1
    在这里插入图片描述
    tracert 1.1.1.1
    在这里插入图片描述

    [AR-4]route-policy isis-->ospf  permit node 15
    [AR-4-route-policy]apply tag 300
    [AR-4-route-policy]quit
    
    [AR-4]route-policy ospf-->isis  deny node 8
    [AR-4-route-policy]if-match  tag  400
    
    [AR-3]route-policy ospf-->isis  deny node 8
    [AR-3-route-policy]if-match tag  300
    [AR-3-route-policy]quit
    
    [AR-3]route-policy isis-->ospf  permit node 20
    [AR-3-route-policy]apply  tag 400
    

    消除次优

    [AR-4]route-policy isis-->pre permit node 20
    [AR-4-route-policy]if-match  tag  200
    [AR-4-route-policy]apply preference 151
    [AR-4-route-policy]quit
    [AR-4]isis
    [AR-4-isis-1]preference route-policy isis-->pre 15
    
    [AR-3]route-policy isis-->pre permit node 10
    [AR-3-route-policy]if-match tag  100
    [AR-3-route-policy]apply preference 151
    [AR-3-route-policy]isis 	
    [AR-3-isis-1]preference  route-policy  isis-->pre 15
    

    tracert 1.1.1.1
    在这里插入图片描述

    4.3 网络控制

    网络控制(不要修改接口开销)

    ① 修改开销(引入)
    ② 修改优先级(注意匹配策略)
    ③ 修改下一跳权值
    ④ 静态
    ⑤ 过滤

    (1)OSPF网络(AR-4除外)去往6.6.6.1的数据走上行线路:R3---->R5---->R6

    修改开销

    [AR-4]ip ip-prefix 35 permit  35.1.1.0 24
    [AR-4]ip ip-prefix 35 permit  6.6.6.1 32
    
    [AR-4]route-policy isis-->ospf permit  node 14
    [AR-4-route-policy]if-match ip-prefix 35 
    [AR-4-route-policy] apply cost 20 
    [AR-4-route-policy] apply tag 200
    

    在这里插入图片描述
    (2)OSPF网络(AR-3除外)去往6.6.6.2的数据走下行线路:R4---->R5---->R6

    修改优先级

    [AR-2]ip ip-prefix 23 permit 23.1.1.3 32
    [AR-2]ip ip-prefix 62 permit 6.6.6.2 32
    
    [AR-2]route-policy pre permit node 10
    [AR-2-route-policy]if-match ip-prefix 62
    [AR-2-route-policy]if-match  ip next-hop  ip-prefix 23
    [AR-2-route-policy]apply  preference 130
    [AR-2-route-policy]quit
    
    [AR-2]ospf	
    [AR-2-ospf-1]preference ase route-policy  pre
    

    dis ip routing-table
    在这里插入图片描述
    (3)IS-IS网络(AR-3除外)去往1.1.1.2的数据走下行线路: R4---->R2---->R1

    在AR-3上配置:增加1.1.1.2的开销值

    [AR-3]ip ip-prefix 452 permit 1.1.1.2 32
    [AR-3]route-policy ospf-->isis permit node 16
    	
    [AR-3-route-policy]if-match ip-prefix 452
    [AR-3-route-policy]apply tag 100
    [AR-3-route-policy]apply cost 200
    [AR-3-route-policy]quit
    
    [AR-3]route-policy ospf-->isis  permit  node 22
    [AR-3-route-policy]apply tag 100
    

    dis ip routing-table
    在这里插入图片描述
    (4)IS-IS网络(AR-4除外)去往1.1.1.1的数据走上行线路: R3---->R2---->R1

    策略路由----指定数据转发----不查看路由表

    ① 匹配数据
    acl

    ② 制定流分类
    traffic classifier

    ③ 制定流行为
    traffic behavior

    ④ 策略的组合
    traffic policy 数据与策略的组合

    ⑤ 挂接流策略
    在数据的进站方向挂接

    用策略路由写

    [AR-5]acl 3010
    [AR-5-acl-adv-3010]rule 10 permit ip source any destination 1.1.1.1 0  //匹配内网去往1.1.1.1的流量
    [AR-5-acl-adv-3010]quit
     
    [AR-5]traffic classifier host           //创建名称为host的流分类(这里匹配的到的数据将执行流动作)
    [AR-5-classifier-host]if-match acl 3010 //通过acl3010获得流量需要执行流分类	
    [AR-5-classifier-host]quit
    
    [AR-5]traffic behavior host                       //创建名称为host的流行为
    [AR-5-behavior-host]redirect ip-nexthop 35.1.1.3  //这个流行为匹配到的流量执行下一跳重定向动作
    [AR-5-behavior-host]quit
    
    [AR-5]traffic policy host                              //创建名称为host的流策略
    [AR-5-trafficpolicy-host]classifier host behavior host //将名称为host流分类匹配到数据和名称为host的流行为结合
    [AR-5-trafficpolicy-host]quit
    
    [AR-5]int g0/0/2  
    [AR-5-GigabitEthernet0/0/2]traffic-policy host  inbound
    //将名称为cl的流策略挂接到此接口的入方向,进入此接口被匹配到数据将安装流策略的规定动作转发,没有匹配到数据按照路由表正常转发
    

    策略优先级高于路由表优先级

    tracert 1.1.1.1
    在这里插入图片描述

    在这里插入图片描述

    本人所有文章都受版权保护,著作权归艺博东所有!未经授权,转载必究或附上其原创链接。

    展开全文
  • Python量化交易策略及回测系统

    千次阅读 多人点赞 2022-03-11 20:30:37
    目录前言:行文思路1、模块导入2、数据获取3、股票数据类型转换4、策略编写5、回测系统编写6、实例化策略非面向对象的编程 前言:行文思路 由于本文篇幅较长,而且文中关于python数据分析的知识点、python金融量化的...

    前言:行文思路

    由于本文篇幅较长,而且文中关于python数据分析的知识点、python金融量化的知识点较多,因此在文章的开头先给出本文整体思路,以便读者能够拥有较为清晰的脉络通读全文。
    第一部分:模块导入,主要是将后面需要用到的模块进行导入(简单,非重点)
    第二部分:数据获取,鉴于在网络上股票数据不易找到,Wind金融终端等数据库数据收费,通过多方查找,终于让我找到了能够免费下载股票数据的模块,建议大家收藏(简单,非重点)
    第三部分:将股票数据转化为新的数据类型,通过上面的方法下载下来的数据类型是我们常见的DataFrame,虽然pandas的功能已经很强大了,但是为了加入新的数据指标以及方便下一步操作,最好还是将DataFrame数据转化为一种新的数据类型(较难,非重点)
    第四部分:策略编写,也就是利用代码将我们在股票市场中的交易原则表达出来(较难,重点)
    第五部分:回测系统编写,股票回测即是基于历史已经发生过的真实行情数据,在历史上某一段时间内,模拟真实金融市场中股票的买入、卖出,得出这个时间段内的盈利率等数据(较难,重点)
    第六部分:实例化策略并回测得到收益,继承一个策略类,得到一个实际的例子,利用股票数据回测得出结果(简单,重点)

    1、模块导入

    import akshare as ak
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from collections import namedtuple
    from collections import OrderedDict
    from collections.abc import Iterable
    from functools import reduce
    from abc import ABC, abstractmethod
    

    akshare:用于下载股票的交易数据(前复权)
    collections:对基本数据类型做进一步处理,实现特定的数据类型
    abc:主要定义了基本类和最基本的抽象方法,可以为子类定义共有的接口API,不需要具体实现

    2、数据获取

    # 获取某一只股票一段时间的数据
    stock_sz300750_df = ak.stock_zh_a_daily(symbol="sz300750", start_date="20200103", end_date="20211231", adjust="qfq")
    # list_date = list(stock_sz300750_df['date'])
    # stock_sz300750_df.index = list_date
    stock_sz300750_df.head()
    

    在这里插入图片描述
    函数ak.stock_zh_a_daily()用于获取A股股票数据
    symbol为股票代码,sh为上交所股票,sz为深交所股票;strat_date、end_date分别为股票数据开始时间、结束时间;adjust默认为不复权的数据, qfq是返回前复权后的数据,hfq是 返回后复权后的数据

    3、股票数据类型转换

    由于后面写了两个量化交易策略,而且策略中的有部分指标不相同,所以在这一部分以及下面回测系统两部分面向对象编程,有部分函数只用于策略一,有部分只用于策略二。

    # 将股票数据转化为新的数据类型
    class StockTradeDays(object):
        def __init__(self, price_array, date_array=None):
            self.price_array = price_array
            self.date_array = self._init_days(date_array)
            self.change_array = self._init_change()
            self.s_short = self._init_sma_short(price_array)
            self.s_long = self._init_sma_long(price_array)
            self.stock_dict = self._init_stock_dict()
    
        def _init_change(self):
            # 收益率
    
            change_array = self.price_array.pct_change(periods=1)
            return change_array
    
        def _init_days(self, date_array):
            # 日期序列
            
            date_array = [str(date) for date in date_array]
            return date_array
    
        def _init_sma_short(self, price_array):
            # 5日移动平均线
            
            s_short = price_array.rolling(window=5, min_periods=5).mean()
            return s_short
        
        def _init_sma_long(self, price_array):
            # 30日移动平均线
            
            s_long = price_array.rolling(window=30, min_periods=30).mean()
            return s_long
        
        def _init_stock_dict(self):
            # 将股票的日期、收盘价、涨跌幅转化为一个新的数据类型
    
            stock_namedtuple = namedtuple('stock', ('date', 'price', 'change', 's_short', 's_long'))
    
            # 使用以被赋值的date_array等进行OrderedDict的组装
            stock_dict = OrderedDict((date, stock_namedtuple(date, price, change, s_short, s_long)) for date, price, change, s_short, s_long 
                                     in zip(self.date_array, self.price_array, self.change_array, self.s_short, self.s_long))
            return stock_dict
    
       
        def filter_stock(self, want_up=True, want_calc_sum=False):
            # 判断交易日股票是上涨还是下跌
            # Python中的三目表达式的写法
            filter_func = (lambda p_day: p_day.change > 0) if want_up else (lambda p_day: p_day.change < 0)
            # 使用filter_func做筛选函数
            want_days = list(filter(filter_func, self.stock_dict.values()))
    
            if not want_calc_sum:
                return want_days
    
            # 需要计算涨跌幅和
            change_sum = 0.0
            for day in want_days:
                change_sum += day.change
            return change_sum    
    

    相同指标:date、price、change
    策略一:s_short、s_long分别为5日移动平均线和30日移动平均线;可以根据自己的需求更改参数数据
    策略二:函数filter_stock(),用于判断交易日股票是上涨还是下跌

    最后将DataFrame数据转换为自定义数据类型OrderedDict

    trade_days = StockTradeDays(stock_sz300750_df['close'], stock_sz300750_df['date'])
    if isinstance(trade_days, Iterable) :
        for day in trade_days:
            print(day) 
    

    在这里插入图片描述

    4、回测系统编写

    class TradeStrategyBase(ABC, object):   # 只能被继承,不能实例化
         # 交易策略抽象基类
    
        @abstractmethod
        def buy_strategy(self, *args, **kwargs):
            # 买入策略基类
            pass
    
        @abstractmethod
        def sell_strategy(self, *args, **kwargs):
            # 卖出策略基类
            pass
    
    
    class TradeLoopBack(object):
        # 交易回测系统
    
        def __init__(self, trade_days, trade_strategy):
            """
            使用上面封装的StockTradeDays类和编写的交易策略类
            TradeStrategyBase类初始化交易系统
            :param trade_days: StockTradeDays交易数据序列
            :param trade_strategy: TradeStrategyBase交易策略
            """
            self.trade_days = trade_days
            self.trade_strategy = trade_strategy
            # 交易盈亏结果序列
            self.profit_array = []
    
        def execute_trade(self):
            # 执行交易回测
            
            for ind, day in enumerate(self.trade_days):
            # 以时间驱动,完成交易回测
                
                if self.trade_strategy.keep_stock_day == 1 or self.trade_strategy.keep_stock_day > 0:
                    # 如果有持有股票,加入交易盈亏结果序列
                    self.profit_array.append(day.change)
    #                 print("日期:{},持有中".format(day.date))
    
                # hasattr: 用来查询对象有没有实现某个方法
                if hasattr(self.trade_strategy, 'buy_strategy'):
                    # 买入策略执行
                    self.trade_strategy.buy_strategy(ind, day, self.trade_days)
    #                 if self.trade_strategy.keep_stock_day == 1:
    #                     print("日期:{},买入策略执行".format(day.date))
    
                if hasattr(self.trade_strategy, 'sell_strategy'):
                    # 卖出策略执行
                    self.trade_strategy.sell_strategy(ind, day, self.trade_days)
    #                 if self.trade_strategy.keep_stock_day == 0:
    #                     print("日期:{},卖出策略执行".format(day.date))
    

    execute_trade()函数中,利用循环遍历整一个交易时段,将获得的每日股票数据传给交易策略进行判断,最终确定是买入、卖出还是持有

    5、策略编写

    class TradeStrategy1(TradeStrategyBase):
        """
            交易策略1: 利用5日移动平均线与30日移动平均线交叉点进行股票买卖
            当5日移动平均线从下往上穿过30日移动平均线时,买入股票并持有
            当5日移动平均线从上往下穿过30日移动平均线时,卖出股票
        """
        def __init__(self, stock_df):        
            self.keep_stock_day = -1
    
        def buy_strategy(self, trade_ind, trade_day, trade_days):
            if not pd.isna(trade_days[trade_ind - 1].s_long):
            # 只有当长期移动平均线的数据有了,才能进行下一步操作    
                
                # 今日移动平均线值
                today_short = trade_day.s_short
                today_long = trade_day.s_long
    
                # 昨日移动平均线值
                yesterday_short = trade_days[trade_ind - 1].s_short
                yesterday_long = trade_days[trade_ind - 1].s_long
    
                if today_short > today_long and yesterday_short < yesterday_long:
                    # 买入条件成立:
                    self.keep_stock_day = 1
    
        def sell_strategy(self, trade_ind, trade_day, trade_days):
            if not pd.isna(trade_days[trade_ind - 1].s_long):
            # 只有当长期移动平均线的数据有了,才能进行下一步操作            
                
                # 今日移动平均线值
                today_short = trade_day.s_short
                today_long = trade_day.s_long
    
                # 昨日移动平均线值
                yesterday_short = trade_days[trade_ind - 1].s_short
                yesterday_long = trade_days[trade_ind - 1].s_long
    
                if today_short < today_long and yesterday_short > yesterday_long:
                    # 卖出条件成立:
                    self.keep_stock_day = 0
    

    移动平均线是将一定时期内的股票价格加以平均,把不同时间的平均值连接起来形成一根MA,利用长短期的移动平均线交叉点观察股票价格变动趋势的一种技术指标。因此,只有到了第30天才可以获得30日移动平均值,才可能进行买卖。
    判断买入条件:当短期移动平均线从下往上穿过长期移动平均线时,可以认为短期内股价的趋势向上,股价可能会上涨
    判断卖出条件:当短期移动平均线从上往下穿过长期移动平均线时,可以认为短期内股价的趋势向下,股价可能会下跌

    class TradeStrategy2(TradeStrategyBase):
        """
            交易策略2: 追涨杀跌策略,当股价连续两个交易日上涨
            且上涨幅度超过阀值默认s_buy_change_threshold(),买入股票并持有
            当股价连续两个交易日下跌
            且下跌幅度超过阀值默认s_sell_change_threshold(),卖出股票
        """
        def __init__(self):
            self.keep_stock_day = 0
            self.s_buy_change_threshold = 0.05      # 上涨买入阀值
            self.s_sell_change_threshold = -0.05   #下跌卖出阀值
    
        def buy_strategy(self, trade_ind, trade_day, trade_days):
            if self.keep_stock_day == 0 and trade_ind >= 1:
                """
                    当没有持有股票的时候self.keep_stock_day == 0 并且
                    trade_ind >= 1, 不是交易开始的第一天,因为需要yesterday数据
                """
                # trade_day.change > 0 bool:今天是否股价上涨
                today_down = trade_day.change > 0
                # 昨天是否股价上涨
                yesterday_down = trade_days[trade_ind - 1].change > 0
                # 两天总涨幅
                down_rate = trade_day.change + trade_days[trade_ind - 1].change
                if today_down and yesterday_down and down_rate > self.s_buy_change_threshold:
                    # 买入条件成立:连涨两天,涨幅超过s_buy_change_threshold
                    self.keep_stock_day += 1
    
        def sell_strategy(self, trade_ind, trade_day, trade_days):
            # trade_day.change < 0 bool:今天是否股价下跌
            today_down = trade_day.change < 0
            # 昨天是否股价下跌
            yesterday_down = trade_days[trade_ind - 1].change < 0
            # 两天总跌幅
            down_rate = trade_day.change + trade_days[trade_ind - 1].change
            if today_down and yesterday_down and down_rate < self.s_sell_change_threshold:
                # 卖出条件成立:连跌两天,跌幅超过s_sell_change_threshold
                self.keep_stock_day = 0
    
        @property
        def s_buy_change_threshold(self):
            # getter获取属性函数
            return self.__s_buy_change_threshold
    
        @s_buy_change_threshold.setter
        def s_buy_change_threshold(self, s_buy_change_threshold):
            # setter属性赋值
            if not isinstance(s_buy_change_threshold, float):
                """
                    上涨阀值需要为float类型
                """
                raise TypeError('buy_change_threshold must be float!')
            # 上涨阀值只取小数点后两位
            self.__s_buy_change_threshold = round(s_buy_change_threshold, 2)
    
        @property
        def s_sell_change_threshold(self):
            # getter获取属性函数
            return self.__s_sell_change_threshold
    
        @s_sell_change_threshold.setter
        def s_sell_change_threshold(self, s_sell_change_threshold):
            # setter属性赋值
            if not isinstance(s_sell_change_threshold, float):
                """
                    上涨阀值需要为float类型
                """
                raise TypeError('buy_change_threshold must be float!')
            # 上涨阀值只取小数点后两位
            self.__s_sell_change_threshold = round(s_sell_change_threshold, 2)
    

    策略二可以认为是非理性人在股票市场中交易时,遇到多日上涨且上涨幅度较大时,会认为股票有继续上涨的趋势,为了获利所以买入股票;但当某一股票连续下跌且下跌幅度超过心理预期时,会认为股票又继续下跌的趋势,为了止损卖出股票。
    策略二中买入股票条件为:当股价连续两个交易日上涨且上涨幅度超过0.05,买入股票并持有
    卖出条件为:当股价连续两个交易日下跌且下跌幅度超过-0.05,卖出股票
    相关参数可以根据需求修改

    6、实例化策略

    # 实例化策略1
    trade_strategy1 = TradeStrategy1(stock_sz300750_df)
    trade_loop_back = TradeLoopBack(trade_days, trade_strategy1)
    trade_loop_back.execute_trade()
    print('回测策略1总盈亏为:{}%'.format(reduce(lambda a, b: a + b, trade_loop_back.profit_array) * 100))
    plt.plot(np.array(trade_loop_back.profit_array).cumsum())
    

    经过前面的所有步骤之后,就可以实例化一个交易策略,利用交易数据进行回测,可得到相应的结果:
    在这里插入图片描述

    # 实例化策略2
    trade_strategy2 = TradeStrategy2()
    trade_loop_back = TradeLoopBack(trade_days, trade_strategy2)
    trade_loop_back.execute_trade()
    print('回测策略2总盈亏为:{}%'.format(reduce(lambda a, b: a + b, trade_loop_back.profit_array) * 100))
    plt.plot(np.array(trade_loop_back.profit_array).cumsum())
    

    结果:
    在这里插入图片描述

    非面向对象的编程

    由于对面向对象编程不太擅长,所以我对两个策略又分别写了新的程序,以判断上文面向对象程序是否正确

    changes_list_1 = []
    flag = -1
    for ind, day in enumerate(trade_days):
        short2 = day.s_short
        long2 = day.s_long
        short1 = trade_days[ind - 1].s_short
        long1 = trade_days[ind - 1].s_long
        if pd.isna(long1):
            continue
        if flag == 1:
            changes_list_1.append(day.change)
            print("日期:{},持有中".format(day.date))
        if short2 > long2 and short1 < long1:
            flag = 1
            print("日期:{},买入策略执行".format(day.date))
        if short2 < long2 and short1 > long1:
            flag = 0
            print("日期:{},卖出策略执行".format(day.date))
            
    print('回测策略1总盈亏为:{}%'.format(reduce(lambda a, b: a + b, changes_list_1) * 100))
    plt.plot(np.array(changes_list_1).cumsum())
    

    结果:
    在这里插入图片描述

    # 策略2
    changes_list_2 = []
    flag = 0
    for ind, day in enumerate(trade_days):
        today_down = day.change
        yesterday_down = trade_days[ind - 1].change
        if flag > 0:
            changes_list_2.append(day.change)
            print("日期:{},持有中".format(day.date))
        if today_down > 0 and yesterday_down > 0 and today_down + yesterday_down > 0.01:
            flag += 1
            print("日期:{},买入策略执行".format(day.date))
        if today_down < 0 and yesterday_down < 0 and today_down + yesterday_down < -0.01:
            flag = 0
            print("日期:{},卖出策略执行".format(day.date))
            
    print('回测策略2总盈亏为:{}%'.format(reduce(lambda a, b: a + b, changes_list_2) * 100))
    plt.plot(np.array(changes_list_2).cumsum())
    

    结果:
    在这里插入图片描述

    分析总结

    以上策略只用于量化分析,并不适合用于实际交易,之所以有较高的盈利,得益于宁王领衔的新能源板块的强势,大家也可以试试其他的股票,比如药明康德(代码:SH603259)
    在这里插入图片描述
    在这里插入图片描述
    可以看出策略对该股票进行回测交易时,获得的盈利并不客观,甚至出现较大的亏损,因此,需要对相关策略进行参数调整修改,或者发掘其他更为有效的策略……

    最后,大家如果觉得文章写的不错的话,可以点赞、收藏、关注三连哦~文中出现的所有代码已经打包上传至我的资源了,可以下载下来研究分析和运行查看

    展开全文
  • 同源策略与跨域

    千次阅读 2021-11-21 17:07:13
    前言:最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的...同源策略会阻止一个域的javascrip脚本和另一个域的内容进行交互,是用于隔离潜在恶意文件的关键安全机制;关于这一点我们后面会举例说明。...
  • if else终结者——策略模式

    千次阅读 多人点赞 2021-05-28 10:48:15
    你是不是还在写着大量的if else语句,if else 不仅难以维护不易扩展,而且使代码臃肿不堪,想不想让你的业务代码更加的健壮,更易扩展,那你一定要学一学今天的主角策略模式。学会了策略模式的使用让会你的代码更加...
  • Python Selenium.WebDriverWait 网页加载策略『详细』 文章目录Python Selenium.WebDriverWait 网页加载策略『详细』一、网页加载策略 一、网页加载策略
  • Java设计模式——策略模式

    万次阅读 多人点赞 2021-10-29 12:50:37
    策略模式 1.策略模式简介 策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解...
  • 华为数通笔记-策略路由

    千次阅读 2022-04-07 17:34:29
    策略路由-PBR 介绍 策略路由与路由策略(Routing Policy)存在以下不同: 策略路由的操作对象是数据包,在路由表已经产生的情况下,不按照路由表进行转发,而是根据需要,依照某种策略改变数据包转发路径。 路由...
  • java策略模式

    千次阅读 2020-09-26 20:15:17
     策略这个词应该怎么理解,打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。  再比如我们去逛商场,商场现在正在搞活动...
  • 华为网络配置(策略路由)

    千次阅读 多人点赞 2021-12-12 19:47:26
    一、策略路由概述 1、策略路由介绍 2、策略路由优点 3、本地策略路由 4、本地策略路由实现原理 5、接口策略路由 6、接口策略路由实现原理 7、智能策略路由 8、智能策略路由产生背景 9、特性依赖和限制 二...
  • 12、Horizon 域控组策略管理

    千次阅读 2022-03-16 09:02:39
    Horizon 域控组策略管理 Horizon 域控组策略管理 1、简介 2、导入ADM模板 3、链接现有GPO 4、禁止所有客户机使用U盘 5、禁止共享文件和文件夹(驱动器重定向) 6、隐藏客户端菜单栏选项 7、禁用 Horizon Web 文件传输...
  • 一、Redis 过期删除策略类型 我们都知道,Redis 是 key-value 数据库,我们可以设置 Redis 中缓存的 key 的过期时间,而 Redis 的过期策略就是指:当 Redis 中缓存的 key 过期了,Redis 如何处理。 过期策略通常有...
  • 我们知道Redis是分布式内存数据库,基于内存运行,可是有没有想过比较好的服务器内存也不过几百G,能存多少数据呢,当内存占用满了之后该怎么办...不要怕,本篇我们一起来看一下Redis的内存淘汰策略是如何释放内存的。
  • 设计模式之策略模式详解

    千次阅读 2020-12-15 15:22:19
    策略模式 ​ 在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车或自己开私家车等,超市促销可以釆用打折、送商品、送积分等方法。 ​ 在软件开发中也常常遇到类似...
  • 华为策略路由详解

    千次阅读 2021-02-25 15:23:40
    通过配置策略路由,可以用于提高网络的安全性能和负载分担。 策略路由PBR(Policy-Based Routing)是一种依据用户制定的策略进行路由选择的机制。 策略路由与路由策略(Routing Policy)存在以下不同: 策略...
  • 基于Python量化策略 牛市行情下的盈利与风险策略管理 牛市行情下的盈利策略与风险管理 1 项目背景 2 数据探索 2.1数据获取 2.2 数据处理与分析 3盈利策略量化建模与风险管理 3.1 期权看涨策略 3.2...
  • 带你搞懂 Redis 中的两个策略

    千次阅读 2022-03-02 16:45:06
    面试的时候问到候选人 Redis 相关问题时,发现一个现象:一部分候选人分不清 Redis 的「键过期策略」和「内存淘汰策略」。今天就来说一说这老哥俩。 简单来说,过期策略就是当 key 到了指定的过期时间后,Redis 是用...
  • 华为策略路由原理与实验

    千次阅读 2021-01-20 18:32:37
    策略路由PBR是一种依据用户制定的策略进行路由选择的机制,分为本地策略路由、接口策略路由和智能策略路由SPR。本课程仅讨论本地策略路由。 IP单播策略路由具有如下优点: 可以根据用户实际需求制定策略进行路由...
  • Ribbon 内置了 7 种负载均衡策略:轮询策略、权重策略、随机策略、最小连接数策略、重试策略、可用性敏感策略、区域性敏感策略,并且用户可以通过继承 RoundRibbonRule 来实现自定义负载均衡策略。 是非审之于己,...
  • 2、日内策略 日内策略主要是通道突破类策略,除去均线、boll 线,常见日内策略还有Dual Thrust策略、R-Breaker 策略、菲阿里四价策略、空中花园策略等。这几个策略都属于通道突破策略策略的核心都在于通道上下轨...
  • 默认情况下,域中的计算机会在后台每隔 90 分钟更新一次计算机策略和用户策略,并将时间作 0 到 30 分钟的随机调整。除了后台更新之外,在系统启动时总会更新计算机的组策略。 6.5.1示例:配置“计算机配置”刷新...
  • 一文带你理解算法策略

    千次阅读 2022-03-25 00:59:16
    这里,我们介绍以下三种策略:分治策略动态规划策略贪心算法策略01分治策略分治策略就是找到一种方法,将规模较大的问题分解成可以相互独立解决的规模较小的子问题,然后将这些子问题产生的解合并起来,生成问题整体...
  • 策略模式介绍及其具体使用场景

    千次阅读 2021-11-12 17:44:10
    文章目录前言一、策略模式介绍二、具体使用场景1、举例2、传统方式优化3、Map + 函数式编程 优化总结 前言 今天用策略模式优化了下之前的业务代码,重新温习了下设计模式的相关理念,在此记录一下 一、策略模式...
  • 趋势性动量策略有效性验证及实现1相关性验证2策略概要3其他回测结果其他量化策略 1相关性验证 选取上证指数000001.SH,获取收盘价 以50为单位,计算每个55天的收益序列。 使用shift(1),获得滞后一个时间段(50天)...
  • 跟我学ShardingSphere之数据分片策略

    万次阅读 2021-09-02 21:45:47
    跟我学ShardingSphere之数据分片策略
  • win10找不到组策略怎么回事_win10找不到本地组策略的处理方法本地组策略是windows系统中很重要的一个组成部分,在这个设置界面中我们可以对自己的windows系统进行设置和修复。但近日有使用win10系统的用户却说系统的...
  • 【vn.py】量化策略开发

    千次阅读 2019-08-06 15:27:10
    一个完整的量化流程至少需要包括策略开发、历史回测与实盘交易三个步骤,下面就以vn.py为例,先整理一下vn.py中如何进行量化策略的开发。 开发环境 在vn.py的官方教程中使用的IDE是VS Code,这里的IDE没有什么特殊...
  • 全面了解风控策略体系

    万次阅读 多人点赞 2020-06-28 14:09:48
    模型和策略的开发是一个系统工程,这其中需要有业务经验、统计理论、算法运用、和数据认知,是一个不断反思,不断积累经验的过程。沙滩上建不起摩天大楼。扎扎实实的基本功永远有价值,永远不会过时。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,259,927
精华内容 903,970
关键字:

策略