【徒手写机器学习算法】【投资子栏】期货协整套利的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hanss2/article/details/82503299

【徒手写机器学习算法】【投资子栏】期货协整套利的实现


这里写图片描述


写作动机

很久没更【徒手写机器学习算法】这个专栏了,感觉主要是C++徒手写,加上本人代码水平也不高,看的人也不多,最近也在研究套利模型的实现,刚好之前用的期货接口也是C++写的,就用C++演示一下策略怎么写。由于之前的期货交易代码属于我之前实习工作过的私募公司,故只放出策略函数的写法。


协整套利简介[model]

统计套利在方法上可以分为两类,一类是利用股票的收益率序列建模,目标是在组合的β值等于零的前提下实现Alpha收益,称为声中性策略;另一类是利用股票的价格序列的协整关系建模,称为协整策略。(这是丁鹏那本量化投资里说的。。。)

协整套利本是股票策略(参考人大论坛wallstreetcat的介绍)首先,我们构造一个读取股票价格,判断协整关系的函数。该函数返回的两个值分别为协整性检验的 β 值矩阵以及所有传入的参数中协整性较强的股票对。我们不需要在意 β 值具体是什么,可以这么理解它: β 值越低,协整关系就越强; β 值低于 0.05 时,协整关系便非常强。

两只股票价格的协整模型可以表示为:

P a , t = α + β P b , t + ϵ t

一般来说 β 大于 0.85 就是相关性比较好的,其实你可以认为这就是一个线性映射模型。这里 β 就是两个股票空间之间的Embedding矩阵。


编程实现[code]

#pragma once
#include <vector>
#include "CTP_API/ThostFtdcMdApi.h"
#include <iostream>
#include <fstream>
#include <unordered_map>
#include "CustomMdSpi.h"
#include "TickToKlineHelper.h"
#include "redis_data_helper.hpp"
#include <string.h>

// ---- 全局参数声明 ---- //
extern CThostFtdcMdApi *g_pMdUserApi;            // 行情指针
extern char gMdFrontAddr[];                      // 模拟行情前置地址
extern TThostFtdcBrokerIDType gBrokerID;         // 模拟经纪商代码
extern TThostFtdcInvestorIDType gInvesterID;     // 投资者账户名
extern TThostFtdcPasswordType gInvesterPassword; // 投资者密码
extern char *g_pInstrumentID[];                  // 行情合约代码列表,中、上、大、郑交易所各选一种
extern int instrumentNum;                        // 行情合约订阅数量
extern std::unordered_map<std::string, TickToKlineHelper> g_KlineHash; // k线存储表
Redis *redis_conn = new Redis();
redis_conn->connect("127.0.0.1", 6379);


data::CFMA_RES* CFMA(data::dataframe dt)
{
    //得到DataFrame长度;
    int n = dt.shape[1];
    //初始化p值矩阵;
    pvalue_matrix = data::ones((n, n));
    //抽取列的名称;
    keys = dt.keys();
    //初始化强协整组;
    std::vector<data::turple> pairs;
    //对于每一个i;
    for (int i = 0; i < n; ++i)
    {   
        //对于大于i的j;
        for (int j = i+1; j < n; ++j)
        {    
            //获取相应的两只期货的价格Series;
            stock1 = dt[keys[i]];
            stock2 = dt[keys[j]];
            //分析它们的协整关系;
            result = data::coint(stock1, stock2);
            //取出并记录p值;
            pvalue = result[1];
            pvalue_matrix[i][j] = pvalue;
            //如果p值小于0.05;
            if(pvalue < 0.05)
            {
                //记录期货对和相应的p值;
                pairs.push_back(new data::turple(keys[i], keys[j], pvalue));
            }    
        }
    }
    //返回结果;
    return new data::CFMA_RES(pvalue_matrix, pairs);
}

};

猜你喜欢

转载自blog.csdn.net/hanss2/article/details/82503299