金融市场量化交易配对策略(一):寻找配对股票(基于聚宽python2.7平台)

需要基础金融理论知识、python numpy、pandas库知识

量化交易

        以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定策略,极大地减少了投资者情绪波动的影响,避免在市场极度狂热或悲观的情况下作出非理性的投资决策。以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定策略,极大地减少了投资者情绪波动的影响,避免在市场极度狂热或悲观的情况下作出非理性的投资决策。

配对交易

        是指八十年代中期华尔街著名投行Morgan Stanley的数量交易员Nunzio Tartaglia成立的一个数量分析团队提出的一种市场中性投资策略,,其成员主要是物理学家、数学家、以及计算机学家。
  Ganapathy Vidyamurthy在《Pairs Trading: Quantitative Methods and Analysis》一书中定义配对交易为两种类型:一类是基于统计套利的配对交易,一类是基于风险套利的配对交易。

  基于统计套利的配对交易策略是一种市场中性策略,具体的说,是指从市场上找出历史股价走势相近的股票进行配对,当配对的股票价格差(Spreads)偏离历史均值时,则做空股价较高的股票同时买进股价较低的股票,等待他们回归到长期均衡关系,由此赚取两股票价格收敛的报酬。    

                                                                                                                                ——MBA智库

配对交易的原理

        配对交易策略的基本原理是基于两个相关性较高的股票或者其他证券,如果在未来时期保持着良好的相关性,一旦两者之间出现了背离的走势,且这种背离在未来是会得到纠正的,那么就可能产生套利的机会。对于配对交易的实践而言,如果两个相关性较高的股票或者其他证券之间出现背离,就应该买进表现相对较差的,卖出表现相对较好的。当未来两者之间的背离得到纠正,那么可以进行相反的平仓操作来获取利润。

  由于配对交易利用配对间的短期错误定价,通过持有相对低估,卖空相对高估,因此其本质上是一个反转投资策略,其核心是学术文献中的股票价格均值回复。尽管配对交易策略非常简单,但却被广泛应用,其之所以能被广泛应用的主要原因是:首先,配对交易的收益与市场相独立,即市场中性,也就是说它与市场的上涨或者下跌无关;其次,其收益的波动性相对较小;第三,其收益相对稳定。

                                                                                                                                ——MBA智库

最小距离法

        P ti(t=0,1,2…T)表示股票i在第t天的价格,则单期收益率:

                            

            t天内积累的收益率:

                            

            标准化价格偏差平方和:

                            

完成代码

计算SSD函数

def SSD(priceX,priceY):
    #都为pd.dataframe
    if priceX is None or priceY is None:
        print('缺少价格序列')
    returnX=(priceX-priceX.shift(1))/priceX.shift(1)[1:]
    returnY=(priceY-priceY.shift(1))/priceY.shift(1)[1:]
    standardX=(returnX+1).cumprod()
    standardY=(returnY+1).cumprod()
    SSD=np.sum((standardX-standardY)**2)
    return(SSD)

选取“酒、饮料和精制茶制造业” 行业成分股的几十支股票

stocks = get_industry_stocks('C15')

对某两支股票过去360个交易日内收盘价进行统计

h1 = attribute_history(stocks[i], 360, '1d', ('close'))
h2 = attribute_history(stocks[j], 360, '1d', ('close'))

在股票池中循环比较、排序输出

完整代码

import jqdata

def initialize(context):
    stocks = get_industry_stocks('C15')
    ssds={}
    for i in range(len(stocks)-1):
        for j in range(i+1,len(stocks)):
            h1 = attribute_history(stocks[i], 360, '1d', ('close'))
            h2 = attribute_history(stocks[j], 360, '1d', ('close'))
            dis=SSD(h1,h2)['close']
            ssds[stocks[i]+','+stocks[j]]=dis
            #print dis['close']
            #print type(dis['close'])
    
    
    for k,v in sorted(ssds.items(),key = lambda x:x[1]):
        print k+' '+str(v)

def SSD(priceX,priceY):
    if priceX is None or priceY is None:
        print('缺少价格序列')
    returnX=(priceX-priceX.shift(1))/priceX.shift(1)[1:]
    returnY=(priceY-priceY.shift(1))/priceY.shift(1)[1:]
    standardX=(returnX+1).cumprod()
    standardY=(returnY+1).cumprod()
    SSD=np.sum((standardX-standardY)**2)
    return(SSD)
    
def handle_data(context,data):
    pass

部分结果:


得到最适合用来配对的为 中葡股份600084 和 养元饮品603156

接着即可以进行进一步工作。



猜你喜欢

转载自blog.csdn.net/htgt_tuntuntun/article/details/80814146