请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  数理科学 帖子:3354170 新帖:3

我好像破解了聚宽擂台排第一的策略?!

交易资深人士发表于:5 月 10 日 03:14回复(1)

今天在研究协整,看了文章【量化课堂】基于协整的搬砖策略,大受启发。

我首先试验的也是银行股,不过发现效果并不是很好:

招行和中行

然后我突然想起,策略擂台中排第一的不是名为“招行伊利配对轮动”,我何不将这两个股票拿来一试。

回测一看,发现效果确实不错:

招行和伊利

再一对照资金曲线走势的情况:

简直就和“招行伊利配对轮动”一模一样,甚至效果比它还好。也许是因为回测。

不过问题来了,为啥招行和伊利配对的这么好?

在文章【量化课堂】基于协整的搬砖策略有说:

p 值越低,协整关系就越强

难道招行和伊利是一对反例?或者协整关系强并不意味着效果好?

毕竟招行和中行协整性检验的 p 值是要小于招行和伊利的,你看下图,显然招行(600036.XSHG)和中行(601988.XSHG)的方块更红:

真是令人费解。

协整的重点是选股,但是怎么从A找到B呢?例如看好招行,怎么才能找到伊利呢?

显然Pvalue给不了这个答案,有兴趣的朋友,一起来讨论一下呗。

import numpy as np
import pandas as pd
import statsmodels.api as sm
import seaborn as sns
# 输入是一DataFrame,每一列是一支股票在每一日的价格
def find_cointegrated_pairs(dataframe):
    # 得到DataFrame长度
    n = dataframe.shape[1]
    # 初始化p值矩阵
    pvalue_matrix = np.ones((n, n))
    # 抽取列的名称
    keys = dataframe.keys()
    # 初始化强协整组
    pairs = []
    # 对于每一个i
    for i in range(n):
        # 对于大于i的j
        for j in range(i+1, n):
            # 获取相应的两只股票的价格Series
            stock1 = dataframe[keys[i]]
            stock2 = dataframe[keys[j]]
            # 分析它们的协整关系
            result = sm.tsa.stattools.coint(stock1, stock2)
            # 取出并记录p值
            pvalue = result[1]
            pvalue_matrix[i, j] = pvalue
            # 如果p值小于0.05
            if pvalue < 0.05:
                # 记录股票对和相应的p值
                pairs.append((keys[i], keys[j], pvalue))
    # 返回结果
    return pvalue_matrix, pairs
# 伊利、招行
stock_list = ['600887.XSHG','600036.XSHG','601988.XSHG']
prices_df = get_price(stock_list, start_date="2017-01-01", end_date="2018-01-01", frequency="daily", fields=["close"])["close"]
pvalues, pairs = find_cointegrated_pairs(prices_df)
sns.heatmap(1-pvalues, xticklabels=stock_list, yticklabels=stock_list, cmap='RdYlGn_r', mask = (pvalues == 1))
print pvalues
[[ 1.          0.81192941  0.93608065]
 [ 1.          1.          0.6635496 ]
 [ 1.          1.          1.        ]]

伊利和招行¶

stock_df1 = prices_df["600887.XSHG"]
stock_df2 = prices_df["600036.XSHG"]
plot(stock_df1); plot(stock_df2)
plt.xlabel("Time"); plt.ylabel("Price")
plt.legend(["600887.XSHG", "600036.XSHG"],loc='best')
<matplotlib.legend.Legend at 0x7fd2fdb672d0>

中行和招行¶

stock_df1 = prices_df["601988.XSHG"]
stock_df2 = prices_df["600036.XSHG"]
plot(stock_df1); plot(stock_df2)
plt.xlabel("Time"); plt.ylabel("Price")
plt.legend(["601988.XSHG", "600036.XSHG"],loc='best')
<matplotlib.legend.Legend at 0x7fd30749ad50>

全部回复

0/140

量化课程

    移动端课程