小白量化學習(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
微信公衆號:獨狼股票分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章