Crypto Market Maker Project: 做市商 高频交易 回测

Posted wiger321

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Crypto Market Maker Project: 做市商 高频交易 回测相关的知识,希望对你有一定的参考价值。

持续更新: Wechat: Wiger123

高频框架

回测框架

框架名称简介评测
pandas自己写向量化回测纯自己造轮子,对代码能力和数学能力要求很高,资料比较少,但是速度非常快,自定义程度很高,实测双均线策略,14w行的k线数据 0.05秒就能测完,如果代码没写错的话回测结果和vectorbt是一样的。
backtraderpython的事件驱动回测,指标计算可以是向量化计算14w行k线数据,双均线策略,跑大概30秒左右,其中15秒是在加载数据,15秒运行回测,速度可以说是里面最慢的了,但是在python的事件驱动框架里又算快的了。自定义程度很高,而且不用自己造轮子,回测代码非常简洁且逻辑清晰,文档非常详细,而且有大量的例子,甚至有论坛,可以说是这几个里面对用户最友好的框架了!这点非常重要,因为一个框架如果非常难用,上手很难的话,即使性能很优秀我觉得也不能算是一个优秀的开源框架。缺点:在回测大量数据时速度比较慢,不算致命缺点,但是很难受。
vectorbtpython向量化回测框架14w行数据7秒跑完,速度算比较快了,但是作为一个向量化回测的框架,说实话这个成绩我不太满意。vectorbt的文档还算详细,但是还是远远不如backtrader的回测代码写起来也比较简单,缺点是画图分析比backtrader要差很多,代码基本得自己写。
hikyuuC++内核 python接口的回测框架国产框架,速度极快,百万级别的K线,2秒就能跑完,缺点是基本上只支持国内的股票数据,自定义数据很困难,而且可以说是几乎没有文档,可能是因为作者比较忙。我的水平比较低,看了几个例子和官网的文档之后仍然没能够上手。如果是高手的话可以去看看这个框架,速度相当快,我之后准备研究一下他的源码。回测的代码很简洁,但是局限性比较大,且上手略难。
wondertraderC/C++内核 python接口的回测框架
vnpy国产经典像是backtrader的强化版本,不过我还没用过,之前想去学但是感觉很复杂,资料也不如backtrader有条理,但是最大的优点是有UI界面,适合小白,且实盘对接做的很好。但是据说回测是不如backtrader的,如果有技术,可以用backtrader回测,用vnpy下单
quantconnect(LEAN)最近又尝试了一下新的框架,LEAN,好处是集回测和实盘于一体,且代码非常简洁易懂,文档和教程非常详细,感觉比vnpy好上手很多(可能我太菜了,vnpy当时看了两天没啥头绪)而且编程思路和backtrader很像,因此我上手也很快。最关键的是集回测和实盘于一体,且有好的社区,C#核心代码,python接口,数据也很方便获取。回测速度相当快,不太复杂的策略基本上是每秒20-80k行k线这个水平,15w行k线一两秒秒就跑完了,速度在这几个里面堪称无敌。
  • 总结: 如果是小白或者数据量不是特别大,而且对回测速度没有特别高的要求建议使用 backtrader,教程、资料相比其他框架多得多,上手会简单很多。vectorbt 看起来速度很快,但是实测速度也就这样,可能是我测试的问题,如果有人测出了和我不一样的结果可以留言评论。如果是玩国内的股票期货,那可以考虑后面两个国产框架,对国内有优化,对其他的不太友好。如果对速度有要求,那就去自己写向量化吧,或者自己用 C++ 写,和 hikyuu 一样,hikyuu 的速度是真的快,我准备之后慢慢研究他的源码,看看为啥这么快,然后让他变得更好用一些。

个人感受

  • 去年研究了一段时间强化学习做市商, 复现了两篇 paper (参考了作者源代码 github: https://github.com/sadighian/crypto-rl), 感觉效果不好
  • 根据寒假实习学到的情况, 未来几个月的设想在下面的研究计划里

研究计划

  • 做市商算法
  • 高频算法
  • 交易框架
  • 回测系统
  • 因子: cex + dex: ticker 5 + trade + web3 + …
  • 模型

参考引用

  • 量化橙同学

java对称加密AES加入偏移量

直接上demo

package com.bee.ms.market.utils;

import lombok.extern.slf4j.Slf4j;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

@Slf4j
public class MarketPasswordUtil 

    //偏移量,AES 为16bytes. DES 为8bytes
    private static final String IV = "xxxx20220610xxxx";

    //私钥,AES固定格式为128/192/256 bits.即:16/24/32bytes。DES固定格式为64bits,即8bytes。
    private static final String AES_KEY="xxxx20220610xxxx";

    //填充类型,DES加密把前面的AES改成DES即可
    public static final String AES_TYPE = "AES/CBC/PKCS5Padding";


    public static String encode(String password)
        try 

            IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
            //两个参数,第一个为私钥字节数组, 第二个为加密方式 AES或者DES
            SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), "AES");

            Cipher cipher = Cipher.getInstance(AES_TYPE);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
            //PKCS5Padding比PKCS7Padding效率高,PKCS7Padding可支持IOS加解密
            //初始化,此方法可以采用三种方式,按加密算法要求来添加。
            // (1)无第三个参数
            // (2)第三个参数为SecureRandom random = new SecureRandom();中random对象,随机数。(AES不可采用这种方法)
            // (3)采用此代码中的IVParameterSpec(ECB不能使用偏移量)
            //加密时使用:ENCRYPT_MODE;  解密时使用:DECRYPT_MODE;

            byte[] encryptedData = cipher.doFinal(password.getBytes());

            return Base64.getEncoder().encodeToString(encryptedData);
         catch (Exception e) 
            log.error("Exception:", e.getMessage());
            return null;
        
    


    public static String decode(String encodePassword)
        try 
            byte[] decodeByte = Base64.getDecoder().decode(encodePassword);

            IvParameterSpec ivParameterSpec = new IvParameterSpec(IV.getBytes());
            SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), "AES");

            Cipher cipher = Cipher.getInstance(AES_TYPE);

			//解密模式
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);

            byte[] bytes = cipher.doFinal(decodeByte);
            return new String(bytes);
         catch (Exception e) 
            e.printStackTrace();
            log.error("Exception", e.getMessage());
            return null;
        
    


AES加密类别

算法/模式/填充                 字节加密后数据长度       	不满16字节加密后长度  
AES/CBC/NoPadding                   16                          不支持  
AES/CBC/PKCS5Padding                32                          16  
AES/CBC/ISO10126Padding             32                          16  
AES/CFB/NoPadding                   16                          原始数据长度  
AES/CFB/PKCS5Padding                32                          16  
AES/CFB/ISO10126Padding             32                          16  
AES/ECB/NoPadding                   16                          不支持  
AES/ECB/PKCS5Padding                32                          16  
AES/ECB/ISO10126Padding             32                          16  
AES/OFB/NoPadding                   16                          原始数据长度  
AES/OFB/PKCS5Padding                32                          16  
AES/OFB/ISO10126Padding             32                          16  
AES/PCBC/NoPadding                  16                          不支持  
AES/PCBC/PKCS5Padding               32                          16  
AES/PCBC/ISO10126Padding            32                          16  

使用偏移量的时候遇到的异常记录

  1. AES 加密报错:java.security.InvalidAlgorithmParameterException: ECB mode cannot use IV https://www.cnblogs.com/goloving/p/15579655.html

参考了大佬的博文
https://www.cnblogs.com/xiaowangxiao/p/11416713.html

以上是关于Crypto Market Maker Project: 做市商 高频交易 回测的主要内容,如果未能解决你的问题,请参考以下文章

movie maker是啥软件

rpg maker mv 能不能制作中文游戏

sursen maker是啥软件

在哪能下到movie maker或和这同类的软件啊?

调用百度地图 API 移动地图时 maker 始终在地图中间 并根据maker 经纬度 返回地址

RPG Maker MV游戏解包