自己做量化交易軟體(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
#公眾號:獨狼股票分析
#使用者請同意最后<著作權宣告>
#最后修改日期:2021年01月24日
"""
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 #用來正常顯示負號
# 開啟一個雙圖例的視窗,定義為211和212
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)一書,就能得到小白量化第二代全部源代碼,
請持續關注我的博客,我的進步,就是你的進步!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/252196.html
標籤:區塊鏈
