現(xiàn)有量化投研平臺的缺陷——工程師的設(shè)計

相對于本地化的投研平臺,基于Web的投研平臺具有先天的優(yōu)勢。

  • 無需準(zhǔn)備基礎(chǔ)數(shù)據(jù)
  • 標(biāo)準(zhǔn)化的編碼工具
  • 足量的計算資源。
  • ……

這些都會提高策略研發(fā)過程的效率。

可惜的是,現(xiàn)有在線投研平臺大都犯了一個錯誤(包括知名平臺),那就是“工程師的設(shè)計”。

這要從對于投研人員的要求說起。

對于一名量化投研人員,有哪些基本要求呢?

  1. 懂金融知識
  2. 懂開發(fā)語言(Java、Python、Matlab等)

而現(xiàn)有的大多數(shù)投研人員,是金融背景,金融知識了解的比較多,在校期間用Matlab比較多,程序開發(fā)基礎(chǔ)比較弱。但是,現(xiàn)有的SDK大多是程序研發(fā)人員制作的,因此,現(xiàn)有SDK的設(shè)計,更多是從功能出發(fā)的“工程師的設(shè)計”,而非從關(guān)注金融意義出發(fā)的設(shè)計。

什么是工程師的設(shè)計

舉個簡單的例子。

現(xiàn)有的SDK,基本都提供了標(biāo)準(zhǔn)的數(shù)據(jù)取用Function。在開發(fā)策略的時候,通過這些接口方法可以直接獲取到標(biāo)準(zhǔn)化的數(shù)據(jù)。通常,得到的數(shù)據(jù)是一個二維矩陣的形式。如果是基于Python的平臺,得到的數(shù)據(jù)可能是基于numpy包的Array,或者基于pandas包的DataFrame。

但是,這只是基礎(chǔ)數(shù)據(jù)。在編寫策略的時候,我們就需要對矩陣進行最基本的運算,如切片、轉(zhuǎn)置、相加、相乘等。至于這些操作,SDK通常是沒有提供標(biāo)準(zhǔn)化Function的,需要用戶自己學(xué)習(xí)numpy、pandas或者其他包來實現(xiàn)。

所以,以現(xiàn)有的SDK來開發(fā)策略,代碼邏輯基本是這樣的:

process.png

當(dāng)我們熟悉了這一流程之后,似乎整個過程行云流水,也符合功能的封裝要求,沒什么問題。

但是,問題就出在這里。如果你覺得單從策略的編碼實現(xiàn)考慮,整體流程很順暢,甚至沒有太多的學(xué)習(xí)成本,說明你的開發(fā)基礎(chǔ)很好,甚至本身就是技術(shù)研發(fā)背景。但是對于偏向金融背景的人員,雖然數(shù)據(jù)的處理對他們來說沒有太大障礙,可他們的開發(fā)能力沒這么好,不能很快把金融上的交易邏輯抽象為程序開發(fā)中的方法調(diào)用邏輯。

因此,現(xiàn)存SDK的問題就在于,將一個金融相關(guān)的過程,按照技術(shù)架構(gòu)拆解,從而形成了Function的封裝和調(diào)用邏輯。這樣做的一個最直接的惡果就是,代碼量翻倍增加。

優(yōu)化的SDK設(shè)計

前面已經(jīng)給出了基于技術(shù)封裝的大體模式。雖然不夠好,但確實是一種對于策略的基本封裝模式,可以算是對SDK探索的第一步。那更好的SDK設(shè)計應(yīng)該長什么樣呢?

更好的設(shè)計,應(yīng)該是在“技術(shù)封裝”的基礎(chǔ)之上,再進行“金融封裝”。封裝之后的SDK,應(yīng)該包含以下幾方面:

  1. 標(biāo)準(zhǔn)化的基本運算的標(biāo)準(zhǔn)化Func
    例如:矩陣的切片、相加、相乘、轉(zhuǎn)置、求逆矩陣等等。

  2. 常用的金融計算的標(biāo)準(zhǔn)化Func
    例如:求MA、IC、IR,計算移動均線上穿,股票篩選等等。

這樣的設(shè)計,在大多數(shù)情況下,用戶不再需要自己組織代碼處理原始數(shù)據(jù)、計算基本指標(biāo)、做邏輯判斷等,可以用最簡練的代碼實現(xiàn)最核心的策略邏輯。其他的工作,交給SDK和背后的服務(wù)器搞定。

下面就來比較一下,優(yōu)化前后,策略代碼的變化是什么。

優(yōu)化前的策略是這樣的,這也是最簡化的形式了:

    import numpy as np
    import pandas as pd
    # 更多的包引用
    import sdk

    def data_init(**args):  # 數(shù)據(jù)初始化方法
        # 數(shù)據(jù)處理代碼
        return data

    def buy(**args):    # 買入方法
        # 買入代碼

    def sell(**args):   # 賣出方法
        # 賣出代碼

    def handler(**args):            # 處理程序,通常是回測時系統(tǒng)周期性的調(diào)用
        data = data_init(init_args) # 初始化數(shù)據(jù)
        if buy_condition:           # 如果買入條件成立
            buy(buy_args)           # 調(diào)用買入方法
        if sell_condition:          # 如果賣出條件成立
            sell(sell_args)         # 調(diào)用賣出方法

但優(yōu)化之后的SDK,最簡單的形式應(yīng)該是這樣的(以MA5和MA10組成的雙均線策略為例):

    import sdk

    def handler(**args):            # 處理程序,通常是回測時系統(tǒng)周期性的調(diào)用
        zongshangsufuncs.market.cross_up(   \\              # 上穿
            funcs.market.ma(data.market.close, 5),  \\  # 用收盤價計算MA5
            funcs.market.ma(data.market.close, 10), \\  # 用收盤價計算MA10
            funcs.trade.buy \\                  # 如果上穿,執(zhí)行買入
        )
        funcs.market.cross_up(  \\              # 下穿
            funcs.market.ma(data.market.close, 5),  \\  # 用收盤價計算MA5
            funcs.market.ma(data.market.close, 10), \\  # 用收盤價計算MA10
            funcs.trade.sell    \\                  # 如果下穿,執(zhí)行賣出
        )

不同的視角

綜上所述,這個平臺并沒有從實際使用者的角度去設(shè)計。

實際的用戶,開發(fā)和金融能力都處在入門水平,面對復(fù)雜的SDK和冗長的策略代碼,會望而卻步。也因此,這樣設(shè)計的最大壞處,其實是提高用戶的學(xué)習(xí)成本,也就削弱了產(chǎn)品的運營屬性。跟用戶溝通之后做了統(tǒng)計,當(dāng)簡單策略的代碼行數(shù)在5行以內(nèi)時,有73.45%的用戶愿意嘗試一下;當(dāng)行數(shù)增加到10行是,只有20.23%用戶愿意嘗試,并且這些用戶多少有一些開發(fā)的背景。當(dāng)代碼行數(shù)超過20行的時候,就沒人在愿意上手嘗試了。


約稿、合著等,請聯(lián)系laurieliyang@163.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容