美國量化基金與金融科技服務商(及特色券商)系列研究報告之三
美國 Quantopian 金融科技服務商解析
———— 著名零售端金融服務商
華鑫證券私募基金研究中心
一、概要
公司簡介: Quantopian是一家2011年由金融技術企業家John Fawcett成立於美國波士頓的對沖基金服務商,對那些不熟悉從事這些活動的公司內部▼運作的人來說,對沖基金和專有算法股票交易的世界似乎是模糊、復雜甚至危險的,而公司思想是可以從任何人(不僅是高薪交易員)那裏全身獲取交易算法,打著“人人都▽可以成為Quant(金融工程師/寬客)”的旗號,吸引和鼓勵了來【自全世界的用戶在其算法交易平臺上開發和測試自己的投資算法交易策略來買賣證券。公司已經建立了一種商業模型,將以資本形式的投資者需求與以眾包策略形式的算法供應聯□系起來,並且以眾包模式基金進行股票交易。創始人曾於2008年以2800萬美元的現金和股票出售了一家金融科技軟件公司。
客戶群:堅持走"群眾化路線"。它瞄準的並非投資領域的頂級專業人士,而是量化投資行業的新手。自2013起,Quantopian上的用戶量數量逐年翻倍,從10000個用戶快ζ 速擴張,到2016年已經擁有來自世界180個國家的8萬用戶在其平臺上開發和測試自己的交易算法,到2020年3月用戶量倍數級增長,擁有來自190個國家超過30萬用戶,平臺累計進行了超過1200萬次回測。
團隊:Quantopian的成員由190多個國家的金融專業人士,科學家,開發者和學生構成,主要管理者9人。創始人John Fawcett現後服務於波士頓基金和基金服務軟件開發商Tamale和ADVENT,在成立公司時有12年相關工作經驗。
公司發展狀況:Quantopian在算法交易平∏臺領域發展的風生水起,2014年底是獲得了1500萬美元的B輪融資,而當時Quantopian僅有20位員工,隨後經從Bessemer Venture Partners和Andreessen Horowitz等大型投資機構獲得4880萬美元的融資。如此大的聲勢讓Quantopian入選了2014年福布斯美國最有前景的公司之列,隨後公司接連入選The Forbes Fintech 50。
二. 公司業務布局及發展路徑
2.1. 公司業務範圍及模式
Quanntopian是一個眾包量化投資平臺,眾包(Crowdsourcing)是由美國《連線》雜誌的¤記者Jeff Howe在2006年6月提出的,它是指一個公司或機構把過去由員工執行的工作任務,以自由自願的形式外包給非特定的大眾網絡的做法。公司為算法投資者提供市場數√據和基於Python語言的策略開發平臺,用戶可在平臺上涉及交易算法,開發策略,對策略進行回撤和調優。公司於2011年在美國成立,主營業務主要分為三塊:
(1) 策略開發和交易:策略基礎開發和回測服務有兩項功能。一個是教育平臺,公司與MIT斯隆管理學院合作,提供在Quantopian上開發算法交易策略的學習資料;一個是Research平臺提供海量日歷史數據,數據覆蓋25個國家股票、ETF、ADR標的,數據類型包括價格、收益率,公司基本面、股票情緒、宏觀經濟指標等50多個維度數據集,數據更新到前一個交易日,最早可追溯到2002年的美國和2004年的其他國家,代碼編寫欄和可視化數據分析工具幫助開發和回測算法的有效性。上述涉及功能均免費,公司與盈透證券合作,平臺上開發的策略可以接入盈透賬戶進行實時交易。
(2) 社區交流,其社區在Github上開源,供用戶討論代碼、分享數據等。
(3) 競賽和基金投資,Quantopian為用戶提交想法提供了激勵和競賽,設置常規化的算法比賽,任何作者都可以將其代碼綁定到他們的銀行帳戶並進行交易,基於10多項結構和風險篩選項找出風險較小的高收益策略,包括(1)低風險;(2)市場beta在-0.3和0.3之間;(3)夏普比率始終超過1.0的風險狀況下獲得一致的收益;(4)活躍的投資組合■,每年的目標周轉率是12和500次;(5)與其他選定作者的相關性較低;(6)基於▲市場趨勢和經濟驅動力的戰略意圖,通過每日現金獎勵來激勵開發者。然後該公司通過評估算法六個月,如果回測①和現場模擬證明成功,挑選部分算法,募集基金進行投資,公司可以將資金用於交易公司或其有限合夥人(目前為Point72 Ventures)的資金,公司對選中的每個算法的投資額大約為10萬美元到300萬美元;在這種情況下←,作者將獲得全部回報的一部分,同時作者擁有其算法的IP。截至2017年10月,Quantopian已經從100,000個用戶,500,000個算法中,各投資十萬元以说话上的資金給其中的三個算法,和策略研發者共享策略投資收益。同時,平臺會收取一定的管理費用,而算法作者也從基金收益中獲取大約10%作為回報。不過,盡管Quantopian在2016年對算法的投資回報高達40%,但由於公司尚未開展外部資產管理業務,投資所用資金均來自自有資產。因此,當Quantopian在未來真正引入外部資金時,必將面臨更好像在思索着什么為嚴峻的監管壓力.
2.2. 業務發展路徑
典型的對沖基金業務模型依賴於高薪和聰明的分析師來創建一套有限的策略和算法,用於交易從有限合夥人那裏籌集的資金。對沖基金通常收取「2%的管理費和20%的正回報。而公司通過打造一個免費的策略開發平臺吸引全世界最優秀的人才來編寫開發算法,模型對具有Internet訪問和基本▼編碼技能的任何人開放訪問權限,從而大大降低了測試和創建交易模型的障礙,吸引了大批客戶使用其平臺工具開發交易算法。公司利用眾包策略、極低的勞動力成本(幾乎為零)和不同的費№用結構以及開放的創新渠道來突破原有行業模式,從而從根本上改變了金融和技術領域的經濟驅動力。此外,交易產品更難以保持專有性,因為任何人都可以使用相同的可用數據來建立相似或相同的交易模型,以對市場情況進行壓力測試。在這種模型下,使用新算法進行實驗的可變成本接近於零;在傳統的對沖基金中,公司可能需要大量投資於对象交易策略,並證明其成功,才能夠從有限合夥人那裏籌集資金。
Quantopian在擴展產品方面具有優勢。該公司可以進一步使廣泛籌資,或者將培訓和投資用於最傑出的算法開發人員上。最後,該公司可〓以充當對沖基金的招聘工具。
三、具體產品介紹就差没吓破胆了
(一)產品主要核心模塊
1. 數據源
公司擁有2002年以來直『到最近完成的交易日的美國股票和美國期貨的分鐘級歷史記錄】數據,甚至包括不再交易的股票和ETF。提供該分鐘內的開盤@價,收盤價,高價,低價和交易量〗,每晚收市更新。而美國期貨數據庫包含72種期貨,涵蓋了商品,利率,股票和◇貨幣期貨等種類。每周5天(美國東部時間周日下午6點-周五下午6點)可獲得這些期貨⌒ 的24小時數據。有的數據集都是以時間點形式,連續發送,這對於回測準確性非常重要,避免算法因為〓遺漏破產和其他重要事件而產生過於樂觀的結果,形成回測偏差。
具體來說,在算法仿真過程中,權拓點使用交易價¤格,這意味著當用戶的算法要求特定資產的價格時,它會在仿『真時獲得該資產的價格。對於期貨,交易價格是從電子貿易數據得出的。當用戶的算法要求提供歷史股價或交易量數據時,將根據當前模擬日期的拆分,合並和股息進行調整。換句話說,如果用戶的算法要求一個歷史價格窗口,並且該窗口中間有一個拆分,則該窗口的第一部分將針對拆分進行調整。進行此調整是為了使用戶的算法可以使用窗口中的值進行有意義的計算。
Quantopian還提供免費的基本數據訪問。平臺引入Morningstar的數〖據包括600多個衡量公司財務業績的指標,這些指標均來自其公開文件。此數據最常見的用途是篩選出用於算法的證券子集。通常在算法的交易邏輯中使用基本指標。除了定價和基本數據外,公司還提供大量合∩作夥伴數據集。組合各種數據集中發現的信號是創建高質量算法的有力方法。可用的數據集包括諸如情緒分析之類的市場指標,以及諸如臨床試驗數據之類的行業特定指標。每個數據◤集都有一組有限的免費數據。完整的數據集可以按需購買,按月收費。
自助數據部分允許用戶將自◤己的時間序列csv數據上傳到Quantopian。為了準確地在pipeline中表示用戶的數據並避免】前瞻性偏差,將按照類似於Quantopian Partner Data的時間點性質來收集,存儲和顯示用戶的數據。
2. 研究環境
對於大多數人來說,編寫一個好的算法最困難的部分顿时天空中好像降下了数道雪白是找到想法或定價“優勢”。研究平臺是進行此類研究和分析的地方。在研究平臺上,用戶可▓以訪問Quantopian的所有數據價格,數量,公司基本面以及合作夥伴數據集,包括情感數據,收益日歷等。同時可☉以將回測或實時算法的結果◥加載到研究中,分析結果並與其他算法的性能進行比較,幫助改進算卐法。
3. IDE和回測
在IDE(交互式開發環境)中,用戶可以編寫算法,按“ Build”將幫助檢查≡用戶算法的代碼是否存在語法錯誤,然後開始進行運行回測,回測數自動保存並且可以訪問以供將來分析。
4. 樣本外測試
在書面交易中,用戶的算法通過獲取實時市場數據(但有15分鐘的延遲)模擬投資組合對進行交易。對於任何算法來說,這都是一個很好的測試。如果在算法開發過程中過度擬合,那麽測試器將發現問題所在。其背後的訂單履行邏輯與常規回測邏輯一致,包括滑點模型。不過此項功能目前僅適用於美國股票類資產交易。
5. 隱私保護
Quantopian非常重視隱私和安全性。內部生成的所有交易算法和回測結果均歸用戶所有,可以選擇與社區共享知識產權,或者選擇授▓予Quantopian權限以查几乎就成了两部防御装甲之间看代碼以進行故障排除。除特殊情況(例如保護平臺的安全性)外,未經用戶的允許,平臺將不會訪問用戶的算法。具體來說,平臺的安全層包括:Quantopian應用程序的SSL加密,安全的websocket通信以獲取回測數據,以及在將所有交易算法和其他專有信息寫入Ψ的數據庫之前,先對其進行加密。
(二)產品使用手冊
交易算法
交易算法(trading algorithm)是用計算機來定義一組買賣資產規則的程序。大多的交易算法都是基於歷史數據和數學/統計模型來做決策的。在Quantopian研究環境中有完整的美股數據可供客戶使用。在 Quantopian主頁,通過 Research --> Notebooks 就可以創建一個 Jupyter Notebook 環境來運行 Python代碼。
編寫交易算法的第一步是找到可以建立〖策略基礎的經濟或統計關系。為此,可以使用Quantopian的研究環境訪問和分析平臺中可用的歷史數據↓集。研究環境Jupyter Notebook允許用戶以稱為“單元”的單元運行Python代碼。例如,以下代碼繪制了蘋果公司(AAPL)的每日收盤價,以及其20天和50天移動平∏均線:
要使用上面的代碼副本並將其粘貼到Research中的新筆記本中,進入研究模式後,按Shift + Enter鍵即可運行單元格。輸出應如下所示:
數據探索
從2002年到最近完成的交易日,研究部提供實用程序功能來查詢8000多種美國股票的價格,數量和回報數據。這些函數獲取資產(或資產列表)以及開始和結束日期,並返回按日期索∩引的pandas 系列(或 DataFrame)。定以需要研究的時間段,並使用returns函數來查詢APL的數據:
替代數據
除了定價和數量數據外,Quantopian還集成了許多其他數據集,包括公司基本面,股票情緒分析和共識估計等。用戶可以在Quantopian的Data Reference中找到完整的數據集列表。例如PsychSignal的StockTwits Trader Mood數據集。PsychSignal的數據集根據金融通訊平臺Stocktwits上發布的消息的總體情緒,每天為股票分配牛市和熊市得分。用戶可以從◇檢查stocktwits數據集中的消息量和情緒得分(牛市減去熊再倒上水泥砂浆市)列開始 。使用Quantopian的Pipeline API查詢數據來訪問和分析Research中的數據。
探索數據集時,可嘗試查找可能用作交易策略基礎的模式。例如,上圖顯示了每日收益與股票交易消息¤量之間的一些匹配峰值,並且在某些情況下,收益的峰值方向與APL的情緒得分方向一致。
Pipeline API
Pipeline API是用於資產數據的橫截面分析的強大工具。它使用戶能夠為多個數據輸入定義一組計算,並一次分析大量資產。Pipeline API的一些常見用法包括:
? 根據過濾規則選擇資產
? 根據評分功能轻视之心對資產進行排名
? 計●算投資組合分配
首先,導入Pipeline類並創建一個返回空Pipeline的函數。將Pipeline定義放入函數中可以幫助用戶隨著Pipeline復雜性的增加而事情井井有條。在Research和IDE之間傳輸數據Pipeline時,這特別有用。
將輸出添加到Pipeline中,用戶需要包括對數據集的引用,並指定用戶要對該數據進行的計算。例如,用戶將添加對USEquityPricing數據集中的close列的引用。然後,用戶可以將輸出定義為該列中的最新值,如下所示:
Pipeline API還提供了許多內々置計算,其中一些是在數據的尾隨窗口上計算的。例如,以下代碼導入Psychsignal的 stocktwits數據集,並將輸出定義為其bull_minus_bear列的3天移動平均而后線:
制定策略的重要部分是定義在投資組合中交◤易的資產集。用戶通常將這組資產稱為用戶的交易範圍。交易範圍應盡可能大,同時還要排除不適合用戶投資組合的資產。例如,用戶可能要排除ぷ流動性不足或難以交易的問題,Quantopian的QTradableStocksUS提供了這一特征。用戶可以使用Pipeline構造函數◣的screen參數將QTradableStocksUS設置為用戶的交易領域:
#從quantopian 導入Pipeline類和數據集。Pipeline進口Pipeline從quantopian 。Pipeline。數據導入USEquityPricing 從quantopian 。Pipeline。數據。心理信號進口庫存
#從Quantopian 導一个问题入內置的移動平均值計算。Pipeline。因素導入SimpleMovingAverage
#從Quantopian 導入內置的交易Universe 。Pipeline。實驗進口QTradableStocksUS
def make_pipeline ():#創建對用戶交易世界的引用
base_universe = QTradableStocksUS ()
#獲取最新收盤價
close_price = USEquityPricing 。關閉。最新
#3計算天的平均bull_minus_bear分數
sentiment_score = SimpleMovingAverage (
輸入= [ stocktwits 。bull_minus_bear ],
window_length = 3 ,)
#包含close_price和#sentiment_score的返回Pipeline,其中將用戶的交易範圍作為屏幕返回Pipeline(
列= { 'close_price' :close_price ,'sentiment_score' :sentiment_score ,},
screen = base_universe ,)
現在,用戶的Pipeline定義已經完成,用戶可以使用run_pipeline在特定時間段內執行它 。輸出將是按日期和資產索引的pandas DataFrame,其列對應於用戶添加到Pipeline定義中的輸出√:
#從quantopian 導入run_pipeline方法。研究導入run_pipeline
#執行make_pipeline創建的Pipeline#start_date 和end_date之間的
pipeline_output = run_pipeline (
make_pipeline (),
start_date = '2013-01-01' ,
end_date = '2013-12-31' )
#顯示最後10行
pipeline_output 。尾巴(10 )
策略定義
既然用戶已經了解了如何在Quantopian中訪問和操縱數據,那麽讓用戶為多空權益策略構建一條數據Pipeline。通常,多頭-空頭股票策略包括對資產彼此之間的相對價值進行建模,然後押註用戶有信心將在價值上增加(多頭)並減少(空頭)的資產組合∩。當多套高價值資產和低價值資產之間的收益差增加時,多空股票策略便會獲利。多空股票策略的質量完全取決於其基礎那一刻排名模型的質量。在本教程中,用戶將為策略使用簡單的排名架構:
策略:用戶將3天平均情緒得分高的資產視為高價值,並將3天平均情緒㊣得分低的資產視為低價值。
策略分析
用戶可以使用SimpleMovingAverage和 stocktwits的bull_minus_bear數據定義以上策略,類似於用戶在之前創建的Pipeline:
#從Quantopian 導入Pipeline。Pipeline進口Pipeline從quantopian 。Pipeline。數據。psychsignal 進口stocktwits
從quantopian 。Pipeline。因◇素從量子視點導入SimpleMovingAverage 。Pipeline。實驗進口QTradableStocksUS
#Pipeline定義def make_pipeline ():
base_universe = QTradableStocksUS ()
sentiment_score = SimpleMovingAverage (
輸入= [ stocktwits 。bull_minus_bear ],
window_length = 3 ,)
return Pipeline (
列= { 'sentiment_score' :sentiment_score ,},
screen = base_universe
)
為簡單起見,用戶將僅分析由sentiment_score排名的前350名和後350名股票 。用戶可以使用sentiment_score輸出的top和bottom方法 為這些集合創建Pipeline過濾器 ,並使用|組合它們。 運算▅符以獲取結果。然後,通過使用&運算符獲取過濾器和用戶的工作空間之間的交集,用戶將刪除可交易】範圍之外的所有內容 :
#從Quantopian 導入Pipeline。Pipeline進口Pipeline從quantopian 。Pipeline。數據。psychsignal 進口stocktwits
從quantopian 。Pipeline。因素從量子視點導≡入SimpleMovingAverage 。Pipeline。實驗進口QTradableStocksUS
#Pipeline定義def make_pipeline ():
base_universe = QTradableStocksUS ()
sentiment_score = SimpleMovingAverage (
輸入= [ stocktwits 。bull_minus_bear ],
window_length = 3 ,)
#頂級350和底部350個創建過濾器根據他們的情感計數#資產
top_bottom_scores = (
sentiment_score 。頂(350 )| sentiment_score 。底部(350 ))
return Pipeline (
column = { 'sentiment_score' :sentiment_score ,},#將屏幕設置為用戶的過濾器#和交易Universe
屏幕之間的交點=(
base_universe
&top_bottom_scores
))
接下來,讓用戶在要分析的時間⊙內執行Pipeline。這大約需要卐1分鐘。
#從quantopian 導入run_pipeline方法。研究導入run_pipeline
#指定時間範圍來評估
period_start = “2013-01-01”
period_end = “2016年1月1日”
#在評估期內執行Pipeline
pipeline_output = run_pipeline (
make_pipeline (),
start_date = period_start ,
end_date = period_end
)
除了Pipeline的數據外,用戶還需要此期間存在的所有資產的定價數據。用戶可以輕松地從Pipeline輸出的索引中獲取這些資產的列表,並將該列表▽傳遞給≡ 價格以獲取所需的定價數據:
#進口㊣ 價格從Quantopian開始起作用。研究進口價格
#從Pipeline輸出
asset_list = pipeline_output 獲取唯一資產列表。索引。級別[ 1 ]。唯一()
#查詢#評估期內存在的所有№資產的定價數據
asset_prices = 價格(
asset_list ,
start = period_start ,end = period_end
)
現在,用戶可以使用Quantopian的開源因素分析工具 Alphalens來測試用戶選擇策〗略的質量。首先,讓用戶使用get_clean_factor_and_forward_returns結合用戶的因子和定價數據 。此函數將因子數據分類為分位數,並計算多個持有期間內每種證券的正向收益。用戶將因子數據分為2個分位數(上半部分和下半部分),並使用1、5和10天的持有期卐:
#導入Alphalens 以al 形式導入alphalens
#根據︻情感得分
factor_data = al 獲取資產遠期收益和分位數分類。實用程序。get_clean_factor_and_forward_returns (
因子= pipeline_output [ 'sentiment_score' ],
價格= asset_prices ,
位數= 2 ,
周期=(1 ,5 ,10 ), )
#顯示前5行
factor_data 。頭(5 )
使用這種格式的數據可以使用戶使用Alphalens的多種分析和繪圖工具。讓用戶從整個期間的分位數來看平均收益率開始。因為用戶的目標是建立多空策略,所以用戶希望看▓到較低分位數(1)的收益為負,而較高分位數(2)的收益為正:
#通過系數⌒分位數
mean_return_by_q ,std_err_by_q = al 計算平均值回報。表現。mean_return_by_quantile (factor_data )
#在評估時間範圍
a1 內按分位數和持有△期#繪制平均收益。密謀。plot_quantile_returns_bar (
mean_return_by_q 。申請(
人。utils的。rate_of_return ,
軸= 0 ,
ARGS =('1D' ,)) );
用戶還可以使用以下代碼●繪制持有期為5天的因子加權多空組合的累計收益:
將pandas 導入為pd
#計算因¤子加權的多空組合收益
ls_factor_returns = al 。表現。factor_returns (factor_data )
#繪制5天持有期
al的累計收益。密謀。plot_cumulative_returns (ls_factor_returns [ '5D' ],'5D' ,頻率= PD 。TSERIES 。偏移。BDAY ());
上圖顯示了一個大的下行期,該分析尚未︻考慮交易成本或市場影響。這不是一個非常有前途的策略。在這一◣點上,用戶確實應該使用Alphalens進行更深入的分析,然後叠代用戶的戰略構想。但是,出於本教程的考慮,讓用戶繼續用戶的策略。
定義並測試了策略後,讓用戶使用它來構建和測試多空權益算法。本教程的其余部分將介紹Algorithm API,並將在交互式開發環境(IDE)中進行。
算法API和核心功能
下一步將使用Quantopian的Algorithm API為用戶的交易算法構建基本結構。Algorithm API提供的功能可促進訂單調度和執行,並允許用戶初始化和管理算法中的參數。
讓用戶看一下將在算法中使用的一些核心功能:
初始化(上下文)
當用戶的算法開始運行並且需要上下文作為輸入時,initialize會被調用一次 。任何參數初始化和一次性啟動邏輯都應放在此處。
context是用於在整個仿真過程中維持狀態的增強Python 字典,可以在用戶算法的不同部分中引用。用戶希望在〓函數調用之間保留的所有變量都應存儲在〗上下文中, 而不要使用全局變量。可以使用點①表示法(context.some_attribute)訪問和初始化上下文變量。
before_trading_start
市場開盤前每天調用一次before_trading_start,並且需要 上下文和數據作為輸●入。 上下文是從相同參考字典 初始化,並且數據是一個對々象,存儲若幹API函數,使用戶能夠查找當前或歷史的價格及成交量數據任何資產。
before_trading_start也是用戶獲取Pipeline輸出的地方,並在將結果數據用於投資組合構建之前對其進行任何預處理。
schedule_function(func,day_rule,time_rule)
在Quantopian上,算法可以在NYSE交易日歷之後的常規交易日東部時間9:30 AM-4PM之間進行股票交易。 schedule_function允許用戶在指定的日期和時間執行自定義函數。例如,用戶可以安排一個函數來在每周第一天的市場開放時重新平衡投資組合,如下所示:
schedule_function (
重新平衡,
date_rule = date_rules 。week_start (),
time_rule = time_rules 。market_open () )
調度函數應在initialize中完成,並且使用此方法調度的自定義函數需要將上下文和數據作為參數。有關可用的date_rules和time_rules的完整列表,
接下來,讓用戶為用戶的交易算法構建一個框架。現在,用戶將使算法跟蹤模擬中經過的天數,並根據日期和時間記錄不同的消息。
#導入算法API 導入量子視線。算法的ζ 算法中
def initialize (context ):#初始化算法參♀數
context 。day_count = 0
上下文。daily_message = “第{}天”。
情境。weekly_message = “該進行一些交易了!”
#安排重新平衡功能
算法。schedule_function (
重新平衡,
date_rule = ALGO 。date_rules 。week_start (),
time_rule = ALGO 。time_rules 。market_open () )
高清before_trading_start (背景下,數據): #執行任何日常行動是必要發生的一個交易時段開始之前#
的上下文。day_count + = 1個
日誌。信息(背景。daily_message ,情境。DAY_COUNT )
def rebalance (上下文,數據):#執行rebalance邏輯
日誌。信息(背景。weekly_message )
現在,用戶已經有了交易算法的基本結構,讓用戶將創建的數〓據Pipeline添加到算法中。
算法中的數據處理
下一步將是將用戶在Research中內置的數據Pipeline集成到用戶的算法中。與Research的一個重要區別是,在回測期間,隨著模擬的進行,用戶的Pipeline每天都會執行,因此用戶不需要包括start_date和end_date參數。
為了在算法中使◤用用戶的數據Pipeline,第一步是在算法的初始化函數中添加對其的引用 。這是使用attach_pipeline方法完成的 ,該方法需要兩個輸入:對Pipeline對象的引用 (用戶使用make_pipeline構造 ),以及用於標識它的String名稱。
#導入算法API 導入量子視線。算法的算法中
def initialize (context ):#將Pipeline附卐加到算法
algo 。attach_pipeline (
make_pipeline (),'data_pipe' )
#安排重新平衡功能
算法。schedule_function (
重新平衡,
date_rule = ALGO 。date_rules 。week_start (),
time_rule = ALGO 。time_rules 。market_open () )
def before_trading_start (context ,data ):通過
def 重新平衡(上下文,數據):通過
如上所述,用戶的Pipeline將在每∏天開放市場之前處理數據流並生成輸出。用戶可以使用pipeline_output函數在before_trading_start中獲得Pipeline的輸出,該函數采用在initialize中指定的Pipeline名稱 ,並返回由Pipeline生成的pandas DataFrame。現在,用戶可以使用重新平衡功能╱記錄Pipeline輸出中的前10行。
#導入算法API 導入量子視線。算法的算法中
def initialize (context ):#將Pipeline附加到算法
algo 。attach_pipeline (
make_pipeline (),'data_pipe' )
#安排重新平衡功能
算法。schedule_function (
重新平衡,
date_rule = ALGO 。date_rules 。week_start (),
time_rule = ALGO 。time_rules 。market_open () )
def before_trading_start (上下文,數據):#獲取Pipeline輸出,並將其存儲在▂上下文
context中。pipeline_data = 算法。pipeline_output ('data_pipe' )
def rebalance (上下文,數據):#顯示Pipeline輸出
日誌的前10行#。信息(背景。pipeline_data 。頭(10 ))
現在,讓用戶將々在Research中內置的make_pipeline函數添加到算法中。與其像用戶分析時那樣限制資產的數量,用戶↘的算法應該考慮交易環境中受到投資者情感因素影響的所有資產。為此,用戶可以使用sentiment_score輸出的notnull方法 創建一個過濾器,並使用&運算符將其與可交易Universe相交 :
#導入算法API 導入量子視線。算法的算法中
#從Quantopian 導入Pipeline。Pipeline進口Pipeline從quantopian 。Pipeline。數據。psychsignal 進口stocktwits
從quantopian 。Pipeline。因素從量子視點導入SimpleMovingAverage 。Pipeline。篩選器導入QTradableStocksUS
def initialize (context ):#將Pipeline附加到算法
algo 。attach_pipeline (
make_pipeline (),'data_pipe' )
#安排重新平衡功能
算法。schedule_function (
重新平衡,
date_rule = ALGO 。date_rules 。week_start (),
time_rule = ALGO 。time_rules 。market_open () )
def before_trading_start (上下文,數據):#獲取Pipeline輸出,並將其存儲在上下文
context中。pipeline_data = 算法。pipeline_output ('data_pipe' )
def rebalance (上下文,數據):#顯示Pipeline輸出
日誌的前10行#。信息(背景。pipeline_data 。頭(10 ))
#Pipeline定義def make_pipeline ():
base_universe = QTradableStocksUS ()
sentiment_score = SimpleMovingAverage (
輸入= [ stocktwits 。bull_minus_bear ],
window_length = 3 ,)
return Pipeline (
列= { 'sentiment_score' :sentiment_score ,},
屏幕=(
base_universe
&sentiment_score 。notnull ()))
現在,用戶的算法每天都會選擇一種可交易的資產範圍,並產生可用於確定投資組合中資產分配的alpha分數。
投→資組合管理
現在該定義算法將如何使用Pipeline生成的alpha分數來重新平衡其投資組合了。用戶的目標是找到一個目標投資組合,該投資組合可以在保持由一組規則或約束定義¤的特定結構的同時,根據alpha分數最大化回報。這□ 通常稱為 投資組合優化問題。Quantopian的Optimize API使用戶可以輕松地將Pipeline的輸出轉化為目標和@一組約束。然後,用戶可以使用 order_optimal_portfolio將當前投資組合轉換為滿足用戶規格的目標投資組合。
第◇一步是定義一個目標。用戶將使用 MaximizeAlpha,它將嘗試將資本分配給與其alpha分數成比例的資產。
#導入Optimize API模塊導入Quantopian 。優化的選◣擇
def rebalance (上下文,數據):#從Pipeline輸出
alpha = context中檢索alpha 。pipeline_data 。情感分數
如果不是alpha 。空:#創建MaximizeAlpha目標
target = opt 。MaximizeAlpha (alpha )
接下來,用戶需要指定用戶希望目標投資組合滿足的約束列表。讓用戶從在initialize中定義一些閾值開始 ,並將它們存儲那么在用戶的上下文變量中:
#約束參數
context 。max_leverage = 1.0
上下文。max_pos_size = 0.015
上下文。max_turnover = 0.95
現在,用戶可以使用上面∮定義的閾值指定重新平衡的約束條件:
#導入Optimize API模塊導入Quantopian 。優化①的選擇
def rebalance (上下文,數據):#從Pipeline輸出
alpha = context中檢索alpha 。pipeline_data 。情感分數
如果不是alpha 。空:#創建MaximizeAlpha目標
target = opt 。MaximizeAlpha (alpha )
#創√建位置大小約束
constrain_pos_size = opt 。PositionConcentration 。with_equal_bounds (- 背景。max_pos_size ,
情境。max_pos_size
)
#限制目標投資組合的杠桿→率
max_leverage = opt 。MaxGrossExposure (上下文。max_leverage )
#確□ 保長書和短書#的大小★大致相同
dollar_neutral = opt 。美元中性()
#限制投資組合周轉率
max_turnover = opt 。MaxTurnover (上下文。max_turnover )
最後,用戶可以將目標和約束列表傳遞給 order_optimal_portfolio以計算目標投資組合,並▃發出將當前投資組合轉換為最佳狀態所需的訂單:
#導入算法API 導入量子視線。算法的算法中
#Import Optimize API 導入Quantopian 。優化的Ψ 選擇
def rebalance (上下文,數據):#從Pipeline輸出
alpha = context中檢索alpha 。pipeline_data 。情感分數
如果不是alpha 。空:#創建MaximizeAlpha目標
target = opt 。MaximizeAlpha (alpha )
#創建位置大小約束
constrain_pos_size = opt 。PositionConcentration 。with_equal_bounds (- 背景。max_pos_size ,
情境。max_pos_size
)
#限制目標投資組合的杠桿率
max_leverage = opt 。MaxGrossExposure (上下文。max_leverage )
#確保長書但是在经过查看之后和短書#的大小大致○相同
dollar_neutral = opt 。美元中性()
#限制投資組合周轉率
max_turnover = opt 。MaxTurnover (上下文。max_turnover )
#使用目標#和約束
算法列表重新平衡投資組合。order_optimal_portfolio (
目標= 目標,
約束= [
constrain_pos_size ,
max_leverage ,
dollar_neutral ,
max_turnover ,] )
風險管理
除了對目標投資組合的結構設置限制之外,用戶還∩將希望將其暴露於可能影響其績效的常見∏風險因素中。例如,由於股票twitter情緒數據的瞬態特性 以及用戶意圖利用情緒得分峰值的意圖,用戶的算法可能會面臨短期逆轉風險。
用戶將使用Quantopian的風險模型來管理投資組合中常見風險因素的敞口。風險模型計算資產面臨16種●不同風險因素的風險:11種行業因素和5種風∞格因素(包括心里暗笑看来师姐已经隐约猜到了姓韩短期反轉)。用戶可以使用Risk_loading_pipeline函數輕松地在用戶的算法中訪問此數據,該 函數返回一個︾數據Pipeline,該Pipeline為Risk Model中的每個因子生成一列輸出。
與用戶的數據Pipeline類似,用戶將需要▅將風險數據Pipeline附加到用戶的算法上,並提供一個名稱來標識它。然後,用戶可以在before_trading_start中獲取其輸出,並將其 存儲在 context中:
#導入算法API 導入量子視線。算法的算法中
#從Quantopian 導入Risk API方法。Pipeline。實驗性進口risk_loading_pipeline
def initialize (context ):#約束參數
context 。max_leverage = 1.0
上下文。max_pos_size = 0.015
上下文。max_turnover = 0.95
#附加數據Pipeline
算法。attach_pipeline (
make_pipeline (),'data_pipe' )
algo 。attach_pipeline (
risk_loading_pipeline (),'risk_pipe' )
#安排重新平衡功能
算法。schedule_function (
重新平衡,
ALGO 。date_rules 。week_start (),
算法中。time_rules 。market_open (), )
def before_trading_start (上下文,數據):#獲取Pipeline輸出,並將其存儲在上下文
context中。pipeline_data = 算法。pipeline_output ('data_pipe' )
情境。risk_factor_betas = algo 。pipeline_output ('risk_pipe' )
下一步是將RiskModelExposure約束添加到投資組合優化←邏輯中。該約束條件采用了風險模型生成的數據,並限制了用戶目標投資組合對模型中包含的每個因素的總體敞口。
#限制目標投資組合的風險敞口#默認卐情況下,最大行業敞口設置為#0.2,最大樣式敞口設置為0.4
factor_risk_constraints = opt 。實驗的。RiskModelExposure (
背景。risk_factor_betas ,
版本= 選擇。最新)
最後,以下算法涵蓋了用戶的策略和投資組合構建邏輯,並準備進行回測。克隆算法後,通過單擊IDE右上角的“運行完整回測”來運行完整回測。
#導入算法API 導入量子視線。算法的算法中
#Import Optimize API 導入Quantopian 。優化的選擇
#從Quantopian 導入Pipeline。Pipeline進口Pipeline從quantopian 。Pipeline。數據。psychsignal 進口stocktwits
從quantopian 。Pipeline。因素導入SimpleMovingAverage
#從quantopian 導入內置的Universe和Risk API方法。Pipeline。過濾器導入QTradableStocksUS 從quantopian 。Pipeline。實驗性進口risk_loading_pipeline
def initialize (context ):#約束參數
context 。max_leverage = 1.0
上下文。max_pos_size = 0.015
上下文。max_turnover = 0.95
#附加數據Pipeline
算法。attach_pipeline (
make_pipeline (),'data_pipe' )
algo 。attach_pipeline (
risk_loading_pipeline (),'risk_pipe' )
#安排重新平衡功能
算法。schedule_function (
重新平衡,
ALGO 。date_rules 。week_start (),
算法中。time_rules 。market_open (), )
def before_trading_start (上下文,數據):#獲取Pipeline輸出,並將其存儲在上下文
context中。pipeline_data = 算法。pipeline_output ('data_pipe' )
情境。risk_factor_betas = algo 。pipeline_output ('risk_pipe' )
#Pipeline定義def make_pipeline ():
sentiment_score = SimpleMovingAverage (
輸入= [ stocktwits 。bull_minus_bear ],
window_length = 3 ,
掩模= QTradableStocksUS () )
返回Pipeline(
列= { 'sentiment_score' :sentiment_score ,},
屏幕= sentiment_score 。NOTNULL () )
ef rebalance (上下文,數據):#從Pipeline輸出
alpha = context中檢索alpha 。pipeline_data 。情感分數
如果不是alpha 。空:#創建MaximizeAlpha目標
target = opt 。MaximizeAlpha (alpha )
#創建位置大小約束
constrain_pos_size = opt 。PositionConcentration 。with_equal_bounds (- 背景。max_pos_size ,
情境。max_pos_size
)
#限制目標投資組合的杠桿率
max_leverage = opt 。MaxGrossExposure (上下文。max_leverage )
#確保長書和短書#的大小大致相同
dollar_neutral = opt 。美元中性()
#限制投資組合周轉率
max_turnover = opt 。MaxTurnover (上下文。max_turnover )
#限制目標投資組合的風險敞口#默認情況下,最大行業敞口設置為#0.2,最大樣式敞口設置為0.4
factor_risk_constraints = opt 。實驗的。RiskModelExposure (
背景。risk_factor_betas ,
版本= 選擇。最新)
#使用目標#和約束
算法列表重新平衡投資組合。order_optimal_portfolio (
客觀= 客觀,
約束= [
constrain_pos_size ,
max_Leverage ,
dollar_neutral ,
max_turnover ,
factor_risk_constraints ,] )
回測分析
回測完成後,單擊“筆記本”選項卡。
這將顯示帶有以下代碼的研究筆記本:
bt = get_backtest ('5a4e4faec73c4e44f218170a' )
bt 。create_full_tear_sheet ()
註意:筆記本中的字母數字字符串將不同於上面顯示的字符串。該字符串是用戶的回測在Quantopian中的唯这个警察也算是尽忠尽职了一標識符。也可以在完整的回測結果頁面的URL中找到它。
執行此單元格(Shift + Enter)會將用戶的回測生成的數據加載到研究筆記本中,並使用它來創建 Pyfolio撕紙。Pyfolio是Quantopian用於投資組合和風險分析的開源工具。它提供了許多可視化工具,旨在幫助用戶更好地了解算法的行為以及隨著時間的推移所面臨的風險。例如,下圖顯示了用戶的投資組合隨時間推移的市場滾動風險。用戶要構建多頭-空頭股票交易算法的原因之一是要保持與市場的低相關◆性,因此用戶希望如此該圖在整個回測期間始終保∑ 持在0附近。
Pyfolio的另一個有趣的部分是性能歸因部分。下圖使用Quantopian的風險模型來說明可以將多少收益歸因於用戶的策略,以及其中多少來自共同的風險因素。
用戶可以從上面看到,用戶投資組合的大部分總收益來自特定收益。這表明算法的性能並非來自於常見風險因素,這是一件好事。
四、公司優勢和不足
公司同行業可比標的主要有Quantconnect,Numerai WorldQuant的WebSim。這些平臺也選擇了走"群眾化"之路,為用戶提供包括略編寫、回測等方面的服務。不同之處在於,WorldQuant專註於更為基礎的量化投資分析。其中,傑出的算法作者還绝对是宁死不从有機會成為平臺的兼職研究顧問。目前,該平臺兼職顧問人數已經超過500,相當於WorldQuant的正式員工數量。其它平臺提供策略研發環境的經營方式不⌒同,Numerai提供的是一個協作平臺。它的獨特之處還在於其以眾包解決問題的方式更能代表“群體工作”。
自從2015年開始我國量化基金市場開始崛起,量化投資受關註度迅速上◢升,量化基√金的技術服務也收到了關註,各類基於A股的算法交易開發平臺紛紛出現,最早成立的一批公司例如優礦、聚寬等,都是模仿Quantopian的業務模式,基於Quantopian的Zipline開源量化交易庫進行二次開發。
相比於服務於機構類客戶的算法和策略開發平◤臺,因為這些公司運用C++語言開發策略,Quantopian策略開發和回測速度不如這類公司,從技術角度,相比於現在為機構類客戶提供服務的金融科技供應商而言,其在技術和數據角度不足明顯。
不僅如此,線上策略開發不可避免的存在策略及數據保密性的問題。並且目前策略尚不能支持公司大規模持續性獲得盈利,2018 年Quantopian公司CEO離職時表示2017年4月推出的基金收益率遠未達到¤預期,眾包基金遠低於預期的收益率也使得作為資金方的對沖基金投資較為謹慎,一家對沖基金對Quantopian算法分配高∩達2.5億美元的投資資金,與之曾管理∏高達130億美元的總凈資產相比,這是ㄨ一個明顯的下降。
華鑫證券私募基金研究中心課題組聯系人:
周韜雄 課題組研究員
電話:021- 54967619
郵箱:zhoutx@cfsc.com.cn
藺鈺堯 課題組研究員
電話:021-54967852
郵箱:linyy@cfsc.com.cn