Task 和 Future
創新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站制作、網站設計、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的雙灤網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!
前面我們討論了協程,以及如何在循環中運行它們才有用。現在我想簡單談談Task和Future api。你將使用最多的是Task,因為你的大部分工作將涉及使用create_task()函數運行協程,就像在第22頁的“快速開始”中設置的那樣。Future類實際上是Task的超類,它提供了與循環交互操作的所有功能。
可以這樣簡單地理解:Future表示某個活動的未來完成狀態,并由循環管理。Task是完全相同的,但是具體的“activity”是一個協程——可能是你用async def函數加上create_task()創建的協程。
Future類表示與循環交互的某個東西的狀態。這個描述太模糊了,不太有用,所以你可以將Future實例視為一個切換器,一個完成狀態的切換器。當創建Future實例時,切換設置為“尚未完成”狀態,但稍后它將是“完成”狀態。事實上,Future實例有一個名為done()的方法,它允許你檢查狀態,如示例 3-15所示。
示例 3-15. 用done()方法檢查完成狀態
Future實例還可以執行以下操作:
? 設置一個result值(用.set_result(value)設置值并且使用 .result()獲取值)
? 使用.cancel()方法取消 (并且會用使用.cancelled()檢查是否取消)
? 增加一個Future完成時回調的函數
即使Task更常見,也不可能完全避免使用Future:例如,在執行器上運行函數將返回Future實例,而不是Task。讓我們快速看一下 示例 3-16 ,了解一下直接使用Future實例是什么感覺。
示例 3-16. 與Future實例的交互
(L3)創建一個簡單的 main函數。我們運行這個函數,等上一會兒然后在Future f上設置一個結果。
(L5)設置一個結果。
(L8)手動創建一個Future實例。注意,這個實例(默認情況下)綁定到我們的循環,但它沒有也不會被附加到任何協程(這就是Tasks的作用)。
(L9)在做任何事情之前,確認future還沒有完成。
(L11)安排main()協程,傳遞future。請記住,main()協程所做的所有工作就是sleep,然后切換Future實例。(注意main()協程還不會開始運行:協程只在事件循環運行時才開始運行。)
(L13)在這里我們在Future實例上而不是Task實例上使用run_until_complete()。這和你以前見過的不一樣。現在循環正在運行,main()協程將開始執行.
(L16)最終,當future的結果被設置時,它就完成了。完成后,可以訪問結果。
當然,你不太可能以這里所示的方式直接使用Future;代碼示例僅用于教育目的。你與asynccio的大部分聯系都是通過Task實例進行的。
你可能想知道如果在Task實例上調用set_result()會發生什么。在Python 3.8之前可以這樣做,但現在不允許這么做了。任務實例是協程對象的包裝器,它們的結果值只能在內部設置為底層協程函數的結果,如 示例 3-17所示那樣。
示例 3-17. 在task上調用set_result
(L13)唯一的區別是我們創建的是Task實例而不是Future實例。當然,Task API要求我們提供一個協程;這里我們使用sleep()只是因為簡單方便。
(L7)正在傳入一個Task實例。它滿足函數的類型簽名(因為Task是Future的子類),但從Python 3.8開始,我們不再允許在Task上調用set_result():嘗試這樣做將引發RuntimeError。這個想法是,一個Task代表一個正在運行的協程,所以結果應該總是來自于task自身。
(L10, L24)但是,我們仍然可以cancel()一個任務,它將在底層協程中引發CancelledError。
Create_task? Ensure_Future? 下定決心吧!
在第22頁的“快速入門”中,我說過運行協程的方法是使用asyncio.create_task()。在引入該函數之前,有必要獲取一個循環實例并使用loop.create_task()完成相同的任務。事實上,這也可以通過一個不同的模塊級函數來實現:asyncio.ensure_future()。一些開發人員推薦create_task(),而其他人推薦ensure_future()。
在我為這本書做研究的過程中,我確信API方法asyncio.ensure_future()是引起對asyncio庫廣泛誤解的罪魁禍首。API的大部分內容都非常清晰,但在學習過程中還存在一些嚴重的障礙,這就是其中之一。當你遇到ensure_future()時,你的大腦會非常努力地將其集成到關于asyncio應該如何使用的心理模型中——但很可能會失敗!
在Python 3.6 asyncio 文檔中,這個現在已經臭名昭著的解釋突出了 ensure_future() 的問題:
asyncio.ensure_future(coro_or_future, *, _loop =None)
安排執行一個協程對象:把它包裝在future中。返回一個Task對象。如果參數是Future,則直接返回。
什么!? 當我第一次讀到這篇文章時,我很困惑。下面希望是對ensure_future()的更清楚的描述:
這個函數很好地說明了針對終端用戶開發人員的asyncio API(高級API)和針對框架設計人員的asyncio API(低級API)之間的區別。讓我們在示例 3-18中自習看看它是如何工作的。
示例 3-18. 仔細看看ensure_future()在做什么
(L3)一個簡單的什么都不做的協程函數。我們只需要一些能組成協程的東西。
(L6)我們通過直接調用該函數來創建協程對象。你的代碼很少會這樣做,但我想在這里明確地表示,我們正在向每個create_task()和ensure_future()傳遞一個協程對象。
(L7)獲取一個循環。
(L9)首先,我們使用loop.create_task()在循環中調度協程,并返回一個新的Task實例。
(L10)驗證類型。到目前為止,沒有什么有趣的。
(L12)我們展示了asyncio.ensure_future()可以被用來執行與create_task()相同的動作:我們傳入了一個協程,并返回了一個Task實例(并且協程已經被安排在循環中運行)!如果傳入的是協程,那么loop.create_task()和asyncio.ensure_future()之間沒有區別。
(L15)如果我們給ensure_future()傳遞一個Task實例會發生什么呢?注意我們要傳遞的Task實例是已經在第4步通過loop.create_task()創建好的。
(L16)返回的Task實例與傳入的Task實例完全相同:它在被傳遞時沒有被改變。
直接傳遞Future實例的意義何在?為什么用同一個函數做兩件不同的事情?答案是,ensure_future()的目的是讓框架作者向最終用戶開發者提供可以處理兩種參數的API。不相信我?這是ex-BDFL自己說的:
ensure_future()的要點是,如果你有一個可能是協程或Future(后者包括一個Task,因為它是Future的子類)的東西,并且你想能夠調用一個只在Future上定義的方法(可能唯一有用的例子是cancel())。當它已經是Future(或Task)時,它什么也不做;當它是協程時,它將它包裝在Task中。
如果您知道您有一個協程,并且希望它被調度,那么正確的API是create_task()。唯一應該調用ensure_future()的時候是當你提供一個API(像大多數asyncio自己的API),它接受協程或Future,你需要對它做一些事情,需要你有一個Future。
—Guido van Rossum
總而言之,asyncio.sure_future()是一個為框架設計者準備的輔助函數。這一點最容易通過與一種更常見的函數進行類比來解釋,所以我們來做這個解釋。如果你有幾年的編程經驗,你可能已經見過類似于例3-19中的istify()函數的函數。示例 3-19中listify()的函數。
示例 3-19. 一個強制輸入列表的工具函數
這個函數試圖將參數轉換為一個列表,不管輸入的是什么。api和框架中經常使用這類函數將輸入強制轉換為已知類型,這將簡化后續代碼——在本例中,您知道參數(來自listify()的輸出)將始終是一個列表。
如果我將listify()函數重命名為ensure_list(),那么您應該開始看到與asyncio.ensure_future()的類似之處:它總是試圖將參數強制轉換為Future(或子類)類型。這是一個實用函數,它使框架開發人員(而不是像你我這樣的終端用戶開發人員)的工作變得更容易。
實際上,asyncio標準庫模塊本身使用ensure_future()正是出于這個原因。當你下次查看API時,你會發現函數參數被描述為“可等待對象”,很可能內部使用ensure_future()強制轉換參數。例如,asyncio.gather()函數就像下面的代碼一樣:
aws參數表示“可等待對象”,包括協程、task和future。在內部,gather()使用ensure_future()進行類型強制轉換:task和future保持不變,而把協程強制轉為task。
這里的關鍵是,作為終端用戶應用程序開發人員,應該永遠不需要使用asyncio.ensure_future()。它更像是框架設計師的工具。如果你需要在事件循環上調度協程,只需直接使用asyncio.create_task()來完成。
在接下來的幾節中,我們將回到語言級別的特性,從異步上下文管理器開始。
很多業務場景中,我們希望通過一個特定的函數來擬合業務數據,以此來預測未來數據的變化趨勢。(比如用戶的留存變化、付費變化等)
本文主要介紹在 Python 中常用的兩種曲線擬合方法:多項式擬合 和 自定義函數擬合。
通過多項式擬合,我們只需要指定想要擬合的多項式的最高項次是多少即可。
運行結果:
對于自定義函數擬合,不僅可以用于直線、二次曲線、三次曲線的擬合,它可以適用于任意形式的曲線的擬合,只要定義好合適的曲線方程即可。
運行結果:
答主更多應該算一個trader而不是quant(雖然對quant的一些知識也略懂),下面的答案可能更多是從一個交易員的角度來回答。
想在市場上賺錢,必須同時具備兩樣能力:
研究:做出正確的能夠獲利的決策,也就是尋找Alpha的能力
交易:基于研究的結果和交易信號,執行相應的下單風控等操作,也就是將Alpha落實到你賬戶盈利上的能力
研究方面
龍哥的答案已經覆蓋了常用的庫,這里就從研究的整體方向上來介紹下:
獲取數據:可以選擇使用TuShare、通聯、萬得等數據工具下載數據,并將原始的數據格式轉化為你自己想用的數據格式(可以用Python腳本實現),以保存到數據庫中
存儲數據:幾乎絕大部分常用的數據庫都提供了Python接口,SQL/NoSQL/HDF5等等多種,最常用的應該是MySql和MongoDB,有興趣學Q的也可以直接去用KDB+,數據庫具體會應用的方向包括保存數據、讀取數據、數據補全機制、數據變頻(TICK變K線等)
數據回測:將數據讀取到內存中后(以numpy數組或者pandas序列的形式),進行策略的回測,并對回測結果進行研究(matplotlib繪圖),或者對參數進行優化(scipy等)
建模相關:對數據進行一些統計學檢驗(statsmodel)以及機器學習建模(scikit-learn)
集成開發環境:在有針對性的IDE中實現以上步驟會更加簡便快捷(ipython/spyder)
交易方面
這部分是答主的主場了,主要分為兩塊:
1. 執行交易:對于絕大部分量化策略,都在一定程度上需要自動/半自動的下單功能。
CTA策略突破入場(秒級延時)
期權做市實時掛撤單(毫秒級延時)
股指期貨高頻(微秒級延時)
分級基金套利(批量自動下單,延時沒有以上幾種重要)
Alpha套利(籃子交易,一般要使用vwap等算法)
2. 策略風控:同樣一般需要自動或者半自動的風控功能.
期權組合的希臘值風險實時監控對沖
分級基金套利的beta凈敞口、行業暴露等實時監控對沖
Alpha套利策略的因子監控
具體需要掌握的知識:
1. 模擬實盤交易的策略回測:將策略重新編寫為可以基于數據回放(逐TICK/逐K線)的模式進行回測的程序,模擬實際交易情況,杜絕未來函數的可能性,實盤交易中使用完全相同的程序進行交易,保證實盤和回測的一致性。這塊通常需要專門的框架或者程序,比如通聯的優礦、掘金、vn.py框架中的vn.strategy等。
2. 實盤交易接口:將想要下的單子通過交易接口發送到經紀商柜臺,目前可以實盤直接使用的應該包括掘金(期貨)、vn.py中的vn.lts(證券、期權)和vn.ctp(期貨)。如果要使用其他的柜臺需要自己封裝,如恒生、金證等。
3. 其他語言拓展:作為最有名的膠水語言之一,Python的拓展功能不用絕對是浪費。針對計算瓶頸可以使用cython拓展,針對API可以用boost.python和swig進行封裝,調用matlab直接運行其中提供的特定算法,使用COM接口調用Excel自動生成每日交易記錄和報表......
4. GUI程序的開發:相當數量的量化交易依舊需要交易員進行實時監控,除了在cmd中不斷print一些數據外,更合理的方案是開發自己需要的GUI界面,重點推薦PyQt,比在C++中用Qt開發要來的快捷很多,底層運行的也是C++的代碼,速度完全不用擔心。一些有特別需求的人也可以考慮開發在瀏覽器中顯示的界面,比如經常想用手機遠程監控。
對于程序員而言,了解編程語言的發展趨勢,有助于個人職業成長;而對于想要入行IT的新人而言,最大的疑惑大多來自于不知道該選擇哪門編程語言發展前景更好!
隨著云計算、人工智能等的發展,Python語言最近幾年出現了爆發式的增長,Python語言的關注度增長了10倍。云計算、大數據分析、人工智能、物聯網等領域Python應用無處不在。百度、阿里、騰訊、網易、新浪,搜狐等各公司都在大規模使用Python技術。
各個公司對于Python人才急缺,但是掌握Python技術的人才不多,造成各個公司急缺Python開發人員。所以說未來Python的發展前景還是挺不錯的;自1991年發布以來,Python的普及程度已經大大提高。現在已經躋身世界上最流行的編程語言之列,克服了如速度太慢或無法擴展語言的詬病。雖然很多開源項目或語言浮浮沉沉,但是Python一直在增長,排名不斷提升。
本文名稱:未來函數python 未來函數dclose
本文網址:http://vcdvsql.cn/article14/dopgode.html
成都網站建設公司_創新互聯,為您提供網站維護、網站制作、網頁設計公司、用戶體驗、電子商務、軟件開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯