前一篇介绍了回测类的设计,我们这篇简单介绍一下回测程序设计。
我们以5日均线和20日均线的交叉作为买卖点策略,来计算对一只股票交易的收益情况。这里仅仅是一个双均线策略演示的例子。读者可以在此基础上,修改为自己的策略。
程序test_df01.py 是双均线回测程序,用户自己修改为自己的策略。里面有完整的说明信息,我们不再介绍设计原理了。我们给出全部程序代码和结果。
我们使用了聚宽数据,用户需要修改为自己的用户和密码。
##修改为自己的聚宽用户或密码
x=auth('电话号码,'密码')
程序test_df01.py全部代码如下。
import pandas as pd
import numpy as np
import datetime as dt
import time
import matplotlib.pyplot as plt
import math
from jqdatasdk import *
import HP_lib as mylib
from HP_sys import *
##修改为自己的聚宽用户或密码
x=auth('18578755056','??????')
code=normalize_code('000001')
ds='2017-01-01'
de=time.strftime('%Y-%m-%d',time.localtime(time.time()))
df1 = get_price(code,start_date=ds,end_date=de, frequency='daily') # 日线数据
##数据规格化
df1.dropna(inplace=True)
df2=df1
df2.insert(0,'date',df2.index)
df2=df2.reset_index(level=None, drop=True ,col_level=0, col_fill='')
##双均线交易策略
df2=mylib.MA(df2,'close',5,'C5') #把5日均线存放到C5列中
df2=mylib.MA(df2,'close',20,'C20') #把20日均线存放到C20列中
df2=mylib.CROSS(df2,'C5','C20','B1') #把5日均线上穿20日均线,存放列B1,买入信号
df2=mylib.CROSS(df2,'C20','C5','S1') #把5日均线下穿20日均线,存放列S1,卖出信号
##回测
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(df2,'B1','S1','HL') #开始回测
print('\n打印交易过程')
tt.PrintTrade() #打印交易过程
print('\n打印持仓信息')
tt.PrintSecurity() #打印持仓信息
print('\n 打印内部交易记录信息')
print(tt.text) #打印交易信息
######下面是绘图
# 开启一个双图例的窗口,定义为211和212
plt.figure(2, figsize=(12,8), dpi=80)
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
# ax1(211窗口)
plt.sca(ax1)
plt.title(code+' 价格均线')
# 显示网格:grid='on'
df3.close.plot(color='red', grid='on')
df3['C20'].plot(color='blue', grid='on')
ax2.axhline(0, color='blue')
# ax2(212窗口)
plt.sca(ax2)
df3.HL.plot(color='orange', grid='on')
df3.B1.plot(color='red')
df3.S1.plot(color='blue')
#添加标题
plt.title(code+' 获利')
plt.show()
程序运行结果如下:
如果读者有什么问题咨询,可加我QQ:2775205,或着加我的QQ群:524949939
进行交流。