小白量化学习(3)指标策略回测设计

小白量化学习(3)指标策略回测设计

一、准备工作
1、首先把如下文件复制到自己工程目录中。
小白量化Q群(小白量化群:524949939)共享中有下载。
HP_global.py
HP_set.py
HP_formula.py
HP_sys.py

2、在新文件开始增加下面导入模块语句。

import pandas as pd  
import numpy  as np
import datetime as dt
import time
import matplotlib.pyplot as plt
import math
import tushare as ts
from HP_formula import *
from HP_sys import *

二、对数据预处理
我们采用与tushare旧股票数据格式。

##code股票代码
code='600030'
#首先要对数据预处理
#ds是开始日期,de是结束日期
ds='2017-01-01'  
de=time.strftime('%Y-%m-%d',time.localtime(time.time()))  #今天日期
df=ts.get_k_data(code,ktype='D',start=ds,end=de,index=False,autype='qfq')
#df = ts.get_k_data(code,ktype='D')
mydf=df.copy()
CLOSE=mydf['close']
LOW=mydf['low']
HIGH=mydf['high']
OPEN=mydf['open']
VOL=mydf['volume']
C=mydf['close']
L=mydf['low']
H=mydf['high']
O=mydf['open']
V=mydf['volume']

#生成均线 5日均线
ma5=MA(C,5)
mydf = mydf.join(pd.Series( ma5,name='MA5')) 
#生成均线 10日均线
ma10=MA(C,10)
mydf = mydf.join(pd.Series( ma10,name='MA10')) 

三、仿通达信或大智慧公式

def RSI(N1=6, N2=12, N3=24):
    """
    RSI 相对强弱指标
    """
    LC = REF(CLOSE, 1)
    RSI1 = SMA(MAX(CLOSE - LC, 0), N1, 1) / SMA(ABS(CLOSE - LC), N1, 1) * 100
    RSI2 = SMA(MAX(CLOSE - LC, 0), N2, 1) / SMA(ABS(CLOSE - LC), N2, 1) * 100
    RSI3 = SMA(MAX(CLOSE - LC, 0), N3, 1) / SMA(ABS(CLOSE - LC), N3, 1) * 100

    return RSI1, RSI2, RSI3

四、使用公式并回测
#假定我们使用RSI指标策略

#获取RSI指标
r1,r2,r3=RSI(5,10,20)

mydf = mydf.join(pd.Series( r1,name='RSI1'))  
mydf = mydf.join(pd.Series( r2,name='RSI2'))  
mydf = mydf.join(pd.Series( r3,name='RSI3')) 
mydf['S80']=80  #增加上轨80轨迹线
mydf['X20']=20  #增加下轨20轨迹线
mydf['Z50']=50  #增加中轨50轨迹线

#mydf=mydf.tail(100)  #显示最后100条数据线 
##下面开始生成RSI指标买卖点
##买点RSI1上穿数值20
b1=CROSS(mydf['RSI1'],mydf['X20'])
mydf = mydf.join(pd.Series( b1,name='B1'))  

##卖点RSI1下穿80
s1=CROSS(mydf['S80'],mydf['RSI1'])

#卖点RSI1下穿50
s2=CROSS(mydf['Z50'],mydf['RSI1'])

#合并所有卖点信号
s3=s1 | s2

mydf = mydf.join(pd.Series( s1,name='S1'))  
mydf = mydf.join(pd.Series( s2,name='S2'))  
mydf = mydf.join(pd.Series( s3,name='S3'))  

五、回测

##回测
tt=hpQuant()   ##初始化类

#下面是用户可设置信息。
#        self.money2=1000000.00  #总资金
#        self.code=""   #证券代码
#        self.stamp_duty=0.001   #印花税 0.1%
#        self.trading_Commission=0.0005    #交易佣金0.05%
#        self.stop_loss_on=True #允许止损
#        self.stop_loss_max=50 #止损3次,就停止交易
#        self.stop_loss_range=0.05   #止损幅度

tt.code=code   #证券代码,必须输入
tt.stop_loss_on=False    #关闭自动止损

#参数表说明:股票数据表,买点序列名称,卖点序列名称,返回获利序列名称
df3=tt.Trade_testing(mydf,'B1','S3','HL')   #开始回测
print('\n打印交易过程')
tt.PrintTrade()    #打印交易过程
print('\n打印持仓信息')
tt.PrintSecurity()   #打印持仓信息
print('\n 打印内部交易记录信息')
print(tt.text)     #打印交易信息

六、绘制图形

######下面是绘图
# 开启一个3图例的窗口,
plt.figure(figsize=(12,8), dpi=100)
ax1 = plt.subplot(311)
ax2 = plt.subplot(312)
ax3 = plt.subplot(313)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# ax1(311窗口)
plt.sca(ax1)
plt.title(code+'  RSI指标买卖策略回测图')   
# 显示网格:grid='on'
df3.close.plot(color='red', grid='on',legend=True)
df3['MA5'].plot(color='blue', grid='on',legend=True)
df3['MA10'].plot(color='green', grid='on',legend=True)
ax2.axhline(0, color='blue')

# ax2(312窗口)
plt.sca(ax2)

mydf.S80.plot.line()
mydf.X20.plot.line()
mydf.RSI1.plot.line(legend=True)
mydf.RSI2.plot.line(legend=True)
mydf.RSI3.plot.line(legend=True)

# ax3(313窗口)
plt.sca(ax3)
df3.HL.plot(color='orange', grid='on',legend=True)
df3.B1.plot(color='red',legend=True)
df3.S1.plot(color='blue',legend=True)
#添加标题
plt.title(code+'  获利')
plt.show()

回测结果如下图:
在这里插入图片描述
建议申请聚宽免费帐户,可以获取期货数据.通过下面网址申请,免费数据量翻倍.申请网址如下:
https://www.joinquant.com/default/index/sdk?channelId=11ab957b5b19ebc3302ee864cee476b

独狼荷蒲qq:2775205
小白量化群:524949939
微信公众号:独狼股票分析

发布了56 篇原创文章 · 获赞 67 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/hepu8/article/details/93378626
今日推荐