Python量化交易入門進(jìn)階指南(全)
量化,簡(jiǎn)單說就是程序+交易→盈利。
程序員 ,或許內(nèi)心深處都懷揣著一個(gè)量化投資的夢(mèng)想,渴望憑借自己的編程和人工智能技能,再補(bǔ)點(diǎn)基礎(chǔ)的金融知識(shí),我們便可以構(gòu)建一個(gè)量化交易系統(tǒng),輕松實(shí)現(xiàn)財(cái)富自由 。這樣的理想確實(shí)誘人,似乎讓我們看到了輕松實(shí)現(xiàn)個(gè)人價(jià)值的可能性,也讓我們看到了用代碼改變世界的力量。

不過丑話說在前面,“錢難掙屎難吃”,量化交易也是一樣。這領(lǐng)域的風(fēng)險(xiǎn)、機(jī)遇肯定都不會(huì)少,當(dāng)然水的深淺可能要試了才知道,我只是小韭菜,對(duì)量化的認(rèn)識(shí)肯定有不到位的地方,而本篇入門文章就當(dāng)作拋磚引玉。
回到正文,對(duì)于量化交易,神秘感還是滿滿的,相關(guān)的介紹比較零散,很多就是一上來就是屠龍之術(shù),告訴你一個(gè)看上去很牛逼的策略,很難系統(tǒng)地了解整個(gè)概念及流程。在此,本文系統(tǒng)梳理量化交易的基本概念,實(shí)踐過程,并附上相關(guān)資料/代碼,為quant小白填填坑。先說重要的事,加微信號(hào)【Ai_Algorithms】,回復(fù)【量化】 可加量化交流群及獲取資料!
1、量化交易的概念
投機(jī)如山岳一樣古老,華爾街沒有新鮮事
在研究量化投資策略之前,建議補(bǔ)充下相關(guān)的金融知識(shí)(可以百度下各種名詞術(shù)語),有空可以再讀幾本金融理財(cái)方面經(jīng)典的書,可以形成一些金融市場(chǎng)基本的概念,養(yǎng)成一些投資理念。
- 價(jià)值 : 我對(duì)投資的思考
- 富爸爸窮爸爸
- 投資中最簡(jiǎn)單的事
- 投資最重要的事
- 指數(shù)基金投資指南 -- ETF
- 隨機(jī)漫步的傻瓜 : 發(fā)現(xiàn)市場(chǎng)和人生中的隱藏機(jī)遇
- 聰明的投資者
- 證券分析 -- 格雷厄姆
- 巴菲特致股東的信
-
窮查理寶典 : 查理?芒格智慧箴言錄

量化交易, 相較于傳統(tǒng)人為主觀投資,本質(zhì)并沒有區(qū)別。簡(jiǎn)單來說,通過程序選出合適的股票(或其他),在合適的時(shí)機(jī),發(fā)起買入或賣出的交易,從中追求盈利。
量化沒有創(chuàng)造出新的投資邏輯,也不改變市場(chǎng)的運(yùn)行和結(jié)構(gòu),但它用新的科學(xué)技術(shù)、對(duì)實(shí)現(xiàn)方法和工具進(jìn)行了創(chuàng)新——利用了數(shù)學(xué)統(tǒng)計(jì)/人工智能等方法取代人工決策。一般情況,市場(chǎng)研究、基本面分析、選股、擇時(shí)、下單等都可以由計(jì)算機(jī)自動(dòng)完成,在市場(chǎng)進(jìn)行投資。
而量化投資的核心優(yōu)勢(shì)在于:通過計(jì)算機(jī)分析挖掘因子的能力更強(qiáng),可以從低信噪比的大數(shù)據(jù)中獲取有價(jià)值的信息,可以更好量化風(fēng)險(xiǎn)及收益,決策也更為及時(shí)及客觀可靠,可以克服情緒及人為操作的局限性。
2、量化交易的市場(chǎng)
量化投資廣泛地出現(xiàn)在各種交易市場(chǎng),如股市、期貨、基金、期權(quán)、外匯、債券、比特幣、NFT等等,有資源交換需求的地方就可以量化交易。這里主要展開介紹下股票和期貨市場(chǎng)。
2.1 股市
股票市場(chǎng):是股票發(fā)行和交易的場(chǎng)所,是已經(jīng)發(fā)行的股票轉(zhuǎn)讓、買賣和流通的場(chǎng)所。股份公司通過面向社會(huì)發(fā)行股票,迅速集中大量資金,實(shí)現(xiàn)生產(chǎn)的規(guī)模經(jīng)營。而社會(huì)資金也可以購買股份公司的股票,謀求財(cái)富的增值。

國內(nèi)股票市場(chǎng)(簡(jiǎn)稱A股)更多的是融資市場(chǎng)的角色,而不是投資市場(chǎng)。主要是為融資服務(wù),賣力IPO,穩(wěn)定地助力實(shí)體經(jīng)濟(jì)。(也難怪大A投資層面比較拉胯,畢竟市場(chǎng)的態(tài)度就在這。。)
再者,國內(nèi)市場(chǎng)上各種面的分析,諸如基本面分析、技術(shù)面、市場(chǎng)面、政策面,各種面都很好,但在我們A股都不夠(流淚吃面是大A韭菜的必備休養(yǎng)?。8鞣N理論也是層出不窮,比如纏論、莊家理論、以及美股推崇的長期價(jià)值理論,盡管都很有道理,但經(jīng)不住現(xiàn)實(shí)A股的打擊。
歸根結(jié)底在于,「市場(chǎng)的核心還是基于信息差,真正重要的信息你獲取不到的,可能很多還是制造烏煙瘴氣的煙霧彈。 只能寄望更好的經(jīng)濟(jì)預(yù)期,以及信息披露及制度完善,打造一個(gè)更公平的市場(chǎng)吧! 」
那股票量化能不能賺錢? 個(gè)人感覺量化會(huì)比散戶有優(yōu)勢(shì)(并不是絕對(duì)優(yōu)勢(shì))。 畢竟股票量化的盈利來源和其他市場(chǎng)上的參與者,并無本質(zhì)區(qū)別,主要可以歸因成幾個(gè)部分:
2.2 期貨市場(chǎng)
期貨合約(Futures contract),簡(jiǎn)稱期貨(Futures),是一種跨越時(shí)間的交易方式。買賣雙方透過簽訂合約,同意按指定的時(shí)間、價(jià)格與其他交易條件,交收指定數(shù)量的現(xiàn)貨。通常期貨集中在期貨交易所,以標(biāo)準(zhǔn)化合約進(jìn)行買賣,但亦有部分期貨合約可透過柜臺(tái)交易進(jìn)行買賣,稱為場(chǎng)外交易合約。交易的資產(chǎn)通常是商品或金融工具。期貨的品種有:
- 農(nóng)產(chǎn)品期貨:如棉花、大豆、小麥、玉米、白糖等。
- 金屬期貨:如銅、鋁、錫、鋅、鎳、黃金、白銀。
- 能源期貨:如原油、汽油、燃料油。
-
金融期貨: 如國債期貨、股指期貨。(注: 金融期貨的波動(dòng)性及風(fēng)險(xiǎn)相對(duì)較大)
一樣的,期貨市場(chǎng)在于買賣期貨賺取差價(jià)。但與股市不同,期貨市場(chǎng)的投資操作空間更多(可以做多、做空;支持T+0交易等等),同時(shí)杠桿也更大,回撤大,風(fēng)險(xiǎn)高,風(fēng)險(xiǎn)收益可能也高。
個(gè)人的感覺,期貨是一個(gè)負(fù)和博弈市場(chǎng),贏得收益主要來自市場(chǎng)中對(duì)手的失誤,贏的只有少數(shù)信息優(yōu)勢(shì)的人??赡?/span>期貨更適合行業(yè)人員,需要敏銳地捕捉行業(yè)的機(jī)遇。再者通過期現(xiàn)套利對(duì)沖實(shí)業(yè)經(jīng)營的風(fēng)險(xiǎn)也是很不錯(cuò)的手段。
3、量化交易常見策略
量化策略的方法有五花八門的,搞簡(jiǎn)單點(diǎn)可以通過基本面、技術(shù)面分析獲得一些因子進(jìn)行交易(比如股票猛漲并且近期有所收緩,利用相關(guān)指標(biāo)簡(jiǎn)單設(shè)定一個(gè) RSI大于80就拋出股票),復(fù)雜點(diǎn)還可以利用各種各樣數(shù)據(jù),結(jié)合人工智能分析預(yù)測(cè)、高頻交易什么的。

這里我按照個(gè)人不深刻的理解,如下 歸類大概量化策略:
A. 多因子選股模型: 用“因子”來識(shí)別股票和市場(chǎng)的特征,在因子的幫助下評(píng)估價(jià)格,買入價(jià)格偏低的,賣出價(jià)格偏高的股票。比如根據(jù)RSI設(shè)計(jì)一個(gè)反轉(zhuǎn)因子,RSI非常高,過度高漲,后面可能就容易跌。再根據(jù)過去時(shí)間T內(nèi)的加權(quán)平均漲幅設(shè)計(jì)動(dòng)量因子,通過結(jié)合多個(gè)因子做打分/回歸建模預(yù)測(cè)未來收益。
? 常見的因子有:?
- 價(jià)值因子:市盈率、市凈率、現(xiàn)金流等財(cái)務(wù)指標(biāo)(估值低的票容易漲)
- 成長因子:過去三年期間的凈利潤和營收的復(fù)合增長率(高增長的票容易漲)
- 動(dòng)量因子:過去時(shí)間T內(nèi)的加權(quán)平均漲幅(趨勢(shì)是否確立)
- 波動(dòng)率因子:如果股票的波動(dòng)率偏低,它后續(xù)往往會(huì)漲(市場(chǎng)風(fēng)險(xiǎn)偏好)
- 流動(dòng)性因子:如果股票的換手率偏低,它后續(xù)往往會(huì)漲(縮量筑底)
- 情緒因子:如果統(tǒng)計(jì)分析顯示,市場(chǎng)參與者普遍偏樂觀,一般會(huì)漲
- 資金流因子:如果大盤、板塊、個(gè)股持續(xù)有資金流入,往往會(huì)漲
- 板塊因子:如果一個(gè)板的熱點(diǎn)股票漲了,往往整個(gè)板塊的股票都會(huì)漲。
- 盤口因子:在十檔盤口上,如果買掛單比賣掛單強(qiáng)勢(shì),短期往往會(huì)漲
- 反轉(zhuǎn)因子,通俗地說,就是漲多了的股票可能要跌,跌多了的股票可能要漲。(來源:幻方量化18問)
市場(chǎng)常見的多因子模型有:

B. 價(jià)值投資策略: 通過基本面分析,如市盈率、市凈率、現(xiàn)金流、凈利潤和營收的復(fù)合增長率等財(cái)務(wù)指標(biāo),分析公司的盈利模式是否可靠,預(yù)估未來價(jià)值,在價(jià)格較低的時(shí)候考慮買入。
C. 事件驅(qū)動(dòng)策略: 及時(shí)根據(jù)政策變化(貨幣政策、外匯、行業(yè)政策)、自然因素變化制定對(duì)應(yīng)策略,這個(gè)應(yīng)該是炒股、期貨必知策略。比如:當(dāng)有加息計(jì)劃,大家就會(huì)考慮把股票的錢存銀行,獲得更多無風(fēng)險(xiǎn)利益,可能要適當(dāng)減持些股票;當(dāng)有自然災(zāi)害,可能農(nóng)作物期貨價(jià)值就會(huì)上升,可以做多。
D. 對(duì)沖策略: 通過投資組合的多樣化來降低市場(chǎng)風(fēng)險(xiǎn)的策略。對(duì)沖策略的核心思想是利用不同資產(chǎn)之間的價(jià)格波動(dòng)來抵消彼此的風(fēng)險(xiǎn),從而降低整體投資組合的風(fēng)險(xiǎn)。對(duì)沖策略的具體操作方式有很多種,包括配對(duì)交易、套利交易、期權(quán)交易、alpha對(duì)沖等。比如經(jīng)典的配對(duì)交易對(duì)沖策略,當(dāng)兩個(gè)合約有很強(qiáng)的相關(guān)性時(shí),可能存在相似的變動(dòng)關(guān)系,兩種合約之間的價(jià)差會(huì)維持在一定的水平上。當(dāng)市場(chǎng)出現(xiàn)變化時(shí),兩種合約之間的價(jià)差會(huì)偏離均衡水平。此時(shí),可以買入其中一份合約同時(shí)賣出其中一份合約,當(dāng)價(jià)差恢復(fù)到正常水平時(shí)平倉,獲取收益。
E. 高頻交易策略: 其核心思想是利用市場(chǎng)價(jià)格的短期波動(dòng)來獲取利潤。通過高頻數(shù)據(jù)分析和預(yù)測(cè),投資者可以快速地買入和賣出股票、期貨和其他金融產(chǎn)品,以捕捉微小的價(jià)格差異和波動(dòng)。這種策略通常依賴于高速交易系統(tǒng)和算法,以在毫秒或更短的時(shí)間內(nèi)執(zhí)行交易決策,具有較高的交易頻率和風(fēng)險(xiǎn),但同時(shí)也具有較高的潛在收益。
F. 量化擇時(shí)策略: 通過分析歷史數(shù)據(jù)、市場(chǎng)趨勢(shì)、投資者情緒等因素,預(yù)測(cè)未來的市場(chǎng)走勢(shì),做為投資決策。常用的有趨勢(shì)擇時(shí)、市場(chǎng)情緒擇時(shí)、牛熊線、神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)、統(tǒng)計(jì)套利等方法。比如經(jīng)典的雙均線趨勢(shì)跟蹤策略,當(dāng)近短期上升趨勢(shì)比之前有所突破就可以考慮入手,反之可以考慮拋出。如下附上經(jīng)典的雙均線策略示例:
量化策略設(shè)計(jì)開發(fā)中, P ython編程的入門并不難(可以參考- Python人工智能學(xué)習(xí)路線 的Python學(xué)習(xí)建議),前期 編程 只要入門夠用就行了, 只有 交易的思路才是始終的核心! 我們除了積累交易經(jīng)驗(yàn)、學(xué)習(xí)經(jīng)典策略,還可以研究各大公司的 研報(bào) ,學(xué)習(xí)前沿的策略設(shè)計(jì),才比較有可能跟得上市場(chǎng)。(有時(shí)找ChatGPT聊聊策略,激發(fā)些思路也是不錯(cuò)~)#encoding:gbkimport pandas as pdimport numpy as npimport datetime
"""示例說明:當(dāng)短期均線由上向下穿越長期均線時(shí)做空當(dāng)短期均線由下向上穿越長期均線時(shí)做多策略講解:https://www.myquant.cn/docs/python_strategyies/153"""
class a():passA = a() #創(chuàng)建空的類的實(shí)例 用來保存委托狀態(tài)#ContextInfo對(duì)象在盤中每次handlebar調(diào)用前都會(huì)被深拷貝, 如果調(diào)用handlebar的分筆不是k線最后分筆 ContextInfo會(huì)被回退到深拷貝的內(nèi)容 所以ContextInfo不能用來記錄快速交易的信號(hào)
def init(C):# 回測(cè)代碼A.acct = '88'A.acct_type= "STOCK"A.stock= C.stockcode + '.' + C.market #品種為模型交易界面選擇品種#A.acct= account #賬號(hào)為模型交易界面選擇賬號(hào)#A.acct_type= accountType #賬號(hào)類型為模型交易界面選擇賬號(hào)A.amount = 10000 #單筆買入金額 觸發(fā)買入信號(hào)后買入指定金額A.line1=5 #快線周期A.line2=20 #慢線周期A.waiting_list = [] #未查到委托列表 存在未查到委托情況暫停后續(xù)報(bào)單 防止超單A.buy_code = 23 if A.acct_type == 'STOCK' else 33 #買賣代碼 區(qū)分股票 與 兩融賬號(hào)A.sell_code = 24 if A.acct_type == 'STOCK' else 34#設(shè)置股票池 訂閱品種行情C.set_universe([A.stock])print(f'設(shè)置雙均線{A.line1},{A.line2}實(shí)盤示例{A.stock} {A.acct} {A.acct_type} 單筆買入金額{A.amount}')def handlebar(C):#跳過歷史k線if not C.is_last_bar() : #回測(cè)print('is last null')returnnow = datetime.datetime.now()now_time = now.strftime('%H%M%S')#跳過非交易時(shí)間if now_time < '093000' or now_time > "150000":print('非交易時(shí)間')return# 獲取賬戶信息#print(get_trade_detail_data(A.acct, A.acct_type, "account"))#print(get_trade_detail_data(A.acct, A.acct_type, "ACCOUNT"))account = get_trade_detail_data(A.acct, A.acct_type, "account")if len(account)==0:print(f'賬號(hào){A.acct} 未登錄 請(qǐng)檢查')returnaccount = account[0]available_cash = int(account.m_dAvailable)#如果有未查到委托 查詢委托if A.waiting_list:found_list = []orders = get_trade_detail_data(A.acct, A.acct_type, 'order')print('wait-orders',A.waiting_list,orders)for order in orders:if order.m_strRemark in A.waiting_list:found_list.append(order.m_strRemark)A.waiting_list = [i for i in A.waiting_list if i not in found_list]A.waiting_list = [] #回測(cè)修改為0if A.waiting_list:print(f"當(dāng)前有未查到委托 {A.waiting_list} 暫停后續(xù)報(bào)單")returnholdings = get_trade_detail_data(A.acct, A.acct_type, 'position')#print('holdings',holdings)holdings = {i.m_strInstrumentID + '.' + i.m_strExchangeID : i.m_nCanUseVolume for i in holdings}#print('holdings',holdings)####核心邏輯代碼# 獲取行情數(shù)據(jù) 1ddata = C.get_history_data(max(A.line1, A.line2)+1, '1d', 'close',dividend_type='front_ratio')close_list = data[A.stock]if len(close_list) < max(A.line1, A.line2)+1:print('行情長度不足(新上市或最近有停牌) 跳過運(yùn)行')returnpre_line1 = np.mean(close_list[-A.line1-1: -1])pre_line2 = np.mean(close_list[-A.line2-1: -1])current_line1 = np.mean(close_list[-A.line1:])current_line2 = np.mean(close_list[-A.line2:])## # 舊短大于舊長 新短小于新長 死叉拋;舊短小于舊長 新短大于新長 自下而上穿均線金叉入#如果快線穿過慢線,則買入委托 當(dāng)前無持倉 買入vol = int(A.amount / close_list[-1] / 100) * 100 #買入數(shù)量 向下取整到100的整數(shù)倍if A.amount < available_cash and vol >= 100 and A.stock not in holdings and pre_line1 < pre_line2 and current_line1 > current_line2:#下單開倉 ,參數(shù)說明可搜索PY交易函數(shù) passordermsg = f"雙均線實(shí)盤 {A.stock} 上穿均線 買入 {vol}股"passorder(A.buy_code, 1101, A.acct, A.stock, 14, -1, vol, '雙均線實(shí)盤', 1 , msg, C)print(msg)A.waiting_list.append(msg)#如果快線下穿慢線,則賣出委托if A.stock in holdings and holdings[A.stock] > 0 and pre_line1 > pre_line2 and current_line1 < current_line2:msg = f"雙均線實(shí)盤 {A.stock} 下穿均線 賣出 {holdings[A.stock]}股"passorder(A.sell_code, 1101, A.acct, A.stock, 14, -1, holdings[A.stock], '雙均線實(shí)盤', 1 , msg, C)print(msg)A.waiting_list.append(msg)
特別地,對(duì)于新手而言,個(gè)人覺得先學(xué)習(xí)寫一個(gè)止盈止損策略是門必修課,先學(xué)會(huì)如何控制好風(fēng)險(xiǎn)是首要的,其次才是折騰怎么盈利。
4、完整量化交易的流程
可能很多文章講到量化策略就戛然而止,對(duì)于新手很不友好。 梳理下量化主要的流程: 開通證券賬號(hào)→搭建量化交易系統(tǒng)及開通實(shí)盤交易→設(shè)計(jì)量化策略→數(shù)據(jù)獲取及處理→開發(fā)策略→策略回測(cè)→調(diào)試優(yōu)化→實(shí)盤交易
入門量化其實(shí)較大的門檻是 搭建并開通好量化交易環(huán)境,然后才是開發(fā)策略代碼。
- 搭建量化交易系統(tǒng)及開通實(shí)盤交易
量化交易系統(tǒng)環(huán)境的準(zhǔn)備,個(gè)人不建議在沒有較多量化經(jīng)驗(yàn)的基礎(chǔ)就從頭折騰交易系統(tǒng),諸如 編寫交易的框架(還有個(gè)折中方案,可以折騰下開源的框架)、回測(cè)框架、穿透測(cè)試、對(duì)接實(shí)盤接口及調(diào)試bugs等等的會(huì)很耗費(fèi)精力。(當(dāng)然技術(shù)過硬的有興趣折騰的人還是可以試試。)
前期,我們可以直接使用現(xiàn)成量化交易框架,現(xiàn)成的軟件可以方便 數(shù)據(jù)獲取,回測(cè)驗(yàn)證效果,交易,可以專攻量化策略的實(shí)現(xiàn)及優(yōu)化。先達(dá)成效果,再過度優(yōu)化,也會(huì)有比較有效率。

比較常用的量化交易系統(tǒng)有:云核、iquant、迅投QMT、GTrade、極智量化、文華、TB開拓者、聚寬等,這些平臺(tái)也大都支持股票、ETF、期貨、期權(quán)交易。(筆者用的是iquant,目前感覺夠用。具體文末微信群咨詢。)
-
策略實(shí)盤交易
實(shí)盤過程主要還是注意控制風(fēng)險(xiǎn),設(shè)定好止損及合理的倉位,開發(fā)好的策略需要梳理好邏輯以及充足的回測(cè),調(diào)試好再上實(shí)盤交易會(huì)比較穩(wěn)妥,根據(jù)實(shí)盤表現(xiàn),定期復(fù)盤,改進(jìn)交易策略,嘗試新的交易思路和方法,不斷精進(jìn)交易策略。 另外 的 , 最好將前期的資 金投入控制少一點(diǎn),即使已 經(jīng)過充足的回測(cè)可以 盈利,但回測(cè)結(jié)果也可能是過擬合,所以 實(shí) 盤前期投入點(diǎn)先試試水也是很有必要的 !

我個(gè)人是直接先入個(gè)幾百塊做股票量化:實(shí)盤買些便宜且穩(wěn)定的ETF股票(買一手也就100來塊),既可以手動(dòng)交易下熟悉下股票交易流程,也可以掛機(jī)跑些簡(jiǎn)單策略,晚上下班在分析下策略運(yùn)行結(jié)果,做一些調(diào)整優(yōu)化。 小資金實(shí)盤交易試水,過段時(shí)間看下策略效果及市場(chǎng)行情穩(wěn)定后,再投入較大資金。個(gè)人實(shí)踐表明這樣的量化入門效率是比較高的。

- 文末免責(zé)聲明:本文觀點(diǎn)僅供參考,不作為投資建議哈。
