日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python中tushare数据可以导出嘛_Python与交易策略分析tushare/baostock库介绍(附代码)...

發布時間:2025/3/20 python 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中tushare数据可以导出嘛_Python与交易策略分析tushare/baostock库介绍(附代码)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:金融數據中最典型的就是資產價格的漲跌情況。想要分析金融資產的投資策略,第一步就是歷史數據的獲取。tushare正是為導入歷史金融資產數據而開發,它大大方便了用Python進行金融資產交易策略的探索和研究。

tushare簡介:中國的“挖地兔”團隊開發并維護,是Python專用的“中國財經數據接口包”,返回的是pandas格式的數據框。當然了,接入數據之后,我們可能還需要NumPy、pandas、matplotlib和sciki-learn等包進行整理分析和可視化。

之前tushare一直免費,但最近該團隊已經正式將tushare升級為pro版,需要用戶捐贈購買積分才能使用。這其實就是變相地收費了嘛。當然了,這都是人家的勞動成果,要恰飯也恰得理所當然??吹竭@,不知道大家有沒有想到之前用的NumPy、pandas收過費嘛?用Python和R有人問你要錢嘛?----統統不要啊。。。而且估計以后也不會要!這么一想,是不是覺得整天搞數據擼代碼也挺幸福的,畢竟是坐享他人的辛勞成果啊。

baostock號稱提供國內財經數據的第二大Python包,其功能相對tushare要簡單一些,但是全部功能免費,而且執行效率要好一些。

1 tushare包的使用

數據獲取接口,以獲取k線數據為例 :get_k_data(code=None, start='', end='', ktype='D', autype='qfq', index=False, retry_count=3, pause=0.001)

參數說明:code: string,股票代碼 ,如000001

start: string,開始日期 format:YYYY-MM-DD 為空時取上市首日

end: string,結束日期 format:YYYY-MM-DD 為空時取最近一個交易日

autype: string,復權類型,qfq-前復權 hfq-后復權 None-不復權,默認為qfq

ktype: string,數據類型,D=日k線/W=周/M=月/5=5分鐘/15=15分鐘/30=30分鐘/60=60分鐘,默認為D

retry_countint,默認 3,如遇網絡等問題重復執行的次數

pauseint, 默認 0,重復請求數據過程中暫停的秒數,防止請求間隔時間太短出現的問題

return DataFrame

date,交易日期

index ,股票指數

open,開盤價

high,最高價

close,收盤價

low,最低價

volume,成交量

amount,成交額

turnoverratio,換手率

code,股票代碼

具體實現代碼如下。

import tushare as ts ##導入tushare包

##我們先試下老版本的k線數據讀取接口get_k_data()。免費,目前還能用

df1 = ts.get_k_data(code='000001', start='20000101', end='20201010') ##000001,代表平安銀行

本接口即將停止更新,請盡快使用Pro版接口:https://waditu.com/document/2

##升級后pro版(收費)的讀取接口是pro.daily()

df1.head()

Out[40]:

date open close high low volume code

238 2001-01-02 3.606 3.609 3.646 3.572 34122.68 000001

239 2001-01-03 3.611 3.581 3.624 3.564 54294.20 000001

240 2001-01-04 3.584 3.559 3.596 3.547 48404.44 000001

241 2001-01-05 3.554 3.522 3.554 3.502 66419.01 000001

242 2001-01-08 3.522 3.472 3.522 3.467 69944.94 000001

type(df1)

Out[41]: pandas.core.frame.DataFrame

str(df1)

Out[42]: ' date open close high low volume code\n238 2001-01-02 3.606 3.609 3.646 3.572 34122.68 000001\n239 2001-01-03 3.611 3.581 3.624 3.564 54294.20 000001\n240 2001-01-04 3.584 3.559 3.596 3.547 48404.44 000001\n241 2001-01-05 3.554 3.522 3.554 3.502 66419.01 000001\n242 2001-01-08 3.522 3.472 3.522 3.467 69944.94 000001\n... ... ... ... ... ... ... ...\n4903 2020-11-30 19.900 19.740 20.880 19.590 1581441.00 000001\n4904 2020-12-01 19.700 20.050 20.510 19.400 1263720.00 000001\n4905 2020-12-02 19.930 19.630 20.060 19.520 889385.00 000001\n4906 2020-12-03 19.780 19.540 19.860 19.170 714452.00 000001\n4907 2020-12-04 19.470 19.300 19.470 18.970 891348.00 000001\n\n[4670 rows x 7 columns]'

sh = ts.get_k_data(code='000001', index=True) ##返回的是股指。上證綜指,代碼全稱是"SH.000001

本接口即將停止更新,請盡快使用Pro版接口:https://waditu.com/document/2

sh.tail() ##數據框的最后6條數據

Out[56]:

date open close high low volume code

636 2020-12-01 3388.99 3451.94 3457.64 3386.91 316188980.0 sh000001

637 2020-12-02 3453.52 3449.38 3465.73 3435.87 312811114.0 sh000001

638 2020-12-03 3448.54 3442.14 3452.16 3428.80 298459930.0 sh000001

639 2020-12-04 3436.73 3444.58 3448.40 3417.05 256276705.0 sh000001

640 2020-12-07 3446.65 3416.60 3449.58 3414.31 254522508.0 sh000001

##保存到本地

df1.to_csv('D:/Spyder/000001.csv')

##選擇部分變量,保存到本地

df1.to_csv(D:/Spyder/000001.csv', columns = ['open', 'low', 'high', 'close'])

2 數據和交易策略分析案例

案例分析要求使用tushare下載平安銀行(000001)的歷史成交數據

輸出平安銀行所有當日漲幅超過5%的日期(如果沒有,請調整至2%)

輸出平安銀行所有開盤價比前日收盤跌幅超過5%的日期(如果沒有,請調整至2%)

假設從2000.1.1開始,每月第一個交易日買入1手平安銀行股票,每年最后一個交易日賣出。請問迄今為止,該投資策略收益為多少?

實現代碼如下:

##第0步,準備工作

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import tushare as ts

第一步,使用tushare下載平安銀行(000001)的歷史成交數據

##第一步,使用tushare下載平安銀行(000001)的歷史成交數據

pingan = ts.get_k_data(code='000001', start='20000101', end='20201010')

本接口即將停止更新,請盡快使用Pro版接口:https://waditu.com/document/2

df = pd.read_csv('pingan.csv', index_col='date',

parse_dates=['date'])[['open', 'close', 'high', 'low']]

df.tail()

Out[156]:

open close high low

date

2020-11-30 19.90 19.74 20.88 19.59

2020-12-01 19.70 20.05 20.51 19.40

2020-12-02 19.93 19.63 20.06 19.52

2020-12-03 19.78 19.54 19.86 19.17

2020-12-04 19.47 19.30 19.47 18.97

df.head()

Out[157]:

open close high low

date

2001-01-02 3.606 3.609 3.646 3.572

2001-01-03 3.611 3.581 3.624 3.564

2001-01-04 3.584 3.559 3.596 3.547

2001-01-05 3.554 3.522 3.554 3.502

2001-01-08 3.522 3.472 3.522 3.467

##畫一個簡單的股價趨勢圖

import matplotlib.pyplot as plt

plt.plot(pingan['date'], pingan['open'])

plt.show()平安銀行2001-2020開盤價趨勢圖

第二步,輸出平安銀行所有當日漲幅超過5%的日期(如果沒有,請調整至2%)

df[ (df['close'] - df['open']) / df['open'] >= 0.05 ]

Out[160]:

open close high low

date

2001-09-19 3.001 3.192 3.222 2.986

2002-01-23 2.381 2.565 2.567 2.359

2002-01-31 2.455 2.612 2.641 2.455

2002-03-07 2.679 2.830 2.837 2.659

2002-06-21 2.790 2.954 3.004 2.790

... ... ... ...

2019-02-25 11.700 12.550 12.640 11.570

2019-04-16 13.670 14.580 14.580 13.550

2020-07-03 13.570 14.250 14.320 13.560

2020-07-06 14.600 15.680 15.680 14.590

2020-08-28 14.260 15.130 15.180 14.260

[150 rows x 4 columns]

##結果共有150天

第三步,輸出所有開盤價比前日收盤跌幅超過5%的日期(如果沒有,請調整至2%)

df[ (df['open'] - df['close'].shift(1)) / df['close'].shift(1) <= -0.05 ]

Out[164]:

open close high low

date

2005-04-22 1.569 1.523 1.630 1.521

2006-06-12 2.012 2.012 2.012 2.012

2006-06-13 1.811 1.811 1.860 1.811

2007-02-28 4.646 4.853 4.886 4.646

2007-05-30 6.959 6.959 7.155 6.959

2007-06-27 8.070 8.207 8.607 8.070

2008-06-10 5.935 5.675 5.935 5.675

2009-01-13 2.951 3.147 3.200 2.951

2013-03-28 7.032 6.704 7.032 6.677

2015-01-19 9.216 9.097 9.584 9.097

2015-07-08 10.994 10.500 11.145 10.500

2019-05-06 13.100 12.870 13.350 12.710

2020-02-03 13.990 13.990 14.700 13.990

2020-03-13 13.900 14.520 14.580 13.900

第四步,假設從2000.1.1開始,每月第一個交易日買入1手平安銀行股票,每年最后一個交易日賣出。請問迄今為止,該投資策略收益為多少?

df1 = df['2001-01':'2019-12']

df1

Out[167]:

open close high low

date

2001-01-02 3.606 3.609 3.646 3.572

2001-01-03 3.611 3.581 3.624 3.564

2001-01-04 3.584 3.559 3.596 3.547

2001-01-05 3.554 3.522 3.554 3.502

2001-01-08 3.522 3.472 3.522 3.467

... ... ... ...

2019-12-25 16.450 16.300 16.560 16.240

2019-12-26 16.340 16.470 16.480 16.320

2019-12-27 16.530 16.630 16.930 16.430

2019-12-30 16.460 16.570 16.630 16.100

2019-12-31 16.570 16.450 16.630 16.310

[4446 rows x 4 columns]

df_m1 = df1.resample('M').first() ##獲取每個月的首個交易日數據

df_m1 #[228 rows x 4 columns],12個月*19年 = 228行數據

Out[170]:

open close high low

date

2001-01-31 3.606 3.609 3.646 3.572

2001-02-28 3.720 3.619 3.745 3.609

2001-03-31 3.522 3.547 3.596 3.497

2001-04-30 4.030 4.100 4.130 3.998

2001-05-31 3.852 3.844 3.882 3.837

... ... ... ...

2019-08-31 14.060 14.100 14.190 13.940

2019-09-30 14.150 14.450 14.500 14.110

2019-10-31 15.600 16.200 16.230 15.600

2019-11-30 16.350 16.860 17.000 16.280

2019-12-31 15.350 15.360 15.430 15.230

[228 rows x 4 columns]

df_m1 = df_m1['open']

df_ycost = df_m1.resample('A').mean()

df_ycost

Out[173]:

date

2001-12-31 3.589583

2002-12-31 3.128750

2003-12-31 2.672500

2004-12-31 2.230750

2005-12-31 1.538500

2006-12-31 1.983750

2007-12-31 7.594083

2008-12-31 6.056333

2009-12-31 6.021833

2010-12-31 6.663300

2011-12-31 5.505917

2012-12-31 5.018750

2013-12-31 6.487250

2014-12-31 6.611583

2015-12-31 10.111000

2016-12-31 8.658250

2017-12-31 10.018750

2018-12-31 10.897917

2019-12-31 13.395000

Freq: A-DEC, Name: open, dtype: float64

df_yl1 = df1.resample('A').last() ##獲取每年最后一個交易日的數據

df_yl1

Out[175]:

open close high low

date

2001-12-31 3.026 3.038 3.051 3.001

2002-12-31 2.607 2.629 2.657 2.571

2003-12-31 2.216 2.168 2.226 2.155

2004-12-31 1.676 1.679 1.697 1.676

2005-12-31 1.587 1.564 1.590 1.562

2006-12-31 3.604 3.686 3.739 3.587

2007-12-31 9.909 9.833 10.001 9.833

2008-12-31 3.174 3.144 3.190 3.091

2009-12-31 8.102 8.099 8.205 8.006

2010-12-31 5.211 5.247 5.274 5.181

2011-12-31 5.101 5.181 5.181 5.085

2012-12-31 5.260 5.364 5.414 5.240

2013-12-31 6.340 6.621 6.697 6.297

2014-12-31 10.268 10.419 10.446 10.064

2015-12-31 9.632 9.545 9.656 9.537

2016-12-31 8.805 8.825 8.825 8.786

2017-12-31 13.000 13.089 13.217 12.892

2018-12-31 9.310 9.380 9.460 9.310

2019-12-31 16.570 16.450 16.630 16.310

df_yl1 = df_yl1['open'] ##19年共19行數據

df_earn = (df_yl1 - df_ycost) * 100 * 12

df_earn

Out[178]:

date

2001-12-31 -676.30

2002-12-31 -626.10

2003-12-31 -547.80

2004-12-31 -665.70

2005-12-31 58.20

2006-12-31 1944.30

2007-12-31 2777.90

2008-12-31 -3458.80

2009-12-31 2496.20

2010-12-31 -1742.76

2011-12-31 -485.90

2012-12-31 289.50

2013-12-31 -176.70

2014-12-31 4387.70

2015-12-31 -574.80

2016-12-31 176.10

2017-12-31 3577.50

2018-12-31 -1905.50

2019-12-31 3810.00

Freq: A-DEC, Name: open, dtype: float64

df_earn.sum()

Out[179]: 8657.039999999994

##第四步可以用循環來實現。但是沒有必要,因為本身pandas已經把數據整理得很工整

##加上題目簡單,直接矩陣向量的運算就可以了

2 中國金融數據導入包baostock

import baostock as bs

import pandas as pd

## 登陸

lg = bs.login()

##讀入上證綜指的歷史數據

rs = bs.query_history_k_data("000001.SH", "date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ,psTTM,pcfNcfTTM,isST",

start_date='2010-01-01', end_date='2020-10-10', frequency="d", adjustflag="3")

導入后查看默認保存的數據格式

rs

Out[24]:

str(rs) ##查看結構

Out[28]: ''

type(rs) ##查看類型

Out[29]: baostock.data.resultset.ResultData

將數據轉換為data frame格式

data = []

while (rs.error_code == '0') & rs.next(): # 逐條獲取數據并合并

data_list.append(rs.get_row_data())

df = pd.DataFrame(data_list, columns=rs.fields)

df

Out[31]:

date code open ... psTTM pcfNcfTTM isST

0 2010-01-04 sh.000001 3289.7500 ... 0

1 2010-01-05 sh.000001 3254.4680 ... 0

2 2010-01-06 sh.000001 3277.5170 ... 0

3 2010-01-07 sh.000001 3253.9910 ... 0

4 2010-01-08 sh.000001 3177.2590 ... 0

... ... ... ... ... ... ...

2610 2020-09-25 sh.000001 3234.3739 ... 0.000000 0.000000 0

2611 2020-09-28 sh.000001 3224.9769 ... 0.000000 0.000000 0

2612 2020-09-29 sh.000001 3231.8551 ... 0.000000 0.000000 0

2613 2020-09-30 sh.000001 3232.7104 ... 0.000000 0.000000 0

2614 2020-10-09 sh.000001 3262.6105 ... 0.000000 0.000000 0

[2615 rows x 18 columns]

將數據框導出為CSV文件

df.to_csv("D:/Spyder/history_A_stock_k_data.csv", index=False)

3 小結

本文向大家展示了兩大中國的Python金融交易數據導入包。其中tushare發展較為成熟,功能也穩定,可以搞了個捐錢換積分就讓初學者會覺得有點啰嗦。如果不想搞得那么麻煩,baostock也是個不錯的備選。

另外,也向大家展示了一個簡單的金融交易策略。使用策略基于歷史價格數據進行驗證,就是所謂的‘回測’。量化交易最核心的任務,就是研究出一個好的交易策略,通過真實的投資而實現盈利。

至于國外尤其是美股的數據導入庫,后面還會陸續和大家介紹。

REF

2020,伊夫·希爾皮斯科,《Python金融大數據分析 第2版》

-----全文結束-----

總結

以上是生活随笔為你收集整理的python中tushare数据可以导出嘛_Python与交易策略分析tushare/baostock库介绍(附代码)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。