#线性回归策略
# Import libraries
import numpy as np
import pandas as pd
from statsmodels import regression
import statsmodels.api as sm
import matplotlib.pyplot as plt
import math
#编写线性回归函数
def linreg(X, Y):
# Running the linear regression
X = sm.add_constant(X)
model = regression.linear_model.OLS(Y, X).fit()
a = model.params[0]
b = model.params[1]
X = X[:, 1]
# Return summary of the regression and plot results
X2 = np.linspace(X.min(), X.max(), 100)
Y_hat = X2 * b + a
plt.scatter(X, Y, alpha=0.3) # Plot the raw data
plt.plot(X2, Y_hat, 'r', alpha=0.9); # Add the regression line, colored in red
plt.xlabel('X Value')
plt.ylabel('Y Value')
return b
def get_beita(benchmark,asset):
#基于stock2=a+b*stock1
asset['ret_asset']=(asset['closePrice']-asset['closePrice'].shift(1))/asset['closePrice']
benchmark['ret_benchmark']=(benchmark['closePrice']-benchmark['closePrice'].shift(1))/benchmark['closePrice']
asset_ret=asset['ret_asset'][1:len(asset)]
benchmark_ret=benchmark['ret_benchmark'][1:len(benchmark)]
b=linreg(asset_ret.values, benchmark_ret.values)
return b
########################################################################################################
start = '2017-05-04' # 回测起始时间
end = '2017-05-04' # 回测结束时间
universe =set_universe("SH50") # 证券池,支持股票和基金
capital_base = 100000 # 起始资金
freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
refresh_rate = 1 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟
max_history_window=600
def initialize(account): # 初始化虚拟账户状态
pass
def handle_data(account):
df=pd.DataFrame()
for stock in account.universe:
asset=pd.DataFrame(account.get_history(600)[stock])
value=[]
for stock1 in account.universe:
benchmark=pd.DataFrame(account.get_history(600)[stock1])
b=get_beita(benchmark,asset)
value.append(b)
df[stock]=pd.Series(value)
df.index=account.universe
print df