赞
踩
自己做量化交易软件(43)小白量化实战16–利用小白量化金融模块在恒生PTrade交易系统(交易端)上仿大智慧指标回测及实战交易设计
量化产品PTrade(Personalise Trade)交易系统采用事件驱动式回测平台,与聚宽量化平台类似的量化框架,内置Ta-lib金融模块,除了Ta-lib提供的金融指标外,用户无法直接使用仿大智慧自编公式,需要采用类似C++的算法来实现指标策略。
众所周知,Python如何使用C++的程序算法流程,包含大量嵌套循环,效率极其低下。以此方法实现的自编策略,回测1个月,可能需要数小时才能完成。因此在做设计策略时,尽量依赖C++的Python模块开发的numpy和pandas库实现,同样的回测工作,数十秒完成。
小白量化金融模块仿大智慧指标系统,主要依赖numpy库和pandas库,因此计算速度很快。此外后期版本将一些numpy库和pandas库没有的大智慧和通达信函数都转化为C++的Python模块,提高仿大智慧和仿通达信自编指标回测速度,也可以实现因子矩阵自编公式运算。目前是个别函数以Python代码实现的,使用这些函数调用,将降低回测速度,例如SMA(),WMA(),ZIG()等函数,这些是用纯Python代码实现的,因使用了嵌套循环计算,所以速度比较慢。后期计划都转化为C++的Python模块,达到与numpy库和pandas库一样的计算速度。
其他不多说了,下面直接给出PTrade(Personalise Trade)交易系统上自编公式MACD交易策略的实现代码,读者可以仿造此程序,替换为自己的自编指标公式,在PTrade上实现仿大智慧和仿通达信自编指标回测和实战交易。
import pandas as pd import numpy as np global CLOSE,LOW,HIGH,OPEN,VOL global C,L,H,O,V ##从小白量化公式函数库中复制. ## 函数来源 HP_formula def ABS(Series): #绝对值 return abs(Series) def SUM(Series, N): if N<=0: N=len(Series) sum_=pd.Series.rolling(Series, N).sum() return pd.Series(sum_,name='sums') def EMA(Series, N): return pd.Series.ewm(Series, span=N, min_periods=N - 1, adjust=True).mean() def HHV(Series, N): if N==0: return Series.cummax() else: return pd.Series(Series).rolling(N).max() def LLV(Series, N): if N==0: return Series.cummin() else: return pd.Series(Series).rolling(N).min() def CROSS(A, B): A2=np.array(A) var = np.where(A2<B, 1, 0) return (pd.Series(var, index=A.index).diff()<0).apply(int) def IF(COND, V1, V2): var = np.where(COND, V1, V2) return pd.Series(var) def REF(Series, N,sign=0): #sign=1表示保留数据,并延长序列 if sign==1: for i in range(N): Series=Series.append(pd.Series([0],index=[len(Series)+1])) return Series.shift(N) #来源于网上自编指标公式,或股票软件中公式源代码 #MACD 指数平滑移动平均线 def MACD(SHORT=12, LONG=26, M=9): """ MACD 指数平滑移动平均线 """ DIFF = EMA(CLOSE, SHORT) - EMA(CLOSE, LONG) DEA = EMA(DIFF, M) MACD = (DIFF - DEA) * 2 return DIFF,DEA,MACD #Ptrade交易策略编写 def initialize(context): # 初始化此策略 # 设置我们要操作的股票池, 这里我们只操作一支股票 g.security = '600519.SS' set_universe(g.security) #当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出 def handle_data(context, data): global CLOSE,LOW,HIGH,OPEN,VOL security = g.security # 得到十日前的历史价格 mydf= get_price(g.security, count=300, frequency='1d',fields=['open','close','low','high','volume']) #小白量化数据规格化 mydf['date']=mydf.index mydf=mydf.reset_index(level=None, drop=True ,col_level=0, col_fill='') CLOSE=mydf['close'] LOW=mydf['low'] HIGH=mydf['high'] OPEN=mydf['open'] VOL=mydf['volume'] #计算MACD指标 diff,dea,macd=MACD() mydf['diff']=diff mydf['dea']=dea mydf['macd']=macd #交易策略,仅供演示 #买点:MACD指标diff上穿dea数值,并且diff小于0 mydf['B']=CROSS(mydf['diff'],mydf['dea'])*IF(mydf['diff']<0,1,0) #卖点:MACD指标diff下穿dea数值 mydf['S']=CROSS(mydf['dea'],mydf['diff']) # 取得昨天收盘价 price = data[security]['close'] # 得到当前资金余额 cash = context.portfolio.cash # 如果出现买点 if mydf['B'].iloc[-1] > 0: # 用所有 cash 买入股票 order_value(security, cash) # 记录这次买入 log.info("Buying %s" % (security)) # 如果出现卖点 elif mydf['S'].iloc[-1]>0 and get_position(security).amount > 0: # 全部卖出 order_target(security, 0) # 记录这次卖出 log.info("Selling %s" % (security))
程序回测结果如下图.
在PTrade交易软件上回测,如果没问题,能够赢利,可以直接启动策略交易进行交易实战。
请持续关注我的博客,我的进步,就是你的进步!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。