首先,历史前五日的Pearson相关系数若大于给定的阈值。
如果两只股票走势趋同,则按上涨(下跌)趋势买入(卖出)股票。
如果两只股票走势背离,则买入下跌股票,卖出上涨股票。
首先需要在A股中寻找走势相关性很大的股票,这是一项很繁复的工作。为简单起见,这里直接使用了一个现成的结果:000159和000967在2012年的走势十分相似,这一点可以通过复权收盘价曲线来验证。
df = DataAPI.MktEqudAdjGet(secID = '000159.XSHE', field = 'closePrice', beginDate = '20120101', endDate = '20130101')
df['000159'] = df['closePrice']
df = df.loc[:, ['000159']].reset_index()
df2 = DataAPI.MktEqudAdjGet(secID = '000967.XSHE', field = 'closePrice', beginDate = '20120101', endDate = '20130101')
df2['000967'] = df2['closePrice']
df2 = df2.loc[:, ['000967']].reset_index()
df = df.merge(df2, left_on=['index'], right_on=['index'])
df = df.loc[:, ['000159', '000967']]
df.plot()
df['000159'] = df['closePrice']
df = df.loc[:, ['000159']].reset_index()
df2 = DataAPI.MktEqudAdjGet(secID = '000967.XSHE', field = 'closePrice', beginDate = '20120101', endDate = '20130101')
df2['000967'] = df2['closePrice']
df2 = df2.loc[:, ['000967']].reset_index()
df = df.merge(df2, left_on=['index'], right_on=['index'])
df = df.loc[:, ['000159', '000967']]
df.plot()
回测:
from scipy.stats.stats import pearsonr
start = '2013-01-01'
end = '2014-01-01'
benchmark = 'HS300'
universe = ['000159.XSHE', '000967.XSHE']
capital_base = 1000000
end = '2014-01-01'
benchmark = 'HS300'
universe = ['000159.XSHE', '000967.XSHE']
capital_base = 1000000
def initialize(account):
account.cutoff = 0.9
account.prev_prc1 = 0
account.prev_prc2 = 0
account.prev_prcb = 0
account.cutoff = 0.9
account.prev_prc1 = 0
account.prev_prc2 = 0
account.prev_prcb = 0
def handle_data(account):
if len(account.universe) < 2: return
clsp = account.get_attribute_history('closePrice', 5)
stk1, stk2 = universe
px1, px2 = clsp[stk1], clsp[stk2]
prc1, prc2 = px1[-1], px2[-1]
prcb = account.get_symbol_history('benchmark', 1)['return'][0]
if account.prev_prc1 == 0:
if len(account.universe) < 2: return
clsp = account.get_attribute_history('closePrice', 5)
stk1, stk2 = universe
px1, px2 = clsp[stk1], clsp[stk2]
prc1, prc2 = px1[-1], px2[-1]
prcb = account.get_symbol_history('benchmark', 1)['return'][0]
if account.prev_prc1 == 0: