Python实战项目—金融量化分析(数据的简单预处理)
實現(xiàn)需要導(dǎo)入的包:
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
注:tushare,財經(jīng)數(shù)據(jù)接口包
1.使用tushare包導(dǎo)入某只股票的歷史數(shù)據(jù)
我們不妨以同花順這只股票為例(300033)
df=ts.get_k_data(code=‘300033’,start=‘2000-01-01’,end=‘2022-01-21’)
df
其中,code是股票代碼,start是開始時間,end是結(jié)束時間。如果不知道開始時間,可以設(shè)置一個比較早的時間。
運行結(jié)果如上,共計2916條數(shù)據(jù)。
接下來,我們可以把數(shù)據(jù)存儲到文件中去,調(diào)用to_xxx將數(shù)據(jù)寫入文件中
df.to_csv(’./300033.csv’)
然后重新導(dǎo)入文件:
df=pd.read_csv(’./300033.csv’)
df
運行后發(fā)現(xiàn):
多了一列,我們可以刪除第一列的數(shù)據(jù),刪除方法常見的兩種:
方法一:直接del df[‘column-name’]
方法二:采用drop方法,有下面三種等價的表達(dá)式:
1.df= df.drop(‘column_name’, 1)
輸入:df,drop(‘num’,axix=1),不改變內(nèi)存,及輸入df的時候,它還是顯示原數(shù)據(jù);
2.df.drop(‘column_name’,axis=1, inplace=True)
輸入:df.drop(‘num’,axix=1,inplace=True),改變內(nèi)存,及輸入df的時候,它顯示改變后的數(shù)據(jù);
3. df.drop([df.columns[[0,1, 3]]], axis=1,inplace=True)
輸入:df.drop([df.columns[[0,1]]],axis=1,inpalce=True)
總結(jié):凡是會對原數(shù)組作出修改并返回一個新數(shù)組的,往往都有一個 inplace可選參數(shù)。如果手動設(shè)定為True(默認(rèn)為False),那么原數(shù)組直接就被替換。也就是說,采用inplace=True之后,原數(shù)組名(如2和3情況所示)對應(yīng)的內(nèi)存值直接改變;而采用inplace=False之后,原數(shù)組名對應(yīng)的內(nèi)存值并不改變,需要將新的結(jié)果賦給一個新的數(shù)組或者覆蓋原數(shù)組的內(nèi)存位置(如1情況所示)。
通過pandas刪除列:
1.del df[‘columns’] #改變原始數(shù)據(jù)
2.df.drop(‘columns’,axis=1)#刪除不改表原始數(shù)據(jù),可以通過重新賦值的方式賦值該數(shù)據(jù)
3.df.drop(‘columns’,axis=1,inplace=‘True’) #改變原始數(shù)據(jù)
言歸正傳,我們采用drop函數(shù),這樣我們就刪除了第一行無用的數(shù)據(jù)。
df=df.drop(labels=‘Unnamed: 0’,axis=1)#drop中反過來,0表示行,1表示列,inplace=Ture表示將操作賦予到原數(shù)據(jù)中
df
使用to_datetime將date列轉(zhuǎn)化為時間序列:
df[‘date’]=pd.to_datetime(df[‘date’])
df
便于查看,我們把日期設(shè)置為索引序列:
df=df.set_index(‘date’)
df
2.輸出收盤比開盤漲超3%的日期
date=df.loc[(df[‘close’]-df[‘open’])/df[‘open’]>0.03]#獲取True對應(yīng)的行數(shù)據(jù)
date
在分析的過程中如果產(chǎn)生了布爾值,則下一步將布爾值作為源數(shù)據(jù)的行索引;如果布爾值作為原數(shù)據(jù)的行索引,則可以取出True對應(yīng)的值,忽略False對應(yīng)的值。
接下來,將數(shù)據(jù)生成存儲到文件中去。
date.to_csv(’./300033上漲3%的日期匯總.csv’)
3.輸出開盤價比昨日收盤價跌幅超過2%的日期
思考這樣一個問題,昨日的收盤價怎么和開盤價放到一列?
我們可以增加一列收盤價,并把收盤價下移一天:
df[‘yesterday_close’]=df[‘close’].shift(1)
df
date=df.loc[(df[‘open’]-df[‘yesterday_close’])/df[‘yesterday_close’]<-0.02]#開盤價比起昨天收盤價跌幅超過2%
date
date.to_csv(’./300033開盤比前日收盤價跌超2%的日期.csv’)
4.假如我從2010年1月1日起,每個月第一個交易日買入十手股票,每年最后一個交易日賣出,那么到昨天,我的收益是多少?
首先我們要知道,一手股票是100股,一年總共買入12000股。
我們首先計算成本價格:
1.取出日期內(nèi)的數(shù)據(jù):
new_df=df[‘2010-01-01’:‘2022-01-23’]
new_df
2.找出每月的第一個交易日:
Month_first=new_df.resample(‘M’).first()
3.計算總花費:
cost=Month_first[‘open’].sum()*1000 #花費的總價格
接下來我們計算收益,要注意2022年的股票還沒有賣出,需要估價,利用昨天的收盤價進(jìn)行估價。
Annual_last=new_df.resample(‘A’).last()[:-1]#將2022年最后一行切出去
計算收益:
earn=Annual_last[‘open’].sum()12000+2000new_df[‘close’][-1]
print(earn-cost)
5.繪制五日均線和三十日均線
首先需要理解,什么是均線?
對于每一個交易日,都可以計算前N天的移動平均值,然后把這些移動均值聯(lián)系起來,成為一條線,叫做N日移動平均線,移動平均線常用有5天,10天,30天,60天,120天,240天的指標(biāo)。
均線計算方法:MA=(C1+C2+…+Cn)/n
五日均線:
MA5=df[‘close’].rolling(5).mean()
MA30=df[‘close’].rolling(30).mean()
pandas中提供了pandas.DataFrame.rolling這個函數(shù)來實現(xiàn)滑動窗口值計算,下面是這個函數(shù)的原型:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
繪圖如下:
plt.plot(MA5)
plt.plot(MA30)
總結(jié)
以上是生活随笔為你收集整理的Python实战项目—金融量化分析(数据的简单预处理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux程序员实用教程,Linux教程
- 下一篇: Android 如何退出整个应用程序?