我是Mr.看海,我在嘗試用信號處理的知識積累和思考方式做量化交易,應用深度學習和AI實現股票自動交易,目的是實現財務自由~
目前我正在開發基于miniQMT的量化交易系統——看海量化交易系統。
本篇要講到量化的核心了——策略。說白了每個投資者在股市中都是有一套自己的經驗模式的,策略代碼是把這些經驗的固化,在排除掉人的情感的程序系統中運行。對于AI炒股,策略是實現人類思想與機器精密執行的橋梁,這就需要一個既符合用戶使用直覺,又能精確銜接量化交易系統的標準化框架。這種標準化的策略框架接口,可以為利用大型語言模型(如 DeepSeek)快速生成符合規范、能夠直接接入系統進行回測的策略代碼提供了極大的便利。
從一個交易思想到一個能在市場中穩定運行的自動化程序,中間往往隔著數據處理、接口對接、訂單管理、異常處理等一系列繁雜的工程細節。這不僅耗費開發者大量精力,也容易引入錯誤,從而模糊了策略研究與工程實現的界限。
KhQuant 量化交易系統深刻理解策略開發者的這一痛點,其核心目標之一便是提供一個高度封裝、標準化的策略框架。這個框架旨在將策略邏輯與底層執行細節解耦,讓開發者可以將主要的精力投入到策略本身的研發與優化上,而不是迷失在重復性的"輪子制造"中。
一、 框架的基石:標準化的事件處理函數
KhQuant 框架采用事件驅動模式。這意味著策略代碼并不是一個從頭跑到尾的腳本,而是一個包含了特定"回調函數"的 Python 模塊。框架在運行時,會監聽各種市場事件(如新的行情數據到達、交易時段開始/結束等),并在特定事件發生時,調用你策略模塊中對應的函數。你所要做的,就是在這些預定義的函數"坑"里,填入你的策略代碼。
這種設計極大地簡化了策略結構。你不再需要自己編寫復雜的事件循環、數據訂閱和時間管理邏輯。
KhQuant 的策略本質上是一個 Python 文件,其中主要的預定義函數有四個:
1.1 init:萬事開頭 - 策略初始化
調用時機:?在整個策略生命周期中,僅在點擊"啟動策略"按鈕,框架加載策略文件后,實際運行策略邏輯之前被調用一次。
核心職責:?執行所有只需要進行一次的設置和準備工作。這包括:
- 設置策略參數:?定義如移動平均線周期、交易閾值、止損比例等策略運行所需的固定參數。這些參數可以直接硬編碼,或更靈活地設計成從外部文件讀取(盡管 KhQuant 的 GUI 配置是更推薦的方式)。
- 初始化狀態變量:?如果策略需要在不同時間點之間傳遞狀態(例如,跟蹤上一次開倉的價格、記錄連續虧損次數等),需要在這里初始化用于存儲這些狀態的變量(通常是全局字典或類的成員變量)。
- 加載一次性數據:?如果策略需要某些啟動時就確定的、不隨時間變化的基礎數據(例如,某些股票的基本面信息),可以在這里加載。注意,對于歷史行情數據,框架通常會自動處理加載和緩存,策略層面一般無需在此處手動下載。
為何需要?init??它將一次性的設置代碼與需要反復執行的策略邏輯代碼分離開來。這不僅讓代碼結構更清晰、易于維護,也避免了在每次行情更新時都重復執行這些不必要的設置,提高了運行效率。
數據持久化:?init 函數本身不返回任何值。它設置的參數和狀態變量需要通過 Python 的作用域規則(如使用 global 關鍵字聲明全局變量,或將策略邏輯封裝在類中使用 self 屬性)來讓后續的 khHandlebar 等函數能夠訪問和修改。
1.2 khHandlebar:決策核心 - 響應市場變化
調用時機:?這是策略最核心、被調用最頻繁的函數。根據用戶在 GUI 中選擇的觸發模式(Tick 觸發、1 分鐘 K 線觸發、5 分鐘 K 線觸發或自定義時間點觸發),每當接收到新的符合條件的行情數據時,框架就會調用 khHandlebar。對于 K 線觸發,通常是在一根 K 線走完形成的那一刻觸發。
核心職責:?接收當前的市場快照和賬戶狀態,執行策略的核心計算和判斷,并決定是否需要進行交易。典型的執行流程包括:
- 數據提取:?從傳入的 data 字典中獲取當前時間、所需股票的最新行情(收盤價、最高/最低價等)、賬戶的可用資金、當前的實際持倉情況等。
- 指標計算:?基于獲取的行情數據(以及可能需要的歷史數據,通過 xtdata 接口獲取),計算技術指標(如 MA, MACD, RSI 等)或執行其他模型運算。
- 條件判斷:?根據計算出的指標和當前的持倉狀態,判斷是否滿足開倉、平倉或其他交易條件。
- 信號生成:?如果判斷結果需要交易,則調用輔助函數(如 generate_signal)或手動構建標準格式的交易信號字典。
為何需要?khHandlebar??它構成了策略對市場實時變化的響應機制。框架負責在正確的時間點,將所需的信息打包喂給這個函數,開發者只需專注于"輸入->計算->判斷->輸出信號"這一核心流程。
數據流:?接收框架傳入的 data 字典,返回一個包含零個或多個交易信號字典的列表(后邊詳解)。
1.3 khPreMarket/?khPostMarket:每日開盤前/收盤后執行
調用時機:?分別在每個 A 股交易日(由框架判斷,會跳過周末和法定節假日)的開盤前(具體時間可在 GUI 配置,如 08:30)和收盤后(具體時間可在 GUI 配置,如 15:30)被調用一次。
核心職責:
khPreMarket?(盤前):?適合執行每日開始時的準備工作。例如:
- 獲取當天需要關注的宏觀信息或新聞。
- 重新加載可能每日更新的配置文件或模型參數。
- 基于隔夜數據或盤前分析,調整當日交易參數或風險限制。
- 如果策略需要在集合競價或開盤時立即下單,可以在此生成交易信號。
khPostMarket?(盤后):?適合執行每日結束后的總結和維護工作。例如:
- 統計當日交易表現,計算盈虧、勝率等指標。
- 進行當日的風險評估和持倉分析。
- 保存重要的運行時數據或交易記錄到外部文件。
- 基于當日市場表現,更新機器學習模型或調整策略參數供次日使用。
- 生成交易總結報告并發送給用戶。
為何需要?khPreMarket/khPostMarket??它們提供了一種機制,將那些不需要在交易時間內高頻執行的、與交易日相關的例行任務,從核心的 khHandlebar 中剝離出來。這使得 khHandlebar 可以更專注于對實時行情做出快速反應,同時也讓整個策略的運作流程更加結構化和自動化。
數據流:?輸入的 data 字典主要包含調用時刻的時間、賬戶和持倉信息(注意,此時通常沒有實時的個股行情數據)。輸出同樣是標準格式的交易信號列表(允許在盤前/盤后生成交易指令,例如計劃在第二天開盤執行的指令)。
可選性:?如果你的策略非常簡單,不需要進行任何盤前盤后的特殊處理,那么完全可以不在策略文件中定義這兩個函數,框架會跳過調用。
二、 信息高速公路:詳解 data 字典
data 字典是 KhQuant 框架與策略之間信息傳遞的核心樞紐。它的設計目標是解決策略開發中數據來源分散、需要調用多個 API 獲取狀態的痛點,將當前時間點策略決策所需的關鍵信息集中打包提供。理解 data 字典的結構至關重要:
__current_time__?(字典):?提供精確的時間參考:
timestamp (整數): 標準 Unix 時間戳(秒級或毫秒級,取決于框架實現精度),便于進行時間相關的計算和比較。
datetime (字符串): 'YYYY-MM-DD HH:MM:SS' 格式,方便閱讀和日志記錄。
date (字符串): 'YYYY-MM-DD' 格式,常用于獲取日級別數據或按天處理邏輯。
time (字符串): 'HH:MM:SS' 格式,用于判斷具體交易時段。
__account__?(字典):?反映當前的資金賬戶狀態:
cash (浮點數):? 核心字段,指當前 可用于交易的現金余額。策略計算買入量時應主要基于此值。
total_asset (浮點數): 總資產,通常等于 cash + market_value。反映賬戶整體規模。
market_value (浮點數): 所有持倉按當前市價計算的總市值。
frozen_cash (浮點數): 因掛單等原因被凍結的資金。cash 通常是總現金減去 frozen_cash 后的結果。
__positions__?(字典):?提供詳細的當前實際持倉信息。鍵是股票代碼 (如 '000001.SZ'),值是包含該股票持倉詳情的字典:
對于每支持倉股票? stock_code?(字典):
volume (整數):? 當前總共持有該股票的數量。
can_use_volume (整數):? 核心字段,指當前 可以賣出的數量。它考慮了 T+1 規則(當天買入的股票當天不能賣出)以及可能的凍結(例如已掛賣單但未成交的部分)。策略計算賣出量時應基于此值。
avg_price (浮點數): 持倉成本價。
current_price (浮點數): 框架會盡力在調用策略前更新該股票的最新市場價格,方便計算盈虧和市值。
market_value (浮點數): 該持倉的當前市值 (current_price * volume)。
profit (浮點數): 該持倉的浮動盈虧。
股票代碼?(字典):?(主要在 khHandlebar 中出現)包含當前觸發事件的市場行情數據。鍵是具體的股票代碼。
close (浮點數): 對于 K 線觸發,這是一般是 K 線收盤價;對于 Tick 觸發,這是最新成交價。 這是策略中最常用的價格字段。
open, high, low (浮點數): K 線的開盤、最高、最低價。
volume, amount (整數/浮點數): K 線或 Tick 的成交量和成交額。
(其他字段): 用戶在 GUI "數據設置"中勾選訂閱的其他行情字段(如 pre_close, turnover_rate 等)也會在這里提供。
這種設計的好處在于,策略開發者在 khHandlebar 中幾乎可以通過簡單直觀的方式獲取所需的核心信息,極大地降低了與底層交互的復雜度。
三、 指令的規范:標準交易信號格式
當策略判斷需要執行交易時,它需要"告知"框架執行意圖。為了讓框架的交易管理器 (TradeManager) 能夠準確無誤地理解并執行,KhQuant 定義了標準化的交易信號格式。任何需要下單的函數 (khHandlebar, khPreMarket, khPostMarket) 都必須返回一個包含零個或多個這種標準信號字典的列表。
標準信號格式如下:
{"code": str, # 股票代碼 (必須是 '代碼.市場' 格式, e.g., "000001.SZ", "600000.SH")"action": str, # 交易動作 (必須是 "buy" 或 "sell")"price": float, # 下單價格 (框架會以此價格下限價單 Limit Order)"volume": int, # 下單數量 (必須是整數, 且通常是 100 的倍數)"reason": str, # 交易原因 (建議填寫,用于日志記錄和分析)"timestamp": int # 時間戳 (可選, 框架若發現缺失會自動補充當前時間戳)
}
字段詳解:
- code: 必須是精確的股票代碼,包含交易所后綴(.SZ 或 .SH)。錯誤的代碼會導致下單失敗。
- action: 明確指定是買入 (buy) 還是賣出 (sell)。
- price: 這是你期望成交的價格。框架會提交一個限價單 (Limit Order)?到交易所。如果當前市場價格優于(買單時更低,賣單時更高)或等于你的限價,訂單可能會立即成交;否則,訂單會進入掛單簿等待對手方撮合。注意:價格精度很重要,不正確的價格(如偏離市價過多、不符合價格籠子規則)可能導致廢單。generate_signal 函數會自動處理價格精度(通常保留兩位小數)。
- volume:?必須是整數,且對于 A 股,通常必須是?100 的整數倍(一手等于 100 股),除非是賣出時處理不足一手的零股。數量錯誤是導致下單失敗的常見原因。generate_signal 函數會自動計算并確保數量是 100 的倍數。
- reason: 雖然不是強制字段,但強烈建議填寫。它會被記錄在交易日志中,極大地幫助后續進行策略調試、績效分析和理解交易行為。一個好的 reason 應簡潔說明觸發該交易的條件。
- timestamp: 主要用于回測時精確對齊交易發生的時間點。實盤中如果省略,框架會使用當前系統時間戳。
遵循這個標準信號格式,可以確保策略的交易意圖被框架準確理解和執行,有效解決了策略開發者**"如何將策略判斷轉化為實際下單指令"以及"下單參數容易出錯"**的痛點。
四、 框架設計的核心優勢
總結來說,KhQuant 策略框架的設計旨在提供以下核心優勢,解決策略開發中的常見難題:
- 高度聚焦策略邏輯:?通過將底層細節(數據連接、API 調用、事件處理、訂單執行)封裝在框架內部,開發者可以將幾乎全部精力投入到交易策略本身的設計、實現和優化上,告別繁瑣的工程事務。
- 清晰的事件驅動模型:?框架自動處理時間的流逝和市場數據的更新,在恰當的時機調用對應的策略函數 (init, khHandlebar 等),使得策略代碼能夠自然地對市場事件做出反應,無需開發者手動管理復雜的事件循環。
- 標準化的開發范式:?預定義的函數接口 (init, khHandlebar...)、統一的數據輸入 (data 字典) 和標準的信號輸出格式,降低了學習曲線,使得不同開發者編寫的策略具有相似的結構,易于理解、維護和交流。
- 集中的信息獲取:?data 字典將決策所需的關鍵信息(時間、行情、賬戶、持倉)集中提供,避免了在策略代碼中分散調用各種查詢接口,簡化了策略邏輯。
- 靈活性與可擴展性:?雖然核心接口是標準化的,但策略文件本身是純粹的 Python 模塊。開發者可以在其中自由導入其他庫、定義自己的輔助函數、創建類來組織復雜邏輯,框架不限制策略內部的實現方式。
五、 事半功倍:khQTTools 策略輔助工具箱
為了讓策略開發更加高效和不易出錯,KhQuant 在 khQTTools.py 中提供了一系列精心設計的輔助函數。這些函數封裝了常見的、易錯的計算和操作,建議在策略中優先使用它們。
5.1 generate_signal函數
def generate_signal(data: Dict, stock_code: str, price: float, ratio: float, action: str, reason: str = "") -> List[Dict]:"""生成標準交易信號Args:data: 包含時間、賬戶、持倉信息的字典stock_code: 股票代碼price: 交易價格ratio: 交易比例 (買入時指占剩余現金比例,賣出時指占可賣持倉比例)action: 'buy' 或 'sell'reason: 交易原因Returns:List[Dict]: 包含單個信號的列表,或空列表"""
這是生成交易信號的首選函數。它完美解決了策略開發者在構建信號字典時**"買賣數量計算復雜且易錯"、"信號格式容易遺漏或錯誤"**的核心痛點。它可以實現:
- 買入 (action='buy'): 調用 calculate_max_buy_volume 函數,根據傳入的 ratio (資金使用比例) 和當前賬戶可用資金 (data['__account__']['cash']),以及考慮了交易成本后,計算出實際能買入的最大股數 (已向下取整至 100 的倍數)。
- 賣出 (action='sell'): 獲取當前該股票的可用持倉?(data['__positions__'][stock_code]['can_use_volume']),根據傳入的 ratio (持倉使用比例) 計算出要賣出的目標股數,并向下取整至 100 的倍數。
- 自動格式化:?自動填充 code, action, price (處理精度), volume (確保整數和手數)。如果未提供 reason,會生成一個默認的原因字符串。自動添加 timestamp。
- 健壯性:?如果計算出的可買/可賣數量為 0(資金不足、持倉不足、比例過低等),則返回空列表 [],并記錄警告日志,避免生成無效信號。
- 使用建議:?在 khHandlebar 中,一旦判斷需要交易,直接調用此函數獲取信號列表,然后返回即可。
- 示例:?signals = generate_signal(data, '000001.SZ', 10.5, 0.5, 'buy', '價格突破,半倉買入')
5.2 其他工具
khQTTools.py 還包含如 is_trade_day(date_str)(判斷是否為交易日)、is_trade_time()(判斷是否在交易時間段內)等實用函數,進一步簡化策略中的常見判斷。
六、說明
上述介紹的是khQuant 策略框架的 1.0 版本。隨著實踐經驗的積累和用戶反饋的收集,框架的定義和接口后續也有可能會有所調整和優化。所有重要的更新和版本迭代信息,我們都會在 KhQuant 的官方網站或相關文檔庫中進行實時更新和詳細說明,敬請關注。
為了進一步降低量化交易的門檻,后續計劃設計一套與 KhQuant 框架緊密結合的系統提示詞。讓開發者能夠通過自然語言描述交易思想,借助 DeepSeek 等先進的大型語言模型,快速生成符合 KhQuant 框架規范、可直接運行和回測的策略代碼雛形,加速從想法到驗證的過程。
七、下一步考慮
后邊還有幾件事要做,做完后回測系統就可以跟大家見面了:
- 策略的項目化管理設置
- 日志管理
- 與成熟的回測軟件(比如QMT)進行相同策略的對比,以驗證軟件的有效性
因此,目前的回測系統還不滿足放出來給大家使用的狀態,待測試穩定后,快捷的安裝包版本以及全部開源代碼都會放出來給讀者朋友們使用。
近期我盡量加快軟件和文章更新的頻率,盡早讓朋友們使用上這個軟件。
end、開通miniQMT
升級后的數據下載模塊會隨著后續回測系統的發布一同更新發布。
上述講到的系統是基于miniQMT,很多券商都可以開通miniQMT,不過門檻各有不同,很多朋友找不到合適的券商和開通渠道。這里我可以聯系券商渠道幫忙開通,股票交易費率是萬1,開通成功的朋友都可以免費使用上邊開發的“看海量化交易系統”。這個系統還在持續開發的過程中,數據下載的功能已經可以使用,回測部分正在加緊開發,大家可以先開通MiniQMT的權限,這樣回測部分的功能放出后就能第一時間用上了~
對于想要開通miniQMT、使用上邊開發的“看海量化交易系統”的朋友們,請大家關注一下我的公眾號“看海的城堡”,在公眾號頁面下方點擊相應標簽即可獲取。
相關文章
【深度學習量化交易1】一個金融小白嘗試量化交易的設想、暢享和遐想
【深度學習量化交易2】財務自由第一步,三個多月的嘗試,找到了最合適我的量化交易路徑
【深度學習量化交易3】為了輕松免費地下載股票歷史數據,我開發完成了可視化的數據下載模塊
【深度學習量化交易4】 量化交易歷史數據清洗——為后續分析掃清障礙
【深度學習量化交易5】 量化交易歷史數據可視化模塊
【深度學習量化交易6】優化改造基于miniQMT的量化交易軟件,已開放下載~(已完成數據下載、數據清洗、可視化模塊)
【深度學習量化交易7】miniQMT快速上手教程案例集——使用xtQuant進行歷史數據下載篇
【深度學習量化交易8】miniQMT快速上手教程案例集——使用xtQuant進行獲取實時行情數據篇
【深度學習量化交易9】miniQMT快速上手教程案例集——使用xtQuant獲取基本面數據篇
【深度學習量化交易10】miniQMT快速上手教程案例集——使用xtQuant獲取板塊及成分股數據篇
【深度學習量化交易11】miniQMT快速上手教程——使用XtQuant進行實盤交易篇(一萬七千字超詳細版本)
【深度學習量化交易12】基于miniQMT的量化交易框架總體構建思路——回測、模擬、實盤通吃的系統架構
【深度學習量化交易13】繼續優化改造基于miniQMT的量化交易軟件,增加補充數據功能,優化免費下載數據模塊體驗!
【深度學習量化交易14】正式開源!看海量化交易系統——基于miniQMT的量化交易軟件
【深度學習量化交易15】基于miniQMT的量化交易回測系統已基本構建完成!AI炒股的框架初步實現
【深度學習量化交易16】韭菜進階指南:A股交易成本全解析
【深度學習量化交易17】觸發機制設置——基于miniQMT的量化交易回測系統開發實記
【深度學習量化交易18】盤前盤后回調機制設計與實現——基于miniQMT的量化交易回測系統開發實記
【深度學習量化交易19】行情數據獲取方式比測(1)——基于miniQMT的量化交易回測系統開發實記
【深度學習量化交易20】量化交易策略評價指標全解析——基于miniQMT的量化交易回測系統開發實記
【深度學習量化交易21】行情數據獲取方式比測(2)——基于miniQMT的量化交易回測系統開發實記
【AI量化第22篇】如何輕松看懂回測結果——基于miniQMT的量化交易回測系統開發實記
【AI量化第23篇】數據下載/補充模塊升級,并與回測系統正式集成——基于miniQMT的量化交易回測系統開發實記