自己做量化交易軟體(42)小白量化實戰15--自編股票軟體公式歷史與聚寬量化平臺仿大智慧指標回測設計

2021-06-01 07:00:32

自己做量化交易軟體(42)小白量化實戰15–自編股票軟體公式歷史與聚寬量化平臺仿大智慧指標回測設計

在1997年以前,市面上已經出現了很多股票分析軟體。大多數軟體都整合好了一些常用指標,例如錢龍股票分析系統,海融股票分 析系統,匯金股票分析系統,操盤手等等,各式股票軟體,使用者在使用時可以簡單設定引數後,進行股票分析。例如改變均線指標引數 進行分析。
這些有固定指標的股票軟體,滿足不了股市中精明投資者的分析方法。因此出現了一些允許使用者自己編寫股票自編分析指標的股票 軟體。其中比較有名的能寫自編公式的股票軟體是《分析家》和《指南針》股票分析軟體。這些軟體一出現,聚集了大量使用者,一些會 寫股票分析指標的使用者,根據自己的經驗寫成自編公式賣給其他投資者。以前很多《分析家》和《指南針》自編公式等,網上叫賣數萬 人民幣。
隨著是時間的推移,股票行情接收卡(例如通視卡等)捆綁銷售,以及破解原因,有大量的《分析家》軟體使用者。另外《分析家》 自編股票公式語法最簡潔,因此有很多人在上面開發分析家公式。
由於分析家股票公式系統,支援C++公式擴充套件,因此有很多既會軟體開發,又懂投資分析的人員,例如荷蒲(百度:荷蒲公式,貔貅 公式)等,用C++開發出的指標,遠遠超越分析家軟體提供功能的股票分析應用,豐富了股票軟體創新。其中現在股軟所具備的基本功能 ,都是荷蒲在1999年以前所發明創造。例如股票文字提示,股票股評,資訊雷達,橫向統計,四方圖分析,預測日周成交量,交易機器 人指標等等。這些新分析技術的發明與分析家所支援的C++指標擴充套件開發,必不可少。C++公式開發,增強了分析家現有的分析指標和分 析工具。
1999年底,《飛狐交易師》測試版釋出,邀請荷蒲加入首席測試師,進行測試和提供改進意見。荷蒲提出分析家C++實現公式橫向統 計很不方便,希望飛狐交易師固化成基本功能。《飛狐交易師》吸收了網上的全部分析家公式系統的創新功能,一些荷蒲所開發的C++公 式函數,也整合為基本功能。例如判斷是否為最後一個週期ISLASTBAR,早期公式系統沒有類似功能函數,荷蒲用C++公式函數來實現的 。荷蒲開發分析家節氣函數,也包含在《飛狐交易師》函數。此外《飛狐交易師》還根據荷蒲等人建議,增加了自然日K線分析,周易分 析,農曆日期座標。此外根據荷蒲建議增加了指標函數雙變引數建議,一般指標第一個引數是序列,第2個引數是固定數值。例如MA (C,N),N引數在分析家中為固定數值。在《飛狐交易師》中為變化序列。儘管荷蒲用C++也實現了第二變參,使用起來不夠方便。《飛狐 交易師》一些函數可以使用第二變參,第三變參等等。例如MA(C,INT(C/10)),實現不定長均線。
《飛狐交易師》除了支援《分析家》公式原始碼,還支援分析家的C++公式檔案。因此荷蒲的分析家指標,能夠完美移植到《飛狐交易師 》。《飛狐交易師》自己C++介面,支援公式函數第二變參,第三變參等等。
資料序列移動,在投資分析上稱為「參照未來資料」,分析家原始函數只支援後參照REF(C,N)函數,荷蒲用C++開發了前參照REFX (C,N)函數,即今天指標值計算依賴明天其他指標計算資料。我初始設計不是為了所謂造假,因為我在分析家上利用此功能開發了一套「 龍霸指標操盤系統」,大戶莊家可用通過改變未來行情數值,預先看到未來行情指標走勢,可以給「技術指標派」挖坑騙線。《分析家 》軟體不能右移位畫K線,《飛狐交易師》可以右移位畫K線和指標。因此通過REFX()函數,預先設定未來幾日行情資料,例如CLOSE、 HIGH、LOW、VOL等等,通過右移位畫K線和指標,動態調整行情引數,可以看到使用者自編指標在此行情下的指標變化。如果未來主力控 制好行情價格,指標交叉等結果,就是主力的設想。能夠精確實現未來指標走勢控制的能力。
2000年後又出現了一些支援使用者自編指標公式的股票軟體,例如《通達信》、《同花順》、《大智慧》等軟體。開始這些軟體公司 的指標公式語法,都是自己新開發的,後來發現根本沒法跟《分析家》公式語法可比,因此《通達信》和《同花順》後來指標語法開始相容《分析家 》公式。
《大智慧》軟體公司於2006前後,收購了《分析家》,因此新一代大智慧就繼承了分析家核心,完美支援分析家公式和分析家C++開發的 公式。因此至今只有《飛狐交易師》和《大智慧》完美支援荷蒲1997年之今開發的C++指標(https://mp.weixin.qq.com/s/c9J-d30haP5nonU3bjiwSg)。1999年開發的主力進出C++指標,至 今還能在大智慧軟體中正常執行,指標演演算法,至今沒幾個人能破解。看我的部落格https://blog.csdn.net/hepu8/article/details/111996255
2016年用Python開發的人工智慧程式「阿法狗」圍棋軟體戰勝了人類專業棋手。作者編寫過圍棋軟體(百度:荷蒲圍棋),以傳統思路發展硬體和軟體在100年內,電腦無法戰勝人類,因為2的361次方遞迴計算是無法實現得的,電腦國際象棋依賴小型機的海量儲存和巨大計算潛能,才戰勝了人類優秀棋手。這些演演算法在圍棋上不可複製。
2016年人工智慧圍棋軟體戰勝人類專業棋手,讓作者看到了一道曙光,電腦人工智慧能在圍棋上戰勝人類棋手,那麼一定可以利用人工智慧軟體,編寫出全自動交易的賺錢的「搖錢樹」。
作者是仿分析家軟體指標公式編寫高手,自然想到將分析家軟體指標公式語法格式移植到Python量化軟體上了。因此由作者編寫的小白Python量化系統,利用Python的一維陣列,以及向量數學計算的特性,實現了仿分析家公式指標計算。
利用小白量化股股票公式函數模組,很容易將仿分析家公式指標移植到Python量化環境中。除了在小白量化系統中使用仿分析家自編公式指標計算外,還可以用於其他量化平臺。
移植步驟如下:

  1、你的自編指標先在通達信軟體或小白量化框架上回測調整到引數最優。
  2、你打算實戰時,就可以把這個指標移植到其他量化平臺了。
  3、把你的指標和指標所有的函數,都複製到你使用者策略的開頭,分析就可以採用仿分析家公式處理。
  4、在使用者交易函數中,進行仿分析家公式處理,來獲取買賣點。
  5、這種方式,可以把你的自編通達信指標,大智慧指標等,移植到任何量化平臺。

下面我們給出聚款平臺上的仿大智慧自編指標的回測程式碼。我們已自編公式KDJ指標為例子,讀者可以把指標替換為自己的自編指標公式來在聚寬量化平臺回測或實戰交易。
在這裡插入圖片描述
聚寬量化平臺回測仿大智慧指標回測程式碼如下:

#購買<零基礎搭建量化投資系統>正版書,送小白量化軟體原始碼。
# https://item.jd.com/61567375505.html
#獨狼荷蒲qq:2775205
#小白python量化群: 524949939
#小白python量化群2: 983815766
#電話微信:18578755056
#微信公眾號:獨狼股票分析

# 匯入函數庫
from jqdata import *
import pandas as pd  
import numpy  as np

##小白量化股票資料格式同ts舊版資料格式
## jqtots來源HP_data
def jqtots(df1):  #聚寬格式轉ts格式
    a=[x.strftime("%Y-%m-%d") for x in df1.index]
    df1.insert(0,'date',a)
    df1=df1.reset_index(level=None, drop=True ,col_level=0, col_fill='')  
    return df1

global CLOSE,LOW,HIGH,OPEN,VOL
##從小白量化公式函數庫中複製.
## 函數來源 HP_formula
def MA(Series, N):
    return pd.Series.rolling(Series, N).mean()

def HHV(Series, N=0):
    if N==0:
        return Series.cummax()
    else:
        return pd.Series(Series).rolling(N).max()

def LLV(Series, N=0):
    if N==0:
        return Series.cummin()
    else:
        return pd.Series(Series).rolling(N).min()

def EMA(Series, N):
    var=pd.Series.ewm(Series, span=N, min_periods=N - 1, adjust=True).mean()
    if N>0:
        var[0]=0
        #y=0
        a=2.00000000/(N+1)
        for i in range(1,N):
            y=pd.Series.ewm(Series, span=i, min_periods=i - 1, adjust=True).mean()
            y1=a*Series[i]+(1-a)*y[i-1]
            var[i]=y1
    return var

def CROSS(A, B):
    A2=np.array(A)
    var = np.where(A2<B, 1, 0)
    return (pd.Series(var, index=A.index).diff()<0).apply(int)
       
##下面開始寫使用者自編股票公式
def KDJ(N=9, M1=3, M2=3):
    global CLOSE,LOW,HIGH,OPEN,VOL
    """
    KDJ 隨機指標
    """
    RSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100
    K = EMA(RSV, (M1 * 2 - 1))
    D = EMA(K, (M2 * 2 - 1))
    J = K * 3 - D * 2
    return K, D, J


# 初始化函數,設定基準等等
def initialize(context):
    # 設定滬深300作為基準
    set_benchmark('000300.XSHG')
    # 開啟動態復權模式(真實價格)
    set_option('use_real_price', True)
    # 輸出內容到紀錄檔 log.info()
    log.info('初始函數開始執行且全域性只執行一次')
    # 過濾掉order系列API產生的比error級別低的log
    # log.set_level('order', 'error')

    ### 股票相關設定 ###
    # 股票類每筆交易時的手續費是:買入時佣金萬分之三,賣出時佣金萬分之三加千分之一印花稅, 每筆交易佣金最低扣5塊錢
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')

    ## 執行函數(reference_security為執行時間的參考標的;傳入的標的只做種類區分,因此傳入'000300.XSHG''510300.XSHG'是一樣的)
      # 開盤前執行
    run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')
      # 開盤時執行
    run_daily(market_open, time='open', reference_security='000300.XSHG')
      # 收盤後執行
    run_daily(after_market_close, time='after_close', reference_security='000300.XSHG')

## 開盤前執行函數
def before_market_open(context):
    # 輸出執行時間
    log.info('函數執行時間(before_market_open):'+str(context.current_dt.time()))

    # 給微信傳送訊息(新增模擬交易,並繫結微信生效)
    # send_message('美好的一天~')

    # 要操作的股票:(g.為全域性變數)
    g.security = '600519.XSHG'

## 開盤時執行函數
def market_open(context):
    global CLOSE,LOW,HIGH,OPEN,VOL
    current_date = context.current_dt.date()
    # 取得當前的現金
    cash = context.portfolio.available_cash
    log.info('函數執行時間(market_open):'+str(context.current_dt.time()))
    security = g.security
    # 獲取股票的收盤價
    df = get_price(security, start_date='2020-11-01', end_date=current_date, fields=['open', 'close', 'low', 'high', 'volume'])
    mydf=jqtots(df)
    CLOSE=mydf['close']
    LOW=mydf['low']
    HIGH=mydf['high']
    OPEN=mydf['open']
    VOL=mydf['volume']
    mydf['s80']=80
    
    k,d,j=KDJ()
    mydf['k']=k
    mydf['d']=d
    mydf['j']=k
    
    mydf['buy']=CROSS(k,d)   #k上穿d
    mydf['sell']=CROSS(mydf['s80'],k)  #k下穿80
    log.info(mydf)
    buy=list(mydf['buy'])
    sell=list(mydf['sell'])
    if buy[-1]>0:
        log.info('買')
    if sell[-1]>0:
        log.info('賣')

    # 如果上一時間點價格高出五天平均價1%, 則全倉買入
    if (buy[-1]>0) and (cash > 0):
        # 記錄這次買入
        log.info("價格高於均價 1%%, 買入 %s" % (security))
        # 用所有 cash 買入股票
        order_value(security, cash)
    # 如果上一時間點價格低於五天平均價, 則空倉賣出
    elif (sell[-1]>0) and context.portfolio.positions[security].closeable_amount > 0:
        # 記錄這次賣出
        log.info("價格低於均價, 賣出 %s" % (security))
        # 賣出所有股票,使這隻股票的最終持有量為0
        order_target(security, 0)


## 收盤後執行函數
def after_market_close(context):
    log.info(str('函數執行時間(after_market_close):'+str(context.current_dt.time())))
    #得到當天所有成交記錄
    trades = get_trades()
    for _trade in trades.values():
        log.info('成交記錄:'+str(_trade))
    log.info('一天結束')
    log.info('##############################################################')

程式執行結果如下圖。
在這裡插入圖片描述
此篇文章,說明小白量化的金融模組的廣泛用途,如果有空,我再給出其他量化平臺依賴小白量化模組實現仿大智慧和仿通達信指標的實現範例程式碼。

請持續關注我的部落格,我的進步,就是你的進步!