本篇通过各个收盘的波峰波谷做简单线性回归拟合出类似的趋势线,然后结合股价以及预测值来跟踪趋势。思路:上升趋势线用波谷拟合,用波峰的值和拟合预测值做比较;下降趋势线用波峰拟合,用波谷的值和拟合预测值做比较。
注:这种拟合的方式也许信号发出的不一定准确,后续可以加上拟合度置信区间来提高信号的准确性。
收益与风险
源码:
from datetime import datetime, timedelta
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
# 定义一个全局变量, 保存要操作的证券
security = '510180.XSHG'
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
set_universe([security])
arraySplitNum = 5
def initialize(context):
g.fixedStartDate =
datetime(2000,1,1)
g.peakPrice =
pd.DataFrame(columns=['xDays', 'yPrice', 'tDate'])
g.throughPrice =
pd.DataFrame(columns=['xDays', 'yPrice', 'tDate'])
g.priceBuy = 0.0
# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def handle_data(context, data):
hData = history(3, '1d',
'close', [security])
hData.columns =
['close']
pLen =
len(g.peakPrice)
tLen =
len(g.throughPrice)
# 计算相对时间变量
xDays =
(context.current_dt - g.fixedStartDate).days - 1
if hData.iloc[-2].close
>= hData.iloc[-3].close \
and hData.iloc[-1].close
<= hData.iloc[-2].close:
# 这是波峰
g.peakPrice.loc[pLen] = [xDays,
hData.iloc[-2].close, context.current_dt +
timedelta(days=-1)]
elif
hData.iloc[-2].close <= hData.iloc[-3].close \
and hData.iloc[-1].close
>= hData.iloc[-2].close:
# 这是波谷
g.throughPrice.loc[tLen] = [xDays,
hData.iloc[-2].close, context.current_dt +
timedelta(days=-1)]
pricePredictP =
data[security].pre_close
pricePredictT =
data[security].pre_close
lastPePrice =
pricePredictP
lastThPrice =
pricePredictT
pLen =
len(g.peakPrice)
tLen =
len(g.throughPrice)
if
pLen > 1 :
# Create linear regression object
regrP = linear_model.LinearRegression()
# Train the model using the training sets
regrP.fit(np.reshape(g.peakPrice.xDays.values,
pLen).reshape(pLen,1), g.peakPrice.yPrice.values)
pricePredictP = regrP.predict(xDays)
lastPePrice = g.peakPrice.ix[pLen -
1].yPrice
if
tLen > 1 :
# Create linear regression object
regrT = linear_model.LinearRegression()
# Train the model using the training sets
regrT.fit(np.reshape(g.throughPrice.xDays.values,
tLen).reshape(tLen,1), g.throughPrice.yPrice.values)
pricePredictT = regrT.predict(xDays)
lastThPrice = g.throughPrice.ix[tLen -
1].yPrice
bsFlag = ''
lastClosePrice =
data[security].pre_close
if lastClosePrice >
pricePredictP or lastThPrice > pricePredictP:
bsFlag = '+'
elif lastClosePrice <
pricePredictT or lastPePrice < pricePredictT:
bsFlag = '-'
# 取得当前价格
current_price =
data[security].open
# 取得当前的现金
cash =
context.portfolio.cash
if bsFlag == '+' and
g.priceBuy == 0 :
# 全仓买入
# 计算可以买多少只股票
number_of_shares = int(cash/current_price)
# 购买量大于0时,下单
if number_of_shares > 0:
#
买入股票
order(security, +number_of_shares)
g.priceBuy
= current_price
#
记录这次买入
log.info(str(context.current_dt) + " Buying %s" % (security))
#g.peakPrice = pd.DataFrame(columns=['xDays',
'yPrice', 'tDate'])
elif bsFlag == '-' and
g.priceBuy > 0 :
# 清仓卖出
# 卖出所有股票,使这只股票的最终持有量为0
order_target(security, 0)
g.priceBuy = 0.0
g.throughPrice = pd.DataFrame(columns=['xDays',
'yPrice', 'tDate'])
# 记录这次卖出
log.info(str(context.current_dt) + " Selling %s"
% (security))
#record(closeP=data[security].close)
record(peakP=pricePredictP)
record(throughP=pricePredictT)
#record(lastThP=lastThPrice)
#record(peakP=pricePredictP)
加载中,请稍候......