python量化交易——金融數據管理最佳實踐——qteasy創建本地數據源

文章目錄

  • 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_calendarstock_basicstock_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”,如果數據表的主鍵包含時間或日期,那么根據篩選startend之間的數據,start/end必須成對給出
  • end: 給出一個日期,格式為“YYYYMMDD”,如果數據表的主鍵包含時間或日期,那么根據篩選startend之間的數據,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的數據源被設計為高效地存儲和讀取數據,但它并不是一個通常的數據庫,我們并不需要經常操作其中的數據,這個數據倉庫的作用是為了存儲巨量的數據,因此,它的重點在于保存和提取數據,而不是刪除操作。

qteasyDataSource對象提供了一個刪除數據表的方法: 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,如何創建一個數據源
  • 如何從數據源中提取數據
  • 如何操作數據源

在后面的章節中,您將會了解更多的內容:

  • 數據源中有哪些有用的金融數據?
  • 如何批量下載數據并填充到數據源中?
  • 如何從數據源中更有效地提取信息?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70905.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70905.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70905.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android中使用Robolectric測試點擊事件(不需要手機)

文章目錄 一、前言二、簡單示例三、參考文檔 一、前言 Robolectric 是一個由 Google 維護的開源 Android 測試框架&#xff0c;它允許你以 Android 運行時環境運行單元測試。 Robolectric 提供了一個模擬 Android 運行時環境&#xff0c;允許你測試你的代碼是否正確地使用 And…

Spring Boot 接口 JSON 序列化優化:忽略 Null 值的九種解決方案詳解

一、針對特定接口null的處理&#xff1a; 方法一&#xff1a;使用 JsonInclude 注解 1.1 類級別&#xff1a;在接口返回的 ?DTO 類或字段? 上添加 JsonInclude 注解&#xff0c;強制忽略 null 值&#xff1a; 類級別&#xff1a;所有字段為 null 時不返回 JsonInclude(Js…

ds回答-開源llm應用開發平臺

以下是幾個著名的開源 LLM 應用開發平臺&#xff0c;涵蓋不同場景和技術特點&#xff1a; 1. Dify 特點&#xff1a;低代碼 / 無代碼開發、支持 RAG 檢索、Agent 智能體、模型管理、LLMOps 全流程優化。核心功能&#xff1a;可視化工作流編排、數百種模型兼容&#xff08;如 GP…

LDR6020 PD3.1 協議芯片在特定設備中的應用

在電子設備互聯互通的時代&#xff0c;芯片技術成為提升設備性能與功能的關鍵驅動力。LDR6020 PD3.1 協議芯片以其出色的性能&#xff0c;在 TYPE-C 臺式顯示器 / 便攜顯示器、一拖二快充線以及手機電腦轉接器等設備中展現出獨特價值&#xff0c;為用戶帶來更便捷、高效的使用體…

wzl-django學習

####################################################總的urls.py from django.contrib import admin from django.urls import path,include, re_path from django.views.static import serve from django.conf import settings from drf_yasg import openapi from drf_yas…

python -ssh學習

def exe_sshcmd(ip,username,userpswd,port,cmd): """ 功能&#xff1a;SSH登錄到指定設備&#xff0c;并執行對應的命令 入參&#xff1a;前四項為ssh登錄shell的ip和port&#xff0c;具備管理員權限的用戶名和密碼&#xff0c; cmd可以…

PDF處理控件Aspose.PDF教程:使用 Python 將 PDF 轉換為 TIFF

TIFF文件是高質量圖像的首選。它們廣泛用于印刷、存檔和圖形設計。企業通常需要轉換PDF文檔以獲得更好的兼容性。了解如何以編程方式執行此轉換可以節省時間和資源。在這篇教程中&#xff0c;我們將探討如何使用 Python 將 PDF 轉換為 TIFF。 本文涵蓋以下主題&#xff1a; P…

服務器IPMI用戶名、密碼批量檢查

背景 大規模服務器部署的時候&#xff0c;少不了較多的網管和監測平臺&#xff0c;這些平臺會去監控服務器的性能、硬件等指標參數&#xff0c;為了便于管理和控制&#xff0c;則需要給服務器IPMI帶外管理添加較多的用戶&#xff0c;這就需要對較多的服務器檢查所對應的IPMI用…

< 自用文兒 > Gobuster 暴力掃描工具與 SecLists 安全測試詞表集合

Ethice 道德問題 GFW 的保護下&#xff0c;很多的設備操作系統是停留在更老的版本&#xff0c;應用軟件也是&#xff0c;因此很多的漏洞沒有被修復。通訊沒有使用加密&#xff0c;例如網頁沒有使用 HTTPS 網站很多。幾乎是半裸的在網絡上等著被食。 不做惡是下限。 環境&…

【Cadence射頻仿真學習筆記】2.4GHz低噪放LNA仿真設計

課程分為3個部分&#xff0c; 一、LNA結構與噪聲優化方法 噪聲優化的方法是&#xff1a;限定功耗的噪聲和功率同時匹配噪聲匹配和功率匹配一般不會同時達到&#xff0c; 對于PCSNIM結構的噪聲分析&#xff0c;我們只需要了解與哪些參數有關優化思路是&#xff1a;1.信號源阻抗…

【洛谷入門賽】B4042 順序結構 202410 場

題意 給你一個變量 a a a&#xff1a;小 Y 會讓 a a a 先加 5 5 5 再把它們的和乘 3 3 3 最后輸出&#xff1b;小 L 會讓 a a a 先乘 3 3 3 再加 5 5 5 最后輸出。 要求出小 Y 和小 L 分別會輸出什么東西。 思路 這道題按照題目意思模擬就可以了&#xff0c;重點是考…

Android13修改多媒體默認音量

干就完了! 設置音量為最大音量,修改如下: /framework/base/media/java/android/media/AudioSystem.java/** hide */public static int[] DEFAULT_STREAM_VOLUME new int[] {4, // STREAM_VOICE_CALL7, // STREAM_SYSTEM5, // STREAM_RING-5, // STREAM_MUSIC15, // STREAM…

【Azure 架構師學習筆記】- Azure Databricks (13) -- 搭建Medallion Architecture part 1

本文屬于【Azure 架構師學習筆記】系列。 本文屬于【Azure Databricks】系列。 接上文 【Azure 架構師學習筆記】- Azure Databricks (12) – Medallion Architecture簡介 前言 上文已經介紹了關于Medallion的知識&#xff0c;本文開始用ADB 來實現&#xff0c; 但是基于內容較…

社交APP如何打造高粘性興趣社群

想要打造一款成功的社交 APP 興趣社群&#xff0c;關鍵在于充分激發用戶的主動分享意愿&#xff0c;同時構建起深度互動機制。與其在一開始就將大量資源投入到廣告宣傳中&#xff0c;倒不如把精力集中在深度挖掘和精心維護首批核心用戶上。例如&#xff0c;可以嘗試設計在線測試…

【操作系統】同步與互斥

同步與互斥 一、同步與互斥的概念1.1 同步與異步1.2 進程互斥 二、進程互斥的實現2.1 軟件實現2.1.1 單標志法2.1.2 雙標志先檢查法2.1.3 雙標志后檢查法2.1.4 Peterson法 2.2 硬件實現2.2.1 中斷指令2.2.2 TestAndSet指令2.2.3 Swap指令 三、互斥鎖四、信號量機制4.1 整型信號…

C++ 正則表達式分組捕獲入門指南

在 C 中&#xff0c;正則表達式&#xff08;regex&#xff09;是一種用于匹配字符串模式的強大工具。正則表達式不僅能幫助你查找符合特定模式的字符&#xff0c;還能捕獲匹配的子字符串&#xff08;即分組捕獲&#xff09;。這篇文章將介紹 C 正則表達式中的分組捕獲機制&…

使用Docker方式一鍵部署MySQL和Redis數據庫詳解

一、前言 數據庫是現代應用開發中不可或缺的一部分&#xff0c;MySQL和Redis作為兩種廣泛使用的數據庫系統&#xff0c;分別用于關系型數據庫和鍵值存儲。本文旨在通過Docker和Docker Compose的方式&#xff0c;提供一個簡潔明了的一鍵部署方案&#xff0c;確保數據庫服務的穩…

性能附錄:如何計算并發用戶數(摘自高樓老師《性能30講》)

高樓老師《性能30講》: 性能測試實戰30講-極客時間 感興趣的同學可以去讀一下&#xff0c;個人感覺寫的非常好 目錄 什么是并發? 在線用戶數、并發用戶數怎么計算 總結 什么是并發? 我們假設上圖中的這些小人是嚴格按照這個邏輯到達系統的&#xff0c;那顯然&#xff0c;…

基于yolov8的糖尿病視網膜病變嚴重程度檢測系統python源碼+pytorch模型+評估指標曲線+精美GUI界面

【算法介紹】 基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統 基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統是一款利用深度學習技術&#xff0c;專為糖尿病視網膜病變早期診斷設計的智能輔助工具。該系統采用YOLOv8目標檢測模型&#xff0c;結合經過標注和處理的醫學影像數…

學習路程八 langchin核心組件 Models補充 I/O和 Redis Cache

前序 之前了解了Models&#xff0c;Prompt&#xff0c;但有些資料又把這塊與輸出合稱為模型輸入輸出&#xff08;Model I/O&#xff09;?&#xff1a;這是與各種大語言模型進行交互的基本組件。它允許開發者管理提示&#xff08;prompt&#xff09;&#xff0c;通過通用接口調…