量化策略:驾驭交易之轴心点研究(一)

  • 最近在《驾驭交易》这本书时,发现个比较有意思的轴心点策略,基本原理跟常用的技术黄金分割线很像,都是来标识重要支撑和阻力位,非常适合短线交易者使用。
    本篇文章主要尝试在中国股市基于日线级别做策略尝试研究,百度了下关于轴心点的策略公式定义版本很多,百度百科外汇轴心点定义为:
    轴心点 :
    (PP) = (High + Low + Close) / 3
    第一级支撑和阻力位:
    第一支撑位 (S1) = (2 * PP)– High
    第一阻力位 (R1) = (2 * PP) – Low
    第二级支撑和阻力位:
    第二支撑位 (S2) = PP – (High– Low)
    第二阻力位 (R2) = PP + (High –Low)
    《驾驭交易》书中多了一个第三级支撑位和阻力位(吐槽一下:关于轴心点定义书里居然写错了,不知道翻译的问题,还是原书就错了)
    第三级支撑和阻力位:
    第三支撑位(S3) = S1 – (High – Low)
    第三阻力位 (R3) = R1 + (High –Low)
    话不多说,还是撸代码了。。。
  1. 定义策略公式
def get_piovt_points(high,low,close):
    #计算轴心
    #驾驭交易计算公式:轴心点=(最高价+最低价+收盘价)/3
    pp=round((high+low+close)/3,2)
    #驾驭交易计算公式:阻力1=2*轴心-最低价   
    obs1=round(pp*2-low,2)
    #驾驭交易计算公式:阻力2=轴心+(最高价-最低价)
    obs2=round(pp+(high-low),2) 
    #驾驭交易计算公式:阻力3=阻力1+(最高价-最低价)
    obs3=round(obs1+(high-low),2)
    #驾驭交易计算公式:支撑1=2*轴心-最高价
    cru1=round(pp*2-high,2)
    #驾驭交易计算公式:支撑2=轴心-(最高价-最低价)
    cru2=round(pp-(high-low),2)
    #驾驭交易计算公式:支撑3=支撑1-(最高价-最低价)
    cru3=round(cru1-(high-low),2)
    return [pp,obs1,obs2,obs3,cru1,cru2,cru3]
  1. 基于常用的Tuhare数据包获取,计算轴心点,支撑位和阻力位
def get_data(code,year):
    #获取测试数据
    cons = ts.get_apis()
    sdate=year+'-01-01'
    edate=year+'-12-31'
    #周DF
    wdf=ts.bar(code, conn=cons,freq="W",start_date=sdate, end_date=edate)
    wdf=wdf.sort_index()
    wdata=np.array(wdf.loc[:,['high','low','close']]).tolist()
    wpp=[get_piovt_points(i[0],i[1],i[2]) for i in wdata ]
    #填头去尾规避数据修补周5问题
    wpp.insert(0,[0.0,0.0,0.0,0.0,0.0,0.0,0.0])
    wpp=wpp[:-1]
    #生成周PP的DF
    windex=wdf.index.values
    wcolumns=['wpp','wobs1','wobs2','wobs3','wcru1','wcru2','wcru3']
    wdf=pd.DataFrame(wpp,index=windex,columns=wcolumns)
    #日DF
    ddf=ts.bar(code, conn=cons,freq="D",start_date=sdate, end_date=edate)
    ddf=ddf.sort_index()
    result = pd.concat([ddf,wdf],axis=1)
    #数据修补,将Nan的PP数据进行填充
    result=result.fillna(method="bfill")
    #剔除开始无法计算PP数据
    result=result[result.wpp>0.0]
    return result

此段代码主要是计算了周线图的周线图的轴心点,支撑位和阻力位,跟日线数据合并时数据修复时,填补周一到周五的轴心点数据,发现周五数据错位,所以采取填头去尾规避数据修补周5问题(wpp.insert(0,[0.0,0.0,0.0,0.0,0.0,0.0,0.0]),wpp=wpp[:-1]),如果大家有别的好的方法可以给我下意见,非常感谢。

  1. 所需要的数据计算完了,该是最有意思的画图了。
    yearlt=['2011','2012','2013','2014','2015','2016','2017']
    codelt=ts.get_concept_classified()
    codelt=np.array(codelt['code']).tolist()
    year=choice(yearlt)
    #print (year)
    code=choice(codelt)
    #print (code)
    df=get_data(code,year)
    #print (df)
    # 对tushare获取到的数据转换成candlestick_ohlc()方法可读取的格式
    data_list = []
    for dates,row in df.iterrows():
        #print (dates,row)
        #print (type(dates))
        # 将时间转换为数字
        date_time =dates.date() #datetime.datetime.strptime(dates.date().strftime('%Y-%m-%d'),'%Y-%m-%d')
        t = date2num(date_time)
        open,close,high,low = row[1:5]
        datas = (t,open,high,low,close)
        data_list.append(datas)
    # 创建子图
    print ('1111111111')
    plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 #有效
    plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 
    fig, ax = plt.subplots()
    fig.subplots_adjust(bottom=0.2)
    # 设置X轴刻度为日期时间
    ax.xaxis_date()
    plt.xticks(rotation=45)
    plt.yticks()
    plt.title(u"股票代码:"+code)
    plt.xlabel(u"时间")
    plt.ylabel(u"股价(元)")
    candlestick_ohlc(ax,data_list,width=1.5,colorup='r',colordown='green')
    df['wpp'].plot(color = 'green',label='wpp')
    df['wobs1'].plot(color = 'skyblue',label='wobs1')
    df['wobs2'].plot(color = 'skyblue',label='wobs2')
    df['wobs3'].plot(color = 'skyblue',label='wobs3')
    df['wcru1'].plot(color = 'red',label='wcru1')
    df['wcru2'].plot(color = 'red',label='wcru2')
    df['wcru3'].plot(color = 'red',label='wcru3')
    plt.grid()    
    plt.show()

策略回测主要使用2011年——2017年的股市数据,股票代码和年份需要使用随机选择原则。

  1. 测试了几个股票,效果图如下:
    量化策略:驾驭交易之轴心点研究(一)
    量化策略:驾驭交易之轴心点研究(一)

量化策略:驾驭交易之轴心点研究(一)

  1. 看了些图片发现了些问题:
    时间断开,蜡烛图在图片显示时也出现断开现象了,下篇文章进行修复;
    阻力位和支撑位貌似是有作用的,但是不是很明显,有好多噪声,可能原理还没研究明白,不清楚问题在哪;
  • 持续更新中。。。

  • 欢迎大家关注个人公众号大家一起来玩量化:
    量化策略:驾驭交易之轴心点研究(一)