自己做量化交易軟件(34)小白量化實戰7--投資理念與通達信公式回測(2)

自己做量化交易軟件(34)小白量化實戰7–投資理念與通達信公式回測(2)

投資通俗地講就是“財富變壓器”。投資是使資本和財富生長的源泉。沒有證券市場和期貨市場時投資者當投出一元錢時,這一元錢資本壓死在資產中。但是有了證券市場和期貨市場後,這一元錢不僅容易變現流通,而且可以以市盈率的倍數放大。這樣搞活和加速了投資頻率,因而產生了財富效應。
下面我舉個例子,假定一個村莊有10戶人家,每戶都有一隻雞蛋,雞蛋的市場價格爲1元(原始股),因此每隻雞蛋財富爲1元。甲戶認爲自己的雞蛋沒有用處,以2元價格賣給乙戶,2元是市場價,此時每隻雞蛋財富均爲2元。丙戶以3元價格將雞蛋賣給丁戶,3元是市場價,此時每隻雞蛋財富均爲3元。因此雞蛋持有人能以市場價格3元賣出雞蛋,乙戶賣出自己的2只雞蛋,獲得6元,減去投資成本3元,獲利3元。乙戶可以認爲是投資者,這裏的“雞蛋”,我們可以理解爲房子,黃金,或者股票,期貨、外匯品種等等。
無論是投資實體物品房產或黃金等,或者虛擬資產證券、期貨、外匯等,都是投資。
能不能賺錢,還要看你的眼光和判斷,很多投資君子蘭、普洱茶等一些方面的投資者都虧損累累,如果他們用那些錢投資房產和茅臺酒等,結果將會獲利豐厚。
同樣投資證券和期貨、外匯,也要靠你的眼光和技術判斷。現擇什麼板塊?選擇什麼品種?選擇什麼時間買賣等等。
前面文章介紹過,投資賺錢的前提要有正確的投資理念,投資方法。我們的投資技術能不能賺錢,我們可以把我們的投資理念和投資技術,用程序實現,用歷史行情模擬一遍“真實交易”,這個過程稱爲"回測"。




下面我們接上一篇文章,我們選出一隻股票603260。
在這裏插入圖片描述

我們寫出603260的Python回測代碼。程序中HL表示原始買點的回測獲利結果,HL2錶帶增量過濾後的買點回測獲利結果。

# -*- coding: utf-8 -*-
# 小白量化自編指標回測程序
'''
獨狼荷蒲qq:2886002
通通小白python量化羣:524949939
tkinter,pyqt,gui,Python交流2:517029284
微信公衆號:獨狼股票分析
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import HP_global as g  #小白量化全局變量庫
from HP_formula import *#小白量化仿通達信庫模塊
import HP_tdx as htdx #小白量化通達信莫開
import HP_plt as hplt   #小白量化指標繪圖模塊
import HP_sys as hs  #小白量化回測系統庫

plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
#白底色
g.ubg='w'
g.ufg='b'
g.utg='b'
g.uvg='#1E90FF'

global CLOSE,LOW,HIGH,OPEN,VOL
global C,L,H,O,V

#小白換檔買賣線
def XBHDMMX(N=24,M=2,X=25):
    MID =MA(CLOSE,N)
    UPPER=MID + 2*STD(CLOSE,N)
    LOWER= MID - 2*STD(CLOSE,N)
    M1=(UPPER-MID)/2+MID
    M2=(MID-LOWER)/2+LOWER
    MM1=EMA((OPEN+CLOSE*2+LOW+HIGH)/5,M);
    MM2=EMA(IF(MM1>=MID,MM1*(1+X/1000),MM1*(1-X/1000)),3)
    MM=MM2
    return MID,UPPER,LOWER,M1,M2,MM

#首先要對數據預處理
#獲取數據
htdx.TdxInit(ip='183.60.224.178',port=7709)

#獲取股票行情數據
code='603260'
df = htdx. get_security_bars(nCategory=4,nMarket = 0,code=code)

#對數據做小白量化格式轉換
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']


#調用自定義指標
MID,UPPER,LOWER,M1,M2,MM=XBHDMMX(34,4,32)

#把指標值添加到mydf數據表中
mydf['MID']=MID
mydf['UPPER']=UPPER
mydf['LOWER']=LOWER
mydf['M1']=M1
mydf['M2']=M2
mydf['MM']=MM

#成交量過濾條件,成交量持續大於113均量線
MAV113=MA(V,113);
T1=IF(REF(V,1)>REF(MAV113,1),1,0);
T2=IF(REF(V,2)>REF(MAV113,2),1,0);
T3=IF(V>MAV113,1,0);
T=IF((T1+T2+T3)>=2,1,0);
mydf['T']=T

mydf['b1']=CROSS(mydf['MM'],mydf['LOWER'])
mydf['b2']=CROSS(mydf['MM'],mydf['M2'])
mydf['b3']=CROSS(mydf['MM'],mydf['MID'])
mydf['b4']=mydf['b1']+mydf['b2']+mydf['b3']
mydf['B']=IF(mydf['b4']>0,1,0)   #買入信號
mydf['BT']=IF(mydf['b4']>0,1,0)*T  #增量買入信號

mydf['s1']=CROSS(mydf['UPPER'],mydf['MM'],)
mydf['s2']=CROSS(mydf['M1'],mydf['MM'],)
mydf['s3']=CROSS(mydf['MID'],mydf['MM'],)
mydf['s4']=mydf['s1']+mydf['s2']+mydf['s3']
mydf['S']=IF(mydf['s4']>0,1,0)  #賣出信號


##回測1
tt=hs.hpQuant()   ##初始化類
#下面是用戶可設置信息。
#tt.money2=1000000.00  #總資金
#tt.stamp_duty=0.001   #印花稅 0.1%
#tt.trading_Commission=0.0005    #交易佣金0.05%
tt.stop_loss_on=True #允許止損
#tt.stop_loss_max=50 #止損3次,就停止交易
tt.stop_loss_range=0.05   #止損幅度
tt.code=code   #證券代碼,必須輸入
tt.stop_loss_on=False    #關閉自動止損

#參數表說明:股票數據表,買點序列名稱,賣點序列名稱,返回獲利序列名稱
df2=tt.Trade_testing(mydf,'B','S','HL')   #開始回測
print('\n打印交易過程')
tt.PrintTrade()    #打印交易過程
print('\n打印持倉信息')
tt.PrintSecurity()   #打印持倉信息
print('\n 打印內部交易記錄信息')
print(tt.text)     #打印交易信息

##回測2
tt=hs.hpQuant()   ##初始化類
tt.stop_loss_on=True #允許止損
tt.stop_loss_range=0.05   #止損幅度
tt.code=code   #證券代碼,必須輸入
tt.stop_loss_on=False    #關閉自動止損
mydf=tt.Trade_testing(df2,'BT','S','HL2')   #開始回測



######下面是繪圖

#數據裁減
m=1
mydf=mydf.tail(150*m).head(150).copy()

#繪製圖形
plt.figure(1,figsize=(16,12), dpi=80)

#繪製主圖指標
ax1=plt.subplot(311)
hplt.ax_K(ax1,mydf,t=code,n=0)
mydf['MID'].plot.line(legend=True)
mydf['UPPER'].plot.line(legend=True,linewidth=3)
mydf['LOWER'].plot.line(legend=True,linewidth=3)
mydf['M1'].plot.line(legend=True)
mydf['M2'].plot.line(legend=True)
mydf['MM'].plot.line(legend=True,linewidth=4)

#繪製副圖指標
ax2=plt.subplot(312)
mydf['MID'].plot.line(legend=True)
mydf['UPPER'].plot.line(legend=True,linewidth=3)
mydf['LOWER'].plot.line(legend=True,linewidth=3)
mydf['M1'].plot.line(legend=True)
mydf['M2'].plot.line(legend=True)
mydf['MM'].plot.line(legend=True,linewidth=4)


ax3=plt.subplot(313)
plt.sca(ax3)
mydf.HL.plot(color='orange', grid='on',legend=True)
mydf.HL2.plot(color='red', grid='on',legend=True)
mydf.B.plot(color='blue',legend=True)
mydf.S.plot(color='green',legend=True)
#添加標題
plt.title(code+'  獲利')
plt.show()

程序運行結果如下:

打印交易過程
                date      time mode    code   amount  price         money
0   2020-05-15 15:00  14:45:01    1  603260  41300.0  24.16  1.693096e+03
1   2020-05-25 15:00  14:45:02    2  603260  41300.0  22.79  9.415083e+05
2   2020-05-28 15:00  14:45:01    1  603260  37300.0  25.20  1.078276e+03
3   2020-06-08 15:00  14:45:02    2  603260  37300.0  24.74  9.224961e+05
4   2020-09-10 15:00  14:45:01    1  603260  32300.0  28.50  1.485798e+03
5   2020-10-22 15:00  14:45:02    2  603260  32300.0  28.34  9.154947e+05
6   2020-10-30 15:00  14:45:01    1  603260  30400.0  30.09  3.013565e+02
7   2020-11-18 15:00  14:45:02    2  603260  30400.0  41.16  1.249688e+06
8   2020-12-21 15:00  14:45:01    1  603260  30600.0  40.80  5.842205e+02
9   2020-12-29 15:00  14:45:02    2  603260  30600.0  32.81  1.003064e+06
10  2021-01-07 15:00  14:45:01    1  603260  27700.0  36.08  3.148534e+03

打印持倉信息
     code   amount     price       money
0  603260  27700.0  36.09804  999915.708

 打印內部交易記錄信息
    ----開始回測-----
日期:2020-05-15 15:00 買入:41300.0, 價格:24.16
日期:2020-05-25 15:00 賣出:41300.0, 價格:22.79獲利:-5.85%
日期:2020-05-28 15:00 買入:37300.0, 價格:25.2
日期:2020-06-08 15:00 賣出:37300.0, 價格:24.74獲利:-7.75%
日期:2020-09-10 15:00 買入:32300.0, 價格:28.5
日期:2020-10-22 15:00 賣出:32300.0, 價格:28.34獲利:-8.45%
日期:2020-10-30 15:00 買入:30400.0, 價格:30.09
日期:2020-11-18 15:00 賣出:30400.0, 價格:41.16獲利:24.97%
日期:2020-12-21 15:00 買入:30600.0, 價格:40.8
日期:2020-12-29 15:00 賣出:30600.0, 價格:32.81獲利:0.31%
日期:2021-01-07 15:00 買入:27700.0, 價格:36.08
總投入1000000.0,最終獲利幅度33.0%

在這裏插入圖片描述

回測圖中 橘黃HL曲線不帶成交量過濾,紅色HL2曲線,含有成交量增量條件,明顯過濾掉一些假買點信號。

113均量成交量過濾是不是對所有股票有效呢?不見得,因爲主力高度控盤的股票不會有很大成交量的,爲證實這些問題,我們可以在小白量化第二代上寫成回測代碼看看結果。下面代碼保存爲文件[回測面板_自編指標回測.py],把這個程序放到[xb2/user]目錄中。這樣,這個文件名會出現在小白量化軟件導航樹上。
我們可以在回測面板中修改回測參數,例如股票代碼和回測開始時間等等。

# -*- coding: utf-8 -*-
"""
#功能:通通股票分析軟件框架 回測工具
#版本:Ver1.00
#設計人:獨狼荷蒲
#電話:18578755056
#QQ:2775205
#百度:荷蒲指標
#開始設計日期: 2018-07-08
#公衆號:獨狼股票分析
#使用者請同意最後<版權聲明>
#最後修改日期:20210124"""
from HP_view import * #菜單欄對應的各個子頁面 
import pandas as pd  
import numpy  as np
import datetime as dt
import time
import matplotlib.pyplot as plt
from matplotlib import dates as mdates
from matplotlib import ticker as mticker
#from matplotlib.finance import candlestick_ohlc
from mpl_finance import candlestick_ohlc
from matplotlib.dates import DateFormatter, WeekdayLocator, DayLocator, MONDAY,YEARLY
from matplotlib.dates import MonthLocator,MONTHLY
import matplotlib
from numpy import arange, sin, pi
#from matplotlib.backends.backend_tkagg import FigureCanvasTk,NavigationToolbar2Tk  #matplotlib 2.0.2 
from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)    ##matplotlib 3.0.2 
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
import math
import HP_tdx as htdx
import HP_lib as mylib
from HP_sys import *
import tkinter as tk
import HP_global as g 
import HP_data as hp
from HP_formula import *#小白量化仿通達信庫模塊
import HP_tdx as htdx #小白量化通達信莫開
import HP_plt as hplt   #小白量化指標繪圖模塊
import HP_sys as hs  #小白量化回測系統庫


global CLOSE,LOW,HIGH,OPEN,VOL
global C,L,H,O,V

#小白換檔買賣線
def XBHDMMX(N=24,M=2,X=25):
    MID =MA(CLOSE,N)
    UPPER=MID + 2*STD(CLOSE,N)
    LOWER= MID - 2*STD(CLOSE,N)
    M1=(UPPER-MID)/2+MID
    M2=(MID-LOWER)/2+LOWER
    MM1=EMA((OPEN+CLOSE*2+LOW+HIGH)/5,M);
    MM2=EMA(IF(MM1>=MID,MM1*(1+X/1000),MM1*(1-X/1000)),3)
    MM=MM2
    return MID,UPPER,LOWER,M1,M2,MM

ds=g.hcdate_s.get()
de=g.hcdate_e.get()
stockn=g.hcstock.get()
code=stockn
df2=htdx.get_k_data(stockn,ktype='D',start=ds,end=de,index=False,autype='qfq')
df3=df2

##數據規格化 
df3.dropna(inplace=True)
#對數據做小白量化格式轉換
mydf=df3.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']


#調用自定義指標
MID,UPPER,LOWER,M1,M2,MM=XBHDMMX(34,4,32)

#把指標值添加到mydf數據表中
mydf['MID']=MID
mydf['UPPER']=UPPER
mydf['LOWER']=LOWER
mydf['M1']=M1
mydf['M2']=M2
mydf['MM']=MM

#成交量過濾條件,成交量持續大於113均量線
MAV113=MA(V,113);
T1=IF(REF(V,1)>REF(MAV113,1),1,0);
T2=IF(REF(V,2)>REF(MAV113,2),1,0);
T3=IF(V>MAV113,1,0);
T=IF((T1+T2+T3)>=2,1,0);
mydf['T']=T

mydf['b1']=CROSS(mydf['MM'],mydf['LOWER'])
mydf['b2']=CROSS(mydf['MM'],mydf['M2'])
mydf['b3']=CROSS(mydf['MM'],mydf['MID'])
mydf['b4']=mydf['b1']+mydf['b2']+mydf['b3']
mydf['B']=IF(mydf['b4']>0,1,0)   #買入信號
mydf['BT']=IF(mydf['b4']>0,1,0)*T  #增量買入信號

mydf['s1']=CROSS(mydf['UPPER'],mydf['MM'],)
mydf['s2']=CROSS(mydf['M1'],mydf['MM'],)
mydf['s3']=CROSS(mydf['MID'],mydf['MM'],)
mydf['s4']=mydf['s1']+mydf['s2']+mydf['s3']
mydf['S']=IF(mydf['s4']>0,1,0)  #賣出信號


##回測1
tt=hs.hpQuant()   ##初始化類
#下面是用戶可設置信息。
#tt.money2=1000000.00  #總資金
#tt.stamp_duty=0.001   #印花稅 0.1%
#tt.trading_Commission=0.0005    #交易佣金0.05%
tt.stop_loss_on=True #允許止損
#tt.stop_loss_max=50 #止損3次,就停止交易
tt.stop_loss_range=0.05   #止損幅度
tt.code=code   #證券代碼,必須輸入
tt.stop_loss_on=False    #關閉自動止損

#參數表說明:股票數據表,買點序列名稱,賣點序列名稱,返回獲利序列名稱
df2=tt.Trade_testing(mydf,'B','S','HL')   #開始回測
print('\n打印交易過程')
tt.PrintTrade()    #打印交易過程
print('\n打印持倉信息')
tt.PrintSecurity()   #打印持倉信息
print('\n 打印內部交易記錄信息')
print(tt.text)     #打印交易信息

##回測2
tt=hs.hpQuant()   ##初始化類
tt.stop_loss_on=True #允許止損
tt.stop_loss_range=0.05   #止損幅度
tt.code=code   #證券代碼,必須輸入
tt.stop_loss_on=False    #關閉自動止損
mydf=tt.Trade_testing(df2,'BT','S','HL2')   #開始回測

#數據裁減
m=1
mydf=mydf.tail(150*m).head(150).copy()

g.tabControl.select(g.tab5)

if g.UserCanvas!=None:
    g.UserPlot.cla() 
    g.UserPlot.close()
    g.UserCanvas._tkcanvas.pack_forget() 
    g.UserCanvas=None

######下面是繪圖
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
# 開啓一個雙圖例的窗口,定義爲211212
fig=plt.figure(2, figsize=(12,8), dpi=80)
g.UserFig=fig
g.UserPlot=plt
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)
ax_K(ax1,mydf,stockn,n=0)  
mydf['MID'].plot.line(legend=True)
mydf['UPPER'].plot.line(legend=True,linewidth=3)
mydf['LOWER'].plot.line(legend=True,linewidth=3)
mydf['M1'].plot.line(legend=True)
mydf['M2'].plot.line(legend=True)
mydf['MM'].plot.line(legend=True,linewidth=4)

# ax2(212窗口)
plt.sca(ax2)
mydf.HL.plot(color='orange', grid='on',legend=True)
mydf.HL2.plot(color='red', grid='on',legend=True)
mydf.B.plot(color='blue',legend=True)
mydf.S.plot(color='green',legend=True)
#添加標題
plt.title(stockn+'  獲利')
plt.legend() # 顯示圖中右上角的提示信息。
ax2.grid(True)
ax2.axhline(0, color='blue')
plt.close()
canvas =FigureCanvasTkAgg(fig, master=g.UserFrame)
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
g.UserCanvas=canvas
canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=1)

程序在小白量化中回測結果如下:
在這裏插入圖片描述
是不是與開始的程序結果一樣,我們修改股票代碼爲000155,回測圖如下:
在這裏插入圖片描述
輸出的信息,要在[工作臺]輸出窗口看。參見下圖。
在這裏插入圖片描述
在這裏插入圖片描述
購買《零基礎搭建量化投資系統――以Python爲工具》(https://item.jd.com/61567375505.html)一書,就能得到小白量化第二代全部源代碼。






請持續關注我的博客,我的進步,就是你的進步!

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