本講中,我們來談一談回測中資料的儲存和管理。實現這一功能離不開資料庫的幫助,在這裡採用mysql資料庫向大家演示如何在資料庫中建立表、並且如何把從資料來源獲取的資料儲存到資料庫的表中。
在mysql資料庫中建立資料表
首先需要在mysql中先建立乙個資料庫test,並在該資料庫中建一張表his_daily_adj_bars來儲存各種交易品種的歷史日資料,這些日資料經過了除權的處理,因此可以在回測中直接使用。
在該表中,id是乙個自增的主鍵,code是交易品種的**作為外來鍵;bar_date是bar的日期,格式是yyyy-mm-dd;created_date是資料新增的日期,而last_updated_date則是最後修改資料的日期,其格式是yyyy-mm-dd hh:mm:ss。在mysql中的建表語句如下所示。
create table if not exists his_daily_adj_bars(
`id` int not null auto_increment,
`code` varchar(20) not null,
`bar_date` time not null,
`open_price` decimal(19,4) null,
`high_price` decimal(19,4) null,
`low_price` decimal(19,4) null,
`close_price` decimal(19,4) null,
`volume` bigint null,
`amount` bigint null,
`created_date` datetime not null,
`last_updated_date` datetime not null,
primary key (`id`),
key `index_code` (`code`)
)engine=innodb auto_increment=1 default charset=utf8;
獲取資料並將資料儲存到mysql資料庫
將獲取的資料插入到mysql資料庫中需要以下幾個步驟:從資料來源獲取資料
連線資料庫
做insert操作
獲取的資料**於tushare包,我們可以採用下面的方法來獲取某只交易品種在一段時間的bars。在獲取bars資料之後,需對資料進行處理使其與資料庫的表結構一致。def obtain_data(self, code, start_time, end_time):
bars = ts.get_h_data(code,start_time,end_time).sort_index()
bars_list = zip(bars.index,bars['open'],bars['high'],bars['close'],bars['low']
,bars['volume'],bars['amount'])
now = datetime.datetime.now().strftime('%y-%m-%d %h:%m:%s')
data = [(code,d[0],d[1],d[2],d[3],d[4],d[5],d[6],now,now) for d in bars_list]
return data
連線資料庫的方法是使用connect('ip','username','password','db_name'),如果資料庫連線失敗會列印出一條訊息提示。def __init__(self):
try:
self.db = mysql.connect("localhost","root","123456","test")
self.cursor = self.db.cursor()
except mysql.error,e:
print self.get_cur_time() + "連線資料庫錯誤,%d: %s" % (e.args[0], e.args[1])
將獲取的資料插入到資料庫最重要的是構造執行insert操作的sql語句字串。該字串中主要含三個引數,乙個是插入表的欄位名組成的cols_str,乙個是插入的表名,另乙個則是由多個%s組成format_str。為了獲取表的字段,我們需要自定義乙個獲取一張資料表所有欄位的方法。在進行插入操作的時候,還需做資料庫的事務管理,如果插入發生錯誤那麼將進行回滾操作。def insert_data(self, table, data):
try:
field_name = self.get_table_fields(table)
col_str = ','.join(field_name[1:])
format_str = ('%s, ' * (len(field_name)-1))[:-2]
sql_str = "insert into %s (%s) values (%s)"% (table, col_str, format_str)
try:
self.cursor.executemany(sql_str, data)
self.db.commit()
except mysql.error,e:
self.db.rollback() ## 回滾
print self.get_cur_time() + "插入資料庫錯誤,%d: %s" % (e.args[0], e.args[1)
except mysql.error,e:
print self.get_cur_time() + "資料庫錯誤,%d: %s" % (e.args[0], e.args[1])
完成了以上幾步後,即可選取測試資料進行測試。if __name__ == '__main__':
test = importmysql()
data = test.obtain_data('002337','2012-01-01','2012-02-01')
test.insert_data('his_daily_adj_bars',data)
在mysql中進行query,可以發現相應的**資料已經儲存在了資料庫當中。最後需要補充的是,pandas也提供了to_sql的方法實現將pandas資料結構的資料匯入資料庫的功能,大家可以查閱文件學習。
是時候關注一波了!
mysql資料庫,資料遷移a表到b表
開發新專案但是用到了舊專案的資料,欄位名也發生了變化,怎麼樣把老資料匯入新錶?mysql資料庫,資料遷移a表到b表可以通過以下sql實現,通過select b表的字段,用於對應a表的字段,進行填充,這樣可以實現 insert into bdatas tj members bankinfo uid,b...
MySQL 資料庫中如何把A表的資料插入到B表
web開發中,我們經常需要將乙個表的資料插入到另外乙個表,有時還需要指定匯入字段,設定只需要匯入目標表中不存在的記錄,雖然這些都可以在程式中拆分成簡單sql來實現,但是用乙個sql的話,會節省大量 兩張表 inserttest和inserttest2,前者中有測試資料 create table in...
Access資料庫到Mysql資料庫實時更新
專案目標 首先是將access資料庫中的大量資料 已經存好的原有百萬級資料 轉存到mysql資料庫中,然後,隨著access中資料的增加,要同步更新mysql資料庫,更新週期自定。思路 一開始的轉存前篇部落格已經講過,這裡就忽略了,主要是實現access資料更新後同步到mysql中。思路是 1.用m...