您的位置:首页 > 其它

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

2018-11-11 15:43 162 查看
  • 最近在《驾驭交易》这本书时,发现个比较有意思的轴心点策略,基本原理跟常用的技术黄金分割线很像,都是来标识重要支撑和阻力位,非常适合短线交易者使用。
    本篇文章主要尝试在中国股市基于日线级别做策略尝试研究,百度了下关于轴心点的策略公式定义版本很多,百度百科外汇轴心点定义为:
    轴心点 :
    (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. 看了些图片发现了些问题:
    时间断开,蜡烛图在图片显示时也出现断开现象了,下篇文章进行修复;
    阻力位和支撑位貌似是有作用的,但是不是很明显,有好多噪声,可能原理还没研究明白,不清楚问题在哪;
  • 持续更新中。。。

  • 欢迎大家关注个人公众号大家一起来玩量化:

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: