文章目錄
- qteasy金融歷史數據管理
- 總體介紹
- 本地數據源——DataSource對象
- 默認數據源
- 查看數據表
- 查看數據源的整體信息
- 最重要的數據表
- 其他的數據表
- 從數據表中獲取數據
- 向數據表中添加數據
- 刪除數據表 —— 請盡量小心,刪除后無法恢復!!
- 總結
qteasy金融歷史數據管理
qteasy
是一套功能全面的量化交易工具包,金融數據的獲取和使用是qteasy
提供的核心功能之一。
總體介紹
目前,網上有很多不同的金融數據獲取渠道,可供量化交易者下載金融數據,但是直接從網上下載數據,有許多缺點:
- 數據格式不統一:同樣的數據,例如交易量數據,有些渠道提供的數據單位為“手”,而另一些提供的數據為“股”
- 可提取的數據量有限:尤其是通過爬蟲獲取的數據,高頻K線數據往往只有過去幾天的數據,更久以前的數據無法提供
- 數據提取不穩定:數據提取速度和成功率不能保證,受網絡連接影響很大
- 下載成本較高:收費數據渠道往往能提供更全面的數據,但是一般都有流量限制,而免費渠道提供的數據不全,也提高成本
- 信息提取不易:獲得原始數據以后,還需要進一步將數據轉化為需要的信息,這個過程費力且不直觀
qteasy
就是為了解決上面提到的這些痛點而設計的。
qteasy
的金融數據管理模塊提供了三個主要的功能,這三個功能的設計,著眼點都是為了
-
數據拉取:從多個不同的網絡數據提供商拉取多種金融數據,滿足不同用戶的使用習慣:
qteasy
提供的數據拉取API具備強大的多線程并行下載、數據分塊下載、下載流量控制和錯誤延時重試功能,以適應不同數據供應商各種變態的流量限制,同時數據拉取API可以方便地定期自動運行完成數據批量下載任務,不用擔心錯過高頻數據。 -
數據清洗和存儲:標準化定義本地數據存儲,將從網絡拉取的數據清洗、整理后保存到本地數據庫中:
qteasy
定義了一個專門用于存儲金融歷史數據的DataSource
類,并以標準化的形式預定義了大量金融歷史數據存儲表,不管數據的來源如何,最終存儲的數據始終會被清洗后以統一的格式存儲在DataSource
中,避免不同時期不同來源的數據產生偏差,確保數據高質量存儲。同時提供多種存儲引擎,滿足不同用戶的使用習慣。 -
信息提取和使用:區分“數據“和”信息,“提供接口將集中在數據表中的真正有意義的信息提取出來,從而直接用于交易策略或數據分析:
我們知道”數據“并不等于”信息“,光是將數據表保存在本地不代表立即就能使用其中的信息。而
qteasy
特意將數據表中的可用“信息”以標準化的方式定義為DataType
對象,簡化數據訪問過程和策略的定義過程,統一的API使得獲取信息的過程變得更加直接和友好
總體來說,qteasy
的數據獲取模塊的結構可以用下面的示意圖來表示:
如圖所示,qteasy
的數據功能分為三層,第一層包括多種數據下載接口,用于從網絡數據提供商獲取數據,這個過程稱為DataFetching
。第二層是qteasy
的核心功能之一,定義了一個本地數據庫用于存儲大量的數據表,并且支持多種數據引擎,這一層的核心是DataSource
類,第三層是數據應用層,將數據表中有意義的信息提取出來定義為DataType
對象,提取數據的過程被稱為Information Extraction
。而這個DataType
對象在qteasy
內部被廣泛使用,創建交易策略,進行數據分析、可視化等后續的一切工作,都是以DataType對象為基礎進行的。
正因為金融數據在量化交易過程中的重要性,從下一章節開始,我們將詳細介紹qteasy數據功能的所有功能模塊:
- 本地數據源——DataSource對象
- 本地數據源——內置數據表
- 拉取網絡數據——從不同的渠道
- 使用本地數據——DataType對象
本地數據源——DataSource對象
本地數據源是qteasy
數據管理功能的核心,所有的數據都必須首先下載并保存在本地數據源中,才能為qteasy
所用。qteasy
使用DataSource
對象管理本地數據源,本地數據源類似于一個數據庫,包含一系列預先定義的數據表,DataSource
類提供了一系列API用于數據表中數據的管理,包括讀取、更新、刪除和查詢其中的數據。
要創建一個新的DataSource
對象,可以使用下面的命令:
>>> import qteasy as qt
>>> ds = qt.DataSource()
通過打印DataSource
對象,可以查看其最基本的屬性:
>>> print(ds)
file://csv@qt_root/data/
從DataSource
的打印字符串file://csv@qt_root/data/
中,可以看出它的基本屬性
打印結果包含數據源對象的基本信息:
file:
– 數據源的類型。qteasy
支持兩種類型的數據源:文件型和數據庫型,file
代表數據源中的所有數據表都是以文件的形式保存在磁盤上的,同樣,數據也可以保存在mysql
數據庫中,此時數據源的類型代碼為db
。csv:
– 數據文件保存格式。qteasy
可以將數據文件以不同的格式保存在磁盤上,最基本的格式為csv
文件,但是用戶同樣可以將數據保存為hdf
文件和fth
文件(feather
文件),以滿足不同的性能偏好。qt_root/data/:
– 數據文件的保存路徑。其中qt_root
表示qteasy
的安裝根路徑,默認情況下所有數據文件都保存在根目錄下的/data/
子路徑下
同樣,可以創建一個數據保存類型為數據庫的數據源對象,并查看其基本屬性:
不過,創建類型為數據庫的數據源時,需要指定需要連接的Mysql數據庫的主機名、用戶名、密碼、(或者)數據庫名稱等信息:
>>> ds_db = qt.DataSource(source_type='database', host='localhost', user='您的用戶名', password='您的密碼', db_name='test_db')
>>> print(ds_db)
db:mysql://localhost@3306/test_db
同樣,打印結果中包含數據源的基本信息:
db:mysql
– 數據源的類型為mysql數據庫,所有的數據表都保存在數據庫中localhost
– 數據庫的主機名3306
– 數據庫連接端口test_db
– 數據庫名稱,如果不指定名稱,默認數據庫qt_db
,不過這個數據庫必須事先創建好
不同的數據源對象,如果它們的存儲方式不同,存儲路徑不同,那么它們所保存的數據沒有關系,互不干擾,但如果兩個數據源指向同一個路徑,且文件類型相同時,那么它們所保存的數據就會重復。
要查看數據源的更多基本屬性,可以調用數據源對象的幾個屬性查看:
>>> print(ds.source_type) # 數據源的類型
file
>>> print(ds_db.source_type)
db
>>> print(ds.file_type, ds.file_path) # 數據源的文件類型和存儲路徑
csv /Users/jackie/Projects/qteasy/qteasy/data/
>>> print(ds.connection_type, ds_db.connection_type) # 數據源的連接類型
file://csv@qt_root/data/ db:mysql://localhost@3306/test_db
默認數據源
qteasy
有一個內置默認的數據源,不需要用戶手動創建,默認情況下,所有的數據都會保存到這個默認數據源,并從這個數據源讀取。用戶可以通過qteasy
的配置文件配置該數據源的參數,確保該數據源指向正確的路徑或使用正確的用戶名登陸正確的數據庫。通過下面的方法查看內置默認數據源的屬性:
>>> print(qt.QT_DATA_SOURCE)
db:mysql://www.qteasy.online@3306/ts_db
查看數據表
了解數據源對象的基本屬性后,下一步可以進一步了解數據源中保存的數據。
數據源中的數據表都是事先定義好的,每一張數據表都保存一類不同的數據,這些數據涵蓋滬深股市、期貨市場的股票、指數、基金、期貨、期權等各種不同投資產品的基本信息、K線行情、上市公司業績報表、宏觀經濟數據等等大量的數據,完整的數據表清單介紹,請參見下一章節,這里主要介紹如何查看各種數據表的基本情況和數據。
數據源中的數據表清單可以通過數據源的all_tables
屬性獲取,它會返回一個列表對象,包含數據源中已經預定義的所有數據表。不過,這里必須厘清一個概念,數據源中雖然已經定義好了很多數據表,但這些數據表僅僅是有了基本的定義,即表頭信息,數據表的字段名稱、每個字段的含義以及數據類型都定義好了,但是剛剛建立的新數據源,其數據表往往都是空的,還沒有任何數據。如果要查看數據源中有哪些數據表已經有了數據,需要用get_table_info()
函數來獲取:
>>> print('All tables in datasource:', len(ds.all_tables))
All tables in datasource: 108
>>> print('Some tables:', ds.all_tables[5:15])
Some tables: ['hk_trade_calendar', 'us_trade_calendar', 'stock_basic', 'hk_stock_basic', 'us_stock_basic', 'stock_names', 'stock_company', 'stk_managers', 'new_share', 'money_flow']
可見,目前版本的qteasy
預定義了108張數據表,其中部分數據表的名稱包括stock_basic
等。
如果要查看當前數據源中某張數據表的詳情,例如該數據表的定義,是否包含數據等信息,使用get_table_info()
方法獲取:
>>> info = ds.get_table_info('stock_basic')
<stock_basic>--<股票基本信息>
852KB/5K records on disc
primary keys:
----------------------------------------
1: ts_code: <5396> entriesstarts: 000001.SZ, end: 920128.BJcolumns of table:
------------------------------------columns dtypes remarks
0 ts_code varchar(9) 證券代碼
1 symbol varchar(6) 股票代碼
2 name varchar(20) 股票名稱
3 area varchar(10) 地域
4 industry varchar(10) 所屬行業
5 fullname varchar(50) 股票全稱
6 enname varchar(120) 英文全稱
7 cnspell varchar(40) 拼音縮寫
8 market varchar(6) 市場類型
9 exchange varchar(6) 交易所代碼
10 curr_type varchar(6) 交易貨幣
11 list_status varchar(4) 上市狀態
12 list_date date 上市日期
13 delist_date date 退市日期
14 is_hs varchar(2) 是否滬深港通
打印的信息包括數據表的名稱、說明、數據表的字段定義以及數據類型。
值得說明的是,如果數據表中已經填充了數據,那么就會顯示出數據表目前的大小,在上面的例子中,一些關鍵信息的解釋如下:
852KB/5K records on disc
– 表示數據表占用磁盤空間大約852K字節,且數據量大約為5000行primary keys
– 顯示數據的主鍵列,這里表示ts_code
列為數據表的主鍵,且該列大約有5396條不同的記錄。如果數據表有多個主鍵,那么每個主鍵列都分別列出,同時會列出該字段數據的范圍,例如上例中ts_code
列數據范圍就是從000001.SZ
開始一直到920128.BJ
為止,讓我們知道股票基本信息表里包含了代碼從000001一直到920128為止的共五千多只股票的信息columns of table
– 這里顯示數據表的字段定義,也就是數據表的schema
。列出每一列的名稱columns
、數據類型dtypes
以及說明信息remarks
另外,get_table_info()
方法返回一個dict,同樣包含該數據表的信息,可以將這些信息打印出來,與上述格式化信息對照了解:
>>> print(info)
{'table': 'stock_basic', 'table_exists': True, 'table_size': '852KB', 'table_rows': '5K', 'primary_key1': 'ts_code', 'pk_records1': 5396, 'pk_min1': '000001.SZ', 'pk_max1': '920128.BJ', 'primary_key2': None, 'pk_records2': None, 'pk_min2': None, 'pk_max2': None}
查看數據源的整體信息
通過上面的方法,我們可以查看每一張數據表的具體定義和已經填充的數據信息。同樣,通過overview()
方法,我們可以檢查所有的數據表,并匯總出整個數據源的整體信息:
>>> overview = ds.overview()
Analyzing local data source tables... depending on size of tables, it may take a few minutes
[########################################]104/104-100.0% A...zing completed!
Finished analyzing datasource:
file://csv@qt_root/data/
3 table(s) out of 104 contain local data as summary below, to view complete list, print returned DataFrame
===============================tables with local data===============================Has_data Size_on_disk Record_count Record_start Record_end
table
trade_calendar True 1.8MB 70K CFFEX SZSE
stock_basic True 852KB 5K None None
stock_daily True 98.8MB 1.3M 20211112 20241231
查看整個數據源的總體信息,可能需要花費數分鐘的時間,因為需要統計每張數據表的所有信息。
在統計過程中,qteasy
會顯示一根進度條顯示統計的進度,最終統計分析完成后,qteasy
會將數據源中所有數據表的信息以DataFrame的形式返回,并打印出關鍵的信息。
上面的信息顯示了數據源中有3張數據表已經有了數據,包括trade_calendar
、stock_basic
和stock_daily
,并顯示了這些數據表的數據量、占用磁盤空間、數據的起始日期��結束日期等信息。如果想查看所有數據表的信息,可以將返回的DataFrame
打印出來:
>>> print(overview)has_data size records pk1 records1 min1 \
table
trade_calendar True 1.8MB 70K cal_date 12865 19901012
hk_trade_calendar False 0 0 cal_date unknown N/A
us_trade_calendar False 0 0 cal_date unknown N/A
stock_basic True 852KB 5K ts_code 5396 000001.SZ
hk_stock_basic False 0 0 ts_code unknown N/A
... ... ... ... ... ... ...
cn_cpi False 0 0 month unknown N/A
cn_ppi False 0 0 month unknown N/A
cn_money False 0 0 month unknown N/A
cn_sf False 0 0 month unknown N/A
cn_pmi False 0 0 month unknown N/A max1 pk2 records2 min2 max2
table
trade_calendar 20251231 exchange 7 CFFEX SZSE
hk_trade_calendar N/A None None None None
us_trade_calendar N/A None None None None
stock_basic 920128.BJ None None None None
hk_stock_basic N/A None None None None
... ... ... ... ... ...
cn_cpi N/A None None None None
cn_ppi N/A None None None None
cn_money N/A None None None None
cn_sf N/A None None None None
cn_pmi N/A None None None None [104 rows x 11 columns]
最重要的數據表
如果您是第一次使用qteasy
,很可能數據源中的數據表都是空的,沒有任何數據。通常這沒有任何問題,因為qteasy
的設計初衷就是極大地簡化金融數據的獲取和使用過程。
您可以非常容易地從網絡數據提供商處獲取最基本的數據。不過,雖然數據表中的數據可以是空的,但是有幾張數據表卻比其他的數據表更加重要,您應該優先將這幾張數據表的數據填充完整,因為這幾張數據表中的數據是很多其他數據表的基礎,甚至是qteasy
的運行基礎:
trade_calendar
– 交易日歷表,包含了所有交易所的交易日歷信息,包括交易日、交易所代碼、交易所名稱等信息。可以說這是qteasy
運行的基礎,如果缺了這張表,qteasy
的很多功能都將無法運行或者將降低效率。qteasy
使用這張表中的數據來判斷交易日,如果要下載其他的數據表,通常也必須通過交易日數據表來確定下載的起止日期,因此,這是您應該絕對優先填充的數據表。stock_basic
– 股票基本信息表,包含了所有上市股票的基本信息,包括股票代碼、股票名稱、上市日期、退市日期、所屬行業、地域等信息。這張表是很多其他數據表的基礎,例如股票日K線數據表、股票財務數據表等,因此,這也是您應該優先填充的數據表。index_basic
– 指數基本信息表,包含了所有指數的基本信息,包括指數代碼、指數名稱、發布日期、退市日期等信息。這張表是很多其他數據表的基礎,例如指數日K線數據表、指數成分股表等,因此,這也是您應該優先填充的數據表。fund_basic
– 基金基本信息表,包含了所有基金的基本信息,包括基金代碼、基金名稱、基金類型、基金規模等信息。這張表是很多其他數據表的基礎,例如基金日K線數據表、基金凈值數據表等,因此,這也是您應該優先填充的數據表。
基本上,如果您能夠填充了上面這幾張數據表的數據,那么您就可以開始比較順暢使用qteasy
的大部分數據相關的功能了。
另外,qteasy
還在數據源中定義了幾張系統數據表,這些表一共四張,用于存儲跟實盤交易相關的信息:
sys_op_live_accounts
– 實盤交易賬戶信息表,包含了所有實盤交易賬戶的基本信息,包括賬戶ID、賬戶名稱、賬戶類型、賬戶狀態等信息。sys_op_positions
– 實盤持倉信息表,包括所有實盤交易賬戶的持倉信息,包括賬戶ID、證券代碼、證券名稱、持倉數量、持倉成本等信息。sys_op_trade_orders
– 實盤交易委托表,包括所有實盤交易賬戶的交易委托信息,包括賬戶ID、委托時間、委托類型、證券代碼、委托數量、委托價格等信息。sys_op_trade_results
– 實盤交易成交表,包括所有實盤交易賬戶的交易成交信息,包括賬戶ID、成交時間、證券代碼、成交數量、成交價格等信息。
上面四張表是qteasy實盤交易功能的基礎,這幾張表中的數據不需要人為填充,而是系統自動生成,您不需要查看、填充或刪除這些表
其他的數據表
除了上面提到的幾張重要的數據表之外,數據源中還定義了大量的數據表,這些數據表包含了各種各樣的金融數據,包括股票、指數、基金、期貨、期權等各種金融產品的基本信息、日K線數據、財務數據、分紅數據、業績報表、宏觀經濟數據等等,主要分類如下:
- 行情數據表 – 這類數據表包含了股票、基金、指數各個不同頻率的K線行情數據
- 基本信息表 – 這類數據表包含了股票、基金、指數、期貨、期權等各種金融產品的基本信息
- 指標信息表 – 這類數據表包含了各種指標的信息,例如技術指標、基本面指標、宏觀經濟指標等
- 財務數據表 – 這類數據表包含了上市公司的財務報表數據,包括資產負債表、利潤表、現金流量表等
- 業績報表表 – 這類數據表包含了上市公司的業績報表數據,包括業績快報、業績預告、業績預測等
- 分紅交易數據表 – 這類數據表包含了上市公司的分紅數據,以及股票大宗交易、股東交易等信息表
- 參考數據表 – 這類數據表包含了各種參考數據,例如宏觀經濟數據、行業數據、交易所數據等
這些數據表的具體定義和數據類型,可以通過get_table_info()
方法查看,或者通過本文檔的下一章節查詢。
從數據表中獲取數據
如果數據表中已經填充了數據,那么現在就可以從中讀取數據了。DataSource
提供了read_table_data()
方法,從數據源中直接讀取某個數據表中的數據,同時,用戶可以篩選數據的起止日期以及證券代碼,同時不用考慮數據表的具體結構、存儲方式、存儲位置等具體的實現方式。
為了避免讀取的數據量過大,建議在讀取數據時一定要同時給出某些篩選條件。對于read_table_data()
方法來說,用戶總是可以通過證券代碼和起止日期來篩選數據:
shares
: 給出一個證券代碼或者逗號分隔的多個證券代碼,如果數據表的主鍵中含有證券代碼,那么根據該證券代碼篩選輸出的數據start
: 給出一個日期,格式為“YYYYMMDD”
,如果數據表的主鍵包含時間或日期,那么根據篩選start
與end
之間的數據,start/end
必須成對給出end
: 給出一個日期,格式為“YYYYMMDD”
,如果數據表的主鍵包含時間或日期,那么根據篩選start
與end
之間的數據,start/end
必須成對給出
DataSource
對象會根據輸入的篩選條件自動篩選數據,例如:
從stock_daily
表中讀取一只股票(000651.SZ
)從2024年1月1日到2024年1月15日之間的股票日K線數據:
>>> ds.read_table_data(table='stock_daily', shares='000651.SZ', start='20240101', end='20240115')open high low ... pct_chg vol amount
ts_code trade_date ...
000651.SZ 2024-01-03 32.00 32.08 31.70 ... -0.7181 254468.92 810315.0132024-01-04 31.90 32.01 31.45 ... 0.4717 333398.05 1057458.4112024-01-08 33.12 33.21 32.85 ... -0.2426 415911.34 1372722.0502024-01-02 32.17 32.20 31.96 ... -0.4352 253797.30 814257.1752024-01-15 33.45 33.95 33.42 ... 0.6544 295681.34 996815.7252024-01-11 33.66 33.82 33.42 ... -0.2376 284088.74 955075.1002024-01-09 32.81 33.55 32.65 ... 1.7933 438207.66 1454959.6372024-01-10 33.35 33.84 33.28 ... 0.5375 366485.52 1233441.5722024-01-12 33.50 33.83 33.42 ... 0.0893 224012.73 753931.8212024-01-05 32.05 33.29 31.62 ... 3.2238 832156.75 2738167.636[10 rows x 9 columns]
DataSource
對象會自動根據數據表的定義來進行正確的篩選,并忽略掉不必要的參數。例如,我們可以篩選出某兩支股票的基本信息。對于股票基本信息來說,交易日期是個不必要的參數,此時qteasy
會自動忽略掉start
/end
參數并給出提示信息。同樣,shares
參數也不一定只能匹配股票代碼,對于基金、指數、甚至期貨、期權,都可以同樣匹配:
>>> ds.read_table_data(table='stock_basic', shares='000651.SZ,000700.SZ', start='20240101', end='20240131')
/Users/jackie/Projects/qteasy/qteasy/database.py:1314: RuntimeWarning: list index out of range
can not find date-like primary key in the table stock_basic!
passed start(2024-01-01) and end(2024-01-31) arguments will be ignored!warnings.warn(msg, RuntimeWarning)symbol name area industry ... list_status list_date delist_date is_hs
ts_code ...
000651.SZ 651 格力電器 廣東 家用電器 ... L 19961118 NaN S
000700.SZ 700 模塑科技 江蘇 汽車配件 ... L 19970228 NaN S[2 rows x 14 columns]
關于read_table_data()
方法的更多信息,請參閱DataSource
對象的參考信息。
向數據表中添加數據
如果數據表中尚未填充數據,或者數據表中填充的數據不足以滿足我們的需求,那么讀取數據就會不成功。為了避免這種情況,我們需要向數據表中填充數據。
向數據表中填充數據可以使用數據源的update_table_data()
方法。使用這個API,用戶可以將保存在一個DataFrame
中的數據寫入到相應的數據表中。這個API只需要給出三個參數:
table
: 一個數據表的名稱,需要寫入數據的數據表df
: 一個DataFrame
,保存了需要寫入數據表中的數據merge_type
: 如果是update
則更新數據表中已經存在的數據,如果是ignore
則忽略重復的數據.
使用update_table_data()
方法,用戶不需要保證寫入的數據格式與數據表完全一致,只要數據格式與數據表大致一致,qteasy
就會自動整理數據格式、刪除重復數據,確保寫入數據表中的數據符合要求。
下面將一些示例數據寫入數據源(寫入的數據僅為演示效果)
>>> import pandas as pd
>>> df = pd.DataFrame({
... 'ts_code': ['000001.SZ', '000002.SZ', '000003.SZ', '000004.SZ', '000005.SZ',
... '000001.SZ', '000002.SZ', '000003.SZ', '000004.SZ', '000005.SZ'],
... 'trade_date': ['20211112', '20211112', '20211112', '20211112', '20211112',
... '20211113', '20211113', '20211113', '20211113', '20211113'],
... 'open': [1., 2., 3., 4., 5., 6., 7., 8., 9., 10.],
... 'high': [2., 3., 4., 5., 6., 7., 8., 9., 10., 1.],
... 'low': [3., 4., 5., 6., 7., 8., 9., 10., 1., 2.],
... 'close': [4., 5., 6., 7., 8., 9., 10., 1., 2., 3.]
... })
>>> print(df)ts_code trade_date open high low close
0 000001.SZ 20211112 1.0 2.0 3.0 4.0
1 000002.SZ 20211112 2.0 3.0 4.0 5.0
2 000003.SZ 20211112 3.0 4.0 5.0 6.0
3 000004.SZ 20211112 4.0 5.0 6.0 7.0
4 000005.SZ 20211112 5.0 6.0 7.0 8.0
5 000001.SZ 20211113 6.0 7.0 8.0 9.0
6 000002.SZ 20211113 7.0 8.0 9.0 10.0
7 000003.SZ 20211113 8.0 9.0 10.0 1.0
8 000004.SZ 20211113 9.0 10.0 1.0 2.0
9 000005.SZ 20211113 10.0 1.0 2.0 3.0
上面的DataFrame
中保存了一些示例數據,我們下面將把這個DataFrame
的數據寫入數據源中的index_daily
數據表。
目前我們可以看到,index_daily
數據表是空的,而且這個數據表的schema
與上面的DataFrame
并不完全相同:
index_daily
數據表的數據定義中包含11列,而上面的數據只有6列,不過DataFrame
中的所有列都包含在index_daily
數據表的schema
中index_daily
數據表目前是空的,沒有填充任何數據
>>> info = ds.get_table_info('index_daily')
<index_daily>--<指數日線行情>
0 MB/0 records on disc
primary keys:
----------------------------------------
1: ts_code: <unknown> entriesstarts: N/A, end: N/A
2: trade_date: <unknown> entriesstarts: N/A, end: N/Acolumns of table:
------------------------------------columns dtypes remarks
0 ts_code varchar(20) 證券代碼
1 trade_date date 交易日期
2 open float 開盤價
3 high float 最高價
4 low float 最低價
5 close float 收盤價
6 pre_close float 昨收價
7 change float 漲跌額
8 pct_chg float 漲跌幅
9 vol double 成交量(手)
10 amount double 成交額(千元)
接下來我們可以將數據寫入數據表,如果方法執行正確,它將返回寫入數據表中的數據的行數,如下所示:
>>> ds.update_table_data(table='index_daily', df=df)
10
將數據寫入數據表之后,我們可以嘗試一下從數據表中讀取數據,現在我們已經可以讀出剛才寫入的數據了。
請注意,讀出來的數據有許多列都是NaN
值,這表明這些列沒有寫入數據,原因就是我們寫入的df
并不包含這些數據,因此讀出的數據為NaN
值。
>>> df = ds.read_table_data('index_daily', shares='000001.SZ, 000002.SZ')
>>> print(df)open high low close pre_close change pct_chg vol \
ts_code trade_date
000001.SZ 2021-11-12 1.0 2.0 3.0 4.0 NaN NaN NaN NaN
000002.SZ 2021-11-12 2.0 3.0 4.0 5.0 NaN NaN NaN NaN
000001.SZ 2021-11-13 6.0 7.0 8.0 9.0 NaN NaN NaN NaN
000002.SZ 2021-11-13 7.0 8.0 9.0 10.0 NaN NaN NaN NaN amount
ts_code trade_date
000001.SZ 2021-11-12 NaN
000002.SZ 2021-11-12 NaN
000001.SZ 2021-11-13 NaN
000002.SZ 2021-11-13 NaN
刪除數據表 —— 請盡量小心,刪除后無法恢復!!
我們除了可以向數據表中寫入數據,從數據表中讀取數據之外,當然也可以刪除數據,不過請注意,在qteasy
中操作DataSource
刪除數據時,您務必非常小心:因為qteasy
不支持從數據表中刪除部分數據,您只能刪除整張數據表。
這是因為qteasy
的數據源被設計為高效地存儲和讀取數據,但它并不是一個通常的數據庫,我們并不需要經常操作其中的數據,這個數據倉庫的作用是為了存儲巨量的數據,因此,它的重點在于保存和提取數據,而不是刪除操作。
qteasy
的DataSource
對象提供了一個刪除數據表的方法: drop_table_data()
,這個方法將刪除整個數據表,而且刪除后無法恢復!
為了避免在代碼中誤刪除數據表,默認情況下drop_table_data()
會導致錯誤,例如我們想刪除之前寫入臨時數據的index_daily
表:
>>> ds.drop_table_data('index_daily')
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
Cell In[19], line 1
----> 1 ds.drop_table_data('index_daily')File ~/Projects/qteasy/qteasy/database.py:1587, in DataSource.drop_table_data(self, table)1584 if not self.allow_drop_table:1585 err = RuntimeError('Can\'t drop table from current datasource according to setting, please check: '1586 'datasource.allow_drop_table')
-> 1587 raise err1589 if self.source_type == 'db':1590 self._drop_db_table(db_table=table)RuntimeError: Can't drop table from current datasource according to setting, please check: datasource.allow_drop_table
這時候我們需要修改數據源的allow_drop_table
屬性,將其修改為True
,這樣就可以刪除數據表了,請記住刪除后將allow_drop_table
改為False
。
下面代碼刪除了index_daily
表,然后就會發現,無法從該表讀取數據了:
>>> ds.allow_drop_table = True
>>> ds.drop_table_data('index_daily')
>>> ds.allow_drop_table = False
>>> df = ds.read_table_data(table='index_daily')
>>> print(df)Empty DataFrame
Columns: []
Index: []
總結
至此,我們已經了解了DataSource
對象,qteasy
中金融歷史數據管理的最重要的核心類的基本工作方式,了解了下面內容:
- 什么是
DataSource
,如何創建一個數據源 - 如何從數據源中提取數據
- 如何操作數據源
在后面的章節中,您將會了解更多的內容:
- 數據源中有哪些有用的金融數據?
- 如何批量下載數據并填充到數據源中?
- 如何從數據源中更有效地提取信息?