个股、指数:相关系数计算:backtrader系列实盘课件

个股、指数:相关系数计算:backtrader系列实盘课件

本课件摘自:《backtrader系列实盘课件》–F系列

自挑选股票池pools,以及量化分析时,经常需要计算不同个股之间,以及个股与各种指数之间的关联性参数。

这其中:Pearson相关系数 ,是一种最参见的分析模式。
Pearson相关系数 ,  (Pearson CorrelationCoefficient)是用来衡量两个数据集合是否在一条线上面,它用来衡量定距变量间的线性关系。

本案例,介绍如何使用backtrader计算个股、指数之间的Pearson相关系数 ,以及相关的分析图表,具体源码参见文章尾部。

以下是案例运行结果:

#1,上证指数000001,和个股002046的关联性分析图表
Pearson相关系数 ,参见图形最下面一列曲线。

#2,上证指数000001,和上证50指数000016的关联性分析图表
Pearson相关系数 ,参见图形最下面一列曲线。

由于backtrader设计非常灵活,以上图表分析,虽然属于扩展课题,但是无需过多编程,只需要定义两个简单的class类函数,即可调用backtrader量化平台,完成相关分析。
PearsonR类,定义关联性函数,大家可以参考以下源码,采用其他关联计算函数:

class PearsonR(bt.ind.PeriodN):
       _mindatas = 2 # hint to the platform

       lines = ('correlation',)
       params = (('period', 20),)

       def next(self):
              c, p, = scipy.stats.pearsonr(self.data0.get(size=self.p.period),
              self.data1.get(size=self.p.period))

              self.lines.correlation[0] = c

还有一个,就是简化的策略类定义,官方blog是ma_cross策略模板,名为改为:sta_pear皮艾尔策略
class sta_pear(bt.Strategy):
             params = (
                          ('ma', bt.ind.MovAv.SMA),
                          ('pd1', 20),
                          ('pd2', 20),
                          )

             def __init__(self):
                          ma1 = self.p.ma(self.data0, period=self.p.pd1, subplot=True)
                          self.p.ma(self.data1, period=self.p.pd2, plotmaster=ma1)
                          PearsonR(self.data0, self.data1)
                          #
                          self.data1.plotinfo.plotmaster = self.data0

 


全部源码如下:

# -*- coding: utf-8 -*-
”’
TopQuant-TQ极宽智能量化回溯分析系统
培训课件系列 2019版

Top极宽量化(原zw量化),Python量化第一品牌
by Top极宽·量化开源团队 2019.01.011 首发

网站: www.TopQuant.vip www.ziwang.com
QQ群: Top极宽量化总群,124134140

”’
#

import sys;
sys.path.append(“topqt/”)
#
import os,time,arrow,math,random,pytz
import numpy as np
import pandas as pd
import datetime as dt
import logging

import matplotlib as mpl
import matplotlib.pyplot as plt

#
import scipy.stats
#
import backtrader as bt
import topquant2019 as tq

#

#———————-

class PearsonR(bt.ind.PeriodN):
_mindatas = 2 # hint to the platform

lines = (‘correlation’,)
params = ((‘period’, 20),)

def next(self):
c, p, = scipy.stats.pearsonr(self.data0.get(size=self.p.period),
self.data1.get(size=self.p.period))

self.lines.correlation[0] = c

class sta_pear(bt.Strategy):
params = (
(‘ma’, bt.ind.MovAv.SMA),
(‘pd1’, 20),
(‘pd2’, 20),
)

def __init__(self):
ma1 = self.p.ma(self.data0, period=self.p.pd1, subplot=True)
self.p.ma(self.data1, period=self.p.pd2, plotmaster=ma1)
PearsonR(self.data0, self.data1)
#
self.data1.plotinfo.plotmaster = self.data0

#———————-

print(‘\n#1,数值数据’)
rs0=’data/’ #
rs0=’/TQDat/’
rs0=’/TQDat/day/’
rdat=rs0+’stk/’
rbas=rs0+’inx/’
tim0str,tim9str=’2018-01-01′,’2018-12-31′
#tim0str,tim9str=”,”
#
#
# 000001,100,2,上证指数,2605.8876953125,sh,index_cn
# 000016,100,2,上证50,2430.722412109375,sh,index_cn
# 399300,100,2,沪深300,3181.564697265625,sz,index_cn
#
#baslst=[‘000001′,’000016’]
#————
baslst=[‘000001’]
syblst=[‘002046’]
qx=tq.tq_init(‘tq01’)
#
tq.pools_get4flst(qx,rbas,baslst,tim0str,tim9str,fgInx=True)
tq.pools_get4flst(qx,rdat,syblst,tim0str,tim9str,fgInx=False)

tq.bt_set(qx)
#
print(‘\n#2-1,添加自定义分析指标:LegDownUpAnalyzer’)
#–anz.diy
#qx.cb.addanalyzer(LegDownUpAnalyzer, _name=’legdown’)
#
print(‘\n#2-2,添加回测策略:ma_cross’)
qx.cb.addstrategy(sta_pear)

#
print(‘\n#3,调用回溯测试主程序:run’)
qx.bt_results= qx.cb.run()
#
#
print(‘\n#8,根据回测数据,绘制分析图表’)
qx.cb.plot(volume=False)

#
print(‘\n#9,分析自定义分析指标:legdown’)
#tq.bt_anz(qx)

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注