加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

经典量化交易策略系列——线性回归的趋势跟踪系统

(2016-09-08 12:19:52)
标签:

量化交易

交易策略

分类: 交易策略
    本篇通过各个收盘的波峰波谷做简单线性回归拟合出类似的趋势线,然后结合股价以及预测值来跟踪趋势。思路:上升趋势线用波谷拟合,用波峰的值和拟合预测值做比较;下降趋势线用波峰拟合,用波谷的值和拟合预测值做比较。

    注:这种拟合的方式也许信号发出的不一定准确,后续可以加上拟合度置信区间来提高信号的准确性。

收益与风险

源码:

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)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有