波动率与价格价格配合策略

本策略为波动率与价格想结合的策略,策略想法较为复杂,交易次数较少。

代码如下:

import pandas as pdimport pyodbcfrom sqlalchemy import create_engineimport numpy as npfrom statistics import medianimport crash_on_ipyimport pdbimport matplotlib.pyplot as plt# import matplotlib_finance as mpf# from matplotlib.finance import candlestickfrom numpy import nan#SERVER服务器地址,DATABASE数据库名,UID用户名,PWD登录密码con = pyodbc.connect(‘DRIVER={SQL Server};SERVER=192.168.60.5;DATABASE=data_history;UID=gx;PWD=01‘)# querystring="select * from [data_history].[dbo].[ag1612]"querystring="select top (20000000) [time],[price] from [data_history].[dbo].[ag1612]"engine = create_engine(‘mssql+pyodbc://scott:[email protected]‘)data=pd.read_sql(querystring, con, index_col=‘time‘)# data=pd.read_csv(‘data.csv‘,index_col=‘ID‘)print(data.head())print(data.tail())

# data=data.iloc[:,0:3]# data[‘date_time‘]=data[‘date‘]+data[‘time‘]# del data[‘date‘],data[‘time‘]data=data.sort_index()# data=data.set_index(‘date_time‘)data.rename(index=lambda x:str(x)[:16],inplace=True)# #得到每小时K线数据的开盘价、最高价、最低价、收盘价

new_data=data.groupby(data.index).last()new_data[‘open_price‘]=data.groupby(data.index).first()new_data[‘high_price‘]=data.groupby(data.index).max()new_data[‘low_price‘]=data.groupby(data.index).min()new_data.columns=[‘close_price‘,‘open_price‘, ‘high_price‘, ‘low_price‘]print(‘new_date.head():{}‘.format(new_data.head()))new_data.drop(new_data.index[152:181],inplace=True)# new_data.to_csv(‘new_data1.csv‘)

# 得到周期为10的标准差# 得到所有数据的行数# 策略判断标准前面需要至少(3*24+10)h,即82h,当天需要6根k线,即6h,总共88h,取前88h,i从87开始。T=len(new_data.index)print(‘T:{}‘.format(T))std=[]std_mean=[]#记录开平仓位置position_locat=[0]*Tprofit=[]#定义前三日第二大方差差值、区间最大值、区间最小值、开仓价second_diff=0x=0;y=0;z=0;z1=0;z2=0;m=0;m1=0;m2=0interval_data_max=0interval_data_min=0open_price=0

#std数据为T-10个for i in range(10,T):    data_close=new_data[‘close_price‘].iloc[i-10:i].values    std.append(data_close.std())# print(std)#得到std的均值,为T-10-24个,即T-34个for i in range(24,len(std)):    std_mean.append(np.mean(std[i-24:i]))# print(std_mean)print(len(new_data),len(std),len(std_mean))#new_data比std数据多10个,std数据比mean多24个,把所有数据量统一,去掉前面多于的数据new_data=new_data.iloc[34:,:]std=std[24:]print(len(new_data),len(std),len(std_mean))

T=len(new_data)mark_enter=[0]*(T)mark_leave=[0]*(T)

def vol(i):    vol_open_condition = False    second_diff = median([np.max(std[i - 77:i - 53]) - np.mean(std[i - 77:i - 53]),                          np.max(std[i - 53:i - 29]) - np.mean(std[i - 53:i - 29]),                          np.max(std[i - 29:i - 5]) - np.mean(std[i - 77:i - 53])])    interval_data=0;std_high=0;std_low=0;interval_data_max=0;interval_data_min=0;interval_begin_time=0;interval_close_time=0    if std[i - 4] > 0.8 * second_diff and std[i - 4] >= std[i - 5] and std[i - 4] > std[i - 3] > std[i - 2] > std[                i - 1]:        # 记录区间的开始位置,(i-4)为高点,(i-5)是高点前一根K线        x = i - 5        b = True        while b:            if std[i - 1] >= std[i]:                i += 1            else:                b = False                break        # 记录区间的结束位置,i-1为低点位置        y = i - 1        interval_data = new_data.iloc[x:y+1, :]        std_high = std[x - 4]        std_low = std[y]        second_diff_satisfy_std = second_diff        interval_data_max = interval_data[‘high_price‘].max()        interval_data_min = interval_data[‘low_price‘].min()        interval_begin_time=interval_data.index[0]        interval_close_time=interval_data.index[-1]        # interval_std_high=std[i-4]        print(x, y, std_high,std_low,interval_data_max, interval_data_min,interval_begin_time,interval_close_time)        vol_open_condition = True        return second_diff,interval_data,std_high,std_low,interval_data_max,interval_data_min,vol_open_condition    return second_diff,interval_data,std_high,std_low,interval_data_max,interval_data_min,vol_open_condition# interval_data,std_high,std_low,interval_data_max,interval_data_min=vol(22)

#得到所有最高点和最低点,即对应价格区间(x:y)open_long=Falseopen_long_number=Falseopen_short_number=Falseopen_condition=Falsesecond_diff_satisfy_std=0interval_data_satisfy_std=0std_high_satisfy_std=0std_low_satisfy_std=0interval_data_max_satisfy_std=0interval_data_min_satisfy_std=0# pdb.set_trace()#79开始for i in range(91, T - 10):    if not open_condition and vol(i)[6]:        # vol_condition = vol(i)        # vol_condition[6]        open_condition = True        second_diff_satisfy_std=vol(i)[0]        interval_data_satisfy_std=vol(i)[1]        std_high_satisfy_std=vol(i)[2]        std_low_satisfy_std=vol(i)[3]        interval_data_max_satisfy_std=vol(i)[4]        interval_data_min_satisfy_std=vol(i)[5]

#向上突破后回调情况    if open_condition and not open_long_number and not open_short_number and \                            interval_data_min_satisfy_std<new_data.iloc[i,0]<interval_data_max_satisfy_std and new_data.iloc[i-1,3]>interval_data_max_satisfy_std:        open_price=new_data.iloc[i,0]        # 开多,记录开仓价格,i+2期收盘价        print(‘买入开仓,开仓价为:{},开仓位为:{}‘.format(open_price,i))        mark_enter[i]=1        open_condition=False        open_long_number=True

# 得到向下突破后回调情况    if open_condition and not open_long_number and not open_short_number and \        interval_data_min_satisfy_std<new_data.iloc[i, 0]<interval_data_max_satisfy_std and new_data.iloc[i-1,2]<interval_data_min_satisfy_std:        #开空,记录开仓价格,i+2期收盘价        open_price=new_data.iloc[i,0]        print(‘卖出开仓,开仓价为:{},开仓位为:{}‘.format(open_price,i))        print(‘i:{}‘.format(i))        # position_locat[i+3]=2        open_condition=False        open_short_number =True        mark_enter[i] = 1

#得到波动率大于前高的位置z3    if open_condition and std[i-1] > std_high_satisfy_std:        open_condition=False        std_high_satisfy_std=std[i-1]        print(‘波动率大于前高位置,重置区间,重置点为:{}‘.format(i))

#出场    #出场分四种情况,分别是多头(正常出场和止损出场)和空头(正常出场和止损出场)    #多头正常出场    if open_long_number and std[i-3]>0.3*second_diff_satisfy_std and std[i-1]>std[i-2] and std[i-1]>std[i]:        # 平多,记录平仓位置        # m1=i+4        profit_yield = (new_data.iloc[i, 0] - open_price) / open_price        print(‘正常卖出平仓,平仓价为:{},平仓位为:{}‘.format(new_data.iloc[i, 0],i))        profit.append(profit_yield)        open_long_number=False        mark_leave[i] = 1

#多头止损出场    if open_long_number and (new_data.iloc[i,3]>interval_data_max_satisfy_std or new_data.iloc[i,2]<interval_data_min_satisfy_std):        #平多,记录平仓位置        # m2=i        profit_yield = (new_data.iloc[i, 0] - open_price) / open_price        print(‘止损卖出平仓,平仓价为:{},平仓位为:{}‘.format(new_data.iloc[i, 0],i))        profit.append(profit_yield)        open_long_number=False        mark_leave[i] = 1

#空头正常出场    if open_short_number and std[i]>0.3*second_diff_satisfy_std and std[i-1]>std[i-2] and std[i-1]>std[i]:        #平空,记录平仓位置        # m1=i+4        profit_yield = (open_price - new_data.iloc[i, 0]) / open_price        print(‘正常买入平仓,平仓价为:{},平仓位为:{}‘.format(new_data.iloc[i, 0],i))        profit.append(profit_yield)        open_short_number=False        mark_leave[i] = 1

#空头止损出场    if open_short_number and (new_data.iloc[i,3]>interval_data_max_satisfy_std or new_data.iloc[i,2]<interval_data_min_satisfy_std):        #平空,记录平仓位置        # m2=i        profit_yield = (open_price - new_data.iloc[i, 0]) / open_price        print(‘止损买入平仓,平仓价为:{},平仓位为:{}‘.format(new_data.iloc[i, 0],i))        profit.append(profit_yield)        open_short_number=False        mark_leave[i] = 1

#计算sharpe#计算总回报total_return=np.expm1(np.log1p(profit).sum())#计算年化回报annual_return=(1+total_return)**(365/30)-1risk_free_rate=0.015profit_std=np.array(profit).std()volatility=profit_std*(len(profit)**0.5)annual_factor=12annual_volatility=volatility*((annual_factor)**0.5)sharpe=(annual_return-risk_free_rate)/annual_volatility# print(total_return,annual_return,std,volatility,annual_volatility,sharpe)print(‘夏普比率:{}‘.format(sharpe))

#计算最大回撤#计算df_cum=np.exp(np.log1p(profit).cumsum())max_return=np.maximum.accumulate(df_cum)max_drawdown=((max_return-df_cum)/max_return).max()print(‘-----------------‘)print(‘最大回撤: {}‘.format(max_drawdown))

#计算盈亏比plrfrom collections import Counter# win_times=Counter(x>0 for x in minute_return)# loss_times=Counter(x<0 for x in minute_return)win_times=sum(x>0 for x in profit)loss_times=sum(x<0 for x in profit)plr=win_times/loss_timesprint(‘----------------------------‘)print(‘盈利次数:{}‘.format(win_times))print(‘亏损次数:{}‘.format(loss_times))print(‘盈亏比:{}‘.format(plr))

# #画出净值走势图fig=plt.figure()ax1=fig.add_subplot(3,1,1)ag_close_price,=plt.plot(new_data[‘close_price‘].values,label=‘close_price‘)ag_open_price,=plt.plot(new_data[‘open_price‘].values,label=‘open_price‘)ag_high_price,=plt.plot(new_data[‘high_price‘].values,label=‘high_price‘)ag_low_price,=plt.plot(new_data[‘low_price‘].values,label=‘low_price‘)plt.legend([ag_close_price,ag_open_price,ag_high_price,ag_low_price],[‘close_price‘,‘open_price‘,‘high_price‘,‘low_price‘])ag_close_price_mark_enter=new_data.iloc[:,0].values.tolist()ag_close_price_mark_leave=new_data.iloc[:,0].values.tolist()# print(type(spread),type(spread_mark))for i in range(0,T):    if mark_enter[i]==0:        ag_close_price_mark_enter[i]=nanplt.plot(ag_close_price_mark_enter,‘*‘)for i in range(0,T):    if mark_leave[i]==0:        ag_close_price_mark_leave[i]=nanplt.plot(ag_close_price_mark_leave,‘+‘)

ax2=fig.add_subplot(3,1,2)ag_std,=plt.plot(std,label=‘std‘)ag_std_mean,=plt.plot(std_mean,label=‘std_mean‘)plt.legend([ag_std,ag_std_mean],[‘std‘,‘std_mean‘])ax3=fig.add_subplot(3,1,3)cum_net_worth,=plt.plot(df_cum,label=‘cum_net_worth‘)plt.legend([cum_net_worth],[‘cum_net_worth‘])

plt.show()pdb.set_trace()

下面为运行结果图:

				
时间: 2024-10-25 06:45:36

波动率与价格价格配合策略的相关文章

AJPFX平台:03.06日内交易策略

AJPFX恒指: 恒指上个交易日走势上冲到上方最高点是28989,下方跌到最低点位是28617.受A股市场提振,昨日恒指日内全线走多,美股晚间收跌,尾盘价格有所回撤,但整体多头未被打破!盘面上分析,K线昨日收阳,跌到下方10日均线下面.最后收于均线上方.补助指标KDJ有点往上勾,MACD能量柱减弱向下不明显了.所以今日恒指整体走势偏多考虑,小级别分析,恒指会有一定力度的空头回撤调整.交易上,先看回撤力度,上方注意的点位是29160,29260.下方注意的点位是28800,28600. 恒指1小时

设计模式之 - 策略模式(Strategy Pattern)

引入:项目中涉及到工作流,当然这个工作流的实现是由用户根据不同的策略或者说方式传入处理这个事件的人的审批链,后台在存储过程中进行解析,然后生成最终的审批链,在系统中流转进行审批. 比如审批链: 张三 -> 李四 -> 王五 由于很多外部系统接入,所以系统提供多种审批链的生成方式供外部系统选择,比如 1. 已经定好的好审批链的(叫做模板)传入模板 ID 系统就可以根据传入的模板生成审批链; 2. 外部系统自定义审批链,则 外部系统直接传入审批  链,张三 -> 李四 -> 王五 ,我

商业智能改变汽车行业

汽车市场的高速膨胀带动了汽车行业的高速发展.传统的销售和管理模式业已经难以在激烈的市场竞争中拼杀,随着大数据与移动互联技术的普及,传统汽车营销服务方式正在受到有力挑战. <大数据时代>一书作者维克托·迈尔·舍恩伯格曾提过,过去的汽车行业变革,能够归纳为更大的引擎.更快的速度.更少的燃油.基于数据的变革是对数据有关的改善--改善生产流程.商业思维.汽车生活. 确实,对于汽车行业.营销要很多其它地从艺术走向科学,如今的时代不能仅仅靠"点子",关键是靠背后的运行和严谨的科学,而科

《产品经理》读书笔记

自从鼠标手犯病后,就刻意减少使用电脑的时间并且加强运动,目前已经完全康复,但是还是需要注意.因此更新博客的频率大大降低,但是也有时间多看看书,学习学习了! 最近看了<yes,产品经理>上下册,作者 汤圆 老马,文笔诙谐,把管理知识融入工作日常内容,浅显易懂,对于非管理专业的门外汉,还是不错的读物! 下面是摘抄的部分主要内容,个人认为比较有用的就记录下来. ------------------------------------------------ 制定产品价格策略的6步: 确定企业目标 冲

管理经济学

管理经济学讲到了决策,决策分以下几个步骤进行. (1)确立目标:在进行决策时,首先要明确我们要获得一个什么样的结果. (2)提出可选方案:达到一个目标,可以有多条途径,我们的任务就是尽可能提出所有可能的方案. (3)选出最优方案:这是关键的一步,我们要对所有的方案进行比较,选出最为可行的方案,使这个方案的实施最有可能达到以较小的投入获得最大产出的目的. 决策中的作用 管理经济学研究如何对可供选择的方案进行分析比较,从中找出最有可能实现企业目标的方案.在这个决策过程中,管理经济学的作用就是提供了相

Oculus之外,那些高大上的虚拟现实(VR)装备

自Facebook收购Oculus以来,巨头们逐渐意识到它的强大和超前,并纷纷布局该领域,推动虚拟现实技术进入人类的日常生活. 虽然虚拟现实(VR)尚处于襁褓之中,距真正的商业化还有不少的路要走.但它带给人们的独特体验,正以独有的.全新方式闯入我们的世界,改变着我们的生活. 今天,我们一起来看看Oculus之外的,哪些高大上的虚拟现实装备. Control VR Control是一款虚拟现实(VR)手套.据介绍,该款手套由ControlVR公司研发而出,它采用了由美国国防部高级研究计划局设计的微

褚时健传读后感

耗时2个月利用碎片时间终于看完了这本人物传记,作为褚橙之父唯一授权的书,最为真实的还原了褚老的一生传奇经历,当然这些精彩还在继续.   断断续续的看完,在看完的那一刻居然有种冲动想去褚橙庄园一睹褚老的真人风采,在此之前还是先写下读后感更为实际.   从小就注定了他的不平凡,幼年丧父,作为家里长子过早承担起照顾家人的责任和义务,辍学在家帮着母亲烤酒补贴家用,善于观察,思考和总结形成一套自己的酿酒方法,成为远近闻名的烤酒高手,在那个自产自销的年代,结合酒的等级.质量制定出一套价格和销售策略,取得不错

BizTalk开发系列(三十八)微软BizTalk Server定价和许可[解读]

做BizTalk的项目一段时间了,但是对BizTalk的价格和许可还不是很了解.给客户设计解决方案时大部分产品都是直接按照企业版的功能来设计,很 少考虑到价格和许可方面的因素,以为这个不是我们的事情或者认为使用企业版是应该的,企业软件的销售就是有意思,懂产品的和卖产品的一般不是一个人.懂产 品的一般是做技术的,学这个产品的时候就是用D版的或者是企业版,不会去关心不同产品的定价.当然在跟客户讲的时候就很少考虑版本及价格因素.而卖产品就 会添油加醋说要实现这样的平台您需要购买XX.YY产品,当然为要

全渠道价值链整合云服务 B2B SOLOMO(组图)

最近看到>中谈到“全渠道零售”(Omni-channel Retailing),指在互联网和电子商务的当今时代“零售商将能通过各种渠道与顾客互动,包括网站.实体店.服务终端.直邮和目录.呼叫中心.社交媒体.移动设备.游戏机.电视.网络家电.上门服务等等,传统商家除非采用全新视角,把各种迥然不同的渠道整合成“全渠道”的一体化无缝式体验,否则就很可能被时代淘汰.” 以上趋势如何,每个人都有各自观点.而这里我们希望谈到的是上海文沥信息技术有限公司如何将“全渠道”的概念从零售扩展到整个价值链领域,实现“