針對(duì)海知智能投資接口,我們開(kāi)發(fā)了一套智能投資框架,幫助用戶更加方便快捷地構(gòu)建自己的模擬投資策略??蚣苤攸c(diǎn)解決了股票歷史數(shù)據(jù)和模擬投資邏輯控制等問(wèn)題。
詳細(xì)連接參考:https://github.com/NotTodayNotMe/Fintech.git
下面是框架說(shuō)明文檔的一部分
Fintech是一套模擬投資系統(tǒng),基于海知平臺(tái)的模擬投資系統(tǒng)進(jìn)行投資。在框架下,可以非常方便的制定模擬投資策略。用戶只需要定義每一天需要執(zhí)行的操作,系統(tǒng)會(huì)自動(dòng)完成日期跳轉(zhuǎn)等復(fù)雜的控制過(guò)程,同時(shí)框架運(yùn)行在本地,可以很方便的制定高度自由的策略。避免了那些在線編輯的量化網(wǎng)站無(wú)法高度自由使用自己定義的庫(kù)的局限性。
框架有一些依賴包,請(qǐng)?jiān)谶\(yùn)行框架之前安裝: - tushare(版本不低于1.2.11) - bs4(用于支持tushare) - xlrd(用于支持tushare) - requests(用于支持tushare) - sqlalchemy(數(shù)據(jù)庫(kù)ORM框架) - alembic(與sqlalchemy相對(duì)應(yīng)的migrate框架) 上述框架還會(huì)捆綁安裝pandas,numpy等常用的科學(xué)計(jì)算框架。 注:整個(gè)框架的核心數(shù)據(jù)結(jié)構(gòu)是pandas DataFrame,幾乎所有的數(shù)據(jù)都包裹在DataFrame當(dāng)中,因此需要使用者熟悉pandas的基本操作。
如果你是直接從GitHub克隆的本項(xiàng)目,那么項(xiàng)目將不會(huì)自帶數(shù)據(jù)庫(kù),需要用戶自行初始化數(shù)據(jù)庫(kù)操作步驟如下: 1. 生成數(shù)據(jù)庫(kù) 默認(rèn)的數(shù)據(jù)庫(kù)是python自帶的sqlite3文件數(shù)據(jù)庫(kù)。由于系統(tǒng)針對(duì)的是個(gè)人用戶,因此sqlite3完全可以滿足用戶的全部需求,如果想使用其他數(shù)據(jù)庫(kù),請(qǐng)參考sqlalchemy的官方文檔,將項(xiàng)目連接至其他數(shù)據(jù)庫(kù)
生成數(shù)據(jù)庫(kù)表只需要直接運(yùn)行DB.moelds.py即可
在本節(jié)將會(huì)從一個(gè)最簡(jiǎn)單的策略開(kāi)始,為你完整的演示如何完成一個(gè)自己的模擬投資策略
在Fintech框架下,你只需要考慮設(shè)計(jì)策略每天應(yīng)該執(zhí)行什么樣的操作,不需要考慮時(shí)間跳轉(zhuǎn)等復(fù)雜的控制邏輯。 我們先從最簡(jiǎn)單的策略開(kāi)始————對(duì)于一只股票,如果他過(guò)去5天的收盤(pán)價(jià)均價(jià)比昨天的收盤(pán)價(jià)低,則買(mǎi)入該股票,反之賣(mài)出。 在開(kāi)始編輯策略之前,第一步,我們需要初始化模擬投資引擎。
from TestEngine.TestEngine import Engine engine = Engine(user_name='***',#海知平臺(tái)用戶名 password='***',#密碼 core = 'HaiZhi',#選擇海知接口作為模擬投資核心引擎 type = 'HistoryTrading',#選擇歷史回測(cè)模式 initial_time='2017-01-01',#歷史回測(cè)開(kāi)始時(shí)間 end_date='2018-1-1',#歷史回測(cè)結(jié)束時(shí)間,默認(rèn)為今天 initial_money = 1000000)#初始資金
執(zhí)行上面的代碼就可以創(chuàng)建一個(gè)新的回測(cè)引擎實(shí)例。
初始化了引擎之后,我們就可以開(kāi)始編輯自己的策略了,我們?yōu)椴呗云鹈鹴utorial。
注:在本框架下,策略可以隨意起名。但是需要注意,必須聲明傳入context和engine兩個(gè)參數(shù)。也就是說(shuō),聲明傳入上述兩個(gè)參數(shù)的函數(shù)都可以作為策略被調(diào)用運(yùn)行。
def tutorial(context,engine): print '當(dāng)前運(yùn)行時(shí)間',context.current_time#打印當(dāng)前運(yùn)行時(shí)間 hs300s = context.DataModule.HS300s()#獲取滬深300指數(shù) for security in hs300s.index:#遍歷滬深300股票列表里的股票代碼 data = context.DataModule.stock_history_data(security)#獲取股票歷史交易數(shù)據(jù) if sum(data.iloc[0:5].close)/5 > data.iloc[5].close: print security,engine.buy(str(security),volume= 100) else: print security,engine.sell(str(security),volume= 100)
細(xì)心的讀者會(huì)發(fā)現(xiàn),我們?yōu)榫帉?xiě)的策略傳入了兩個(gè)參數(shù),context和engine。我們會(huì)在今后詳細(xì)解釋這兩個(gè)參數(shù)的作用。
目前我們只需要知道,context主要用于數(shù)據(jù)交互,engine主要用于執(zhí)行股票買(mǎi)賣(mài)等操作。
現(xiàn)在我們執(zhí)行下面的代碼運(yùn)行我們的策略同時(shí)將運(yùn)行的結(jié)果輸出到歷史交割單文件中。得到了歷史交割單文件,就可以通過(guò)海之平臺(tái)的歷史診斷功能對(duì)策略進(jìn)行評(píng)測(cè)了!
engine.run_stratagy(tutorial)#運(yùn)行策略 print engine._core.history_to_csv()#將交割單輸出
需要注意的是,在運(yùn)行策略的時(shí)候,我們只需要向引擎?zhèn)魅氩呗悦?。開(kāi)始運(yùn)行之后,引擎會(huì)自動(dòng)在每個(gè)歷史日期自動(dòng)運(yùn)行我們的策略。
在上述例子中,假設(shè)我們不想操作HS300s中所有的300支股票,而是想操作我們選定的一些股票。最簡(jiǎn)單的實(shí)現(xiàn)方式是在策略中聲明一個(gè)局部變量,這個(gè)變量中存儲(chǔ)我們想要操作的股票列表,另一種更加高級(jí)的實(shí)現(xiàn)方式是向引擎?zhèn)魅胍粋€(gè)全局變量,這樣我們?cè)诨販y(cè)過(guò)程中,每一次重新調(diào)用策略,策略都可以對(duì)這個(gè)全局變量進(jìn)行操作。很顯然,這樣的方式可以讓我們動(dòng)態(tài)的在不同的日期之間保持一些數(shù)據(jù)。在很多時(shí)候,全局變量是不可代替的。
在上一節(jié)當(dāng)中,我們提到過(guò)engine.context是用來(lái)進(jìn)行數(shù)據(jù)交互的類。其中,context.user_data是一個(gè)字典類型,用戶可以將自定義的數(shù)據(jù)保存在context.user_data當(dāng)中,通過(guò)這種方式,context.user_data會(huì)作為回測(cè)引擎的全局變量,保證回測(cè)策略在不同的交易日之間可以共享一些數(shù)據(jù)。
下面的代碼就是將股票列表傳入回測(cè)引擎當(dāng)中的示例。
engine.context.user_data['stock_list'] = ['600848','600847']
現(xiàn)在我們?cè)诓呗灾型ㄟ^(guò)直接訪問(wèn)
context.user_data['stock_list']就能查看到我們之前傳入的用戶變量。我們可以再策略運(yùn)行中改變這個(gè)變量,也可以在策略開(kāi)始之前傳入用戶自定義的變量.想要在策略開(kāi)始之前存儲(chǔ)一寫(xiě)變量,只需要在
engine.run_stratagy()之前,在
context.user_data存儲(chǔ)數(shù)據(jù)即可。
至此,你已經(jīng)學(xué)會(huì)如何使用框架最基本的功能進(jìn)行模擬投資了。不難發(fā)現(xiàn),框架給予了用戶很大的自由度,你可以在使用框架的同時(shí)使用各種其他第三方庫(kù)和自定義庫(kù),使你的研究更加方便自由!
發(fā)帖時(shí)間:2018-08-28 15:14:28
最新修改時(shí)間: