Python重现创业板指数行情
目標:畫創業板指數
最近有個奇怪的現象:大盤漲基金不漲,大盤跌基金更迭,有同事懷疑是不是指數有問題,所以我們就自己動手畫一個指數。
這次選取創業板來畫,因為股票數量少,比較適合學習。
可后來才發現這個指數有坑。浪費了1天時間的自我摸索,后來通過女神的幫助,才徹底搞清楚原委。
學習內容:
指數有一套標準的計算公式,深圳創業板的指數計算公式深交所官網公布有,還可以下載PDF和excel,告訴你成分股和權重,而且每半年優勝劣汰一次,進行一次調整,可能指數基金沒有這么快調整過來,所以指數跟蹤應該有偏離偏差。
網站地址如下:
下載成分股excel
指數計算公式
之前有個疑問解不開:價格按照公式折算能匹配官網數據,但是成交量死活和官網的數據合不上,無論是直接累加還是權重累加。后來經問SJS,才知道這里的成交量是整個創業板的成交量,也就是:算價格的時候,選取最優的100個成分股,算成交量的時候,又用的整個創業板股票的成交量,這明顯不符合邏輯啊。
但目前創業板多個指數就是這么算的。一切還不是為了.。。。
效果:
自己畫的效果如下:
深交所官網公布的數據如下:
價格跟深交所的行情能吻合。
同花順行情網站公布成交量:
可以看到,成交量終于對上號了。打印的數據也能可深交所公布的分鐘成交量對上。
成交量謎題終于解開。真的是KD。
代碼部分:
import pandas as pd import matplotlib.pyplot as plt import numpy as np from jqdatasdk import *auth('*','*') #這里用戶名密碼需要前往聚寬官網自行申請 is_auth = is_auth() if is_auth == True:print("登錄成功") else:print("連接失敗") #print(__version__)cyb_Cons = pd.read_excel('399006_cons.xlsx') #獲取創業板的成分股 cyb_ConsNow = cyb_Cons[cyb_Cons['日期']=='2020-12-31'] #獲取最新的一期成分股 #print(len(cyb_ConsNow)) #print(cyb_ConsNow.head) zqdmList = np.array(cyb_ConsNow['樣本代碼'].values) #成分股代碼 #print(zqdmList) quanzhong = np.array(cyb_ConsNow['權重(%)'].values) #權重 quanzhong=quanzhong.copy()/100 #print(quanzhong)#昨天的收盤價,是今天指數的基準 yestedayCYB = get_price(security='399006.XSHE', start_date='2021-01-15 14:58:00', end_date='2021-01-15 14:58:00', frequency='minute',fq='pre', fields=['close','volume','money']) print(yestedayCYB)#基數--昨天的收盤價,是今天指數的基準 jishu = float(yestedayCYB['close'].values) #voljisu = int(yestedayCYB['volume'].values) print('基數值為:' + str(jishu))temp = pd.DataFrame() #用來緩存計算變量 tempyes = pd.DataFrame() #用來緩存昨天的計算變量 volumetemp = pd.DataFrame() #用來緩存計算變量 volumeYesTemp = pd.DataFrame() #用來緩存計算變量 moneyTemp = pd.DataFrame() #用來緩存計算金額 #獲取股票每分鐘信息 for zqdm in zqdmList:#print(type(zqdm))df = get_price(security=str(zqdm)+'.XSHE', start_date='2021-01-18 09:30:00', end_date='2021-01-18 15:00:00', frequency='minute', fields=['open', 'close','money','volume'])dfyes = get_price(security=str(zqdm) + '.XSHE', start_date='2021-01-15 14:58:00', end_date='2021-01-15 14:58:00', frequency='minute', fields=['close','money','volume'])qz = cyb_ConsNow[cyb_ConsNow['樣本代碼']==zqdm]['權重(%)'].values #權重#print(qz)#print(df['close']*qz)temp[zqdm] = df['close'] * qz / 100tempyes[zqdm]=dfyes['close']*qz/100volumetemp[zqdm] = df['volume']/100/10000 #萬手moneyTemp[zqdm] = df['money']/ 100000000 #億元print(temp.head(2)) print(tempyes.head(1)) print(temp.sum(axis=1)) print(tempyes.sum(axis=1)) jintian = pd.DataFrame() zuotian = pd.DataFrame() jintian['jq'] = temp.sum(axis=1) zuotian['jq'] = tempyes.sum(axis=1) zs = jishu*jintian['jq']/zuotian['jq'].values print(zs)x=np.array(df.index) #時間序列 xx=np.arange(0,len(x),1) # X軸長度 #畫圖參數 fig = plt.figure() ax1 = fig.add_subplot(211) plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼 plt.rcParams['axes.unicode_minus'] = Falseax1.set_title('行情') ax1.plot(xx,zs,c='blue') plt.xlabel('交易時間(分鐘)') plt.ylabel('成交價格(元)') ax1.legend('成交價格') plt.grid()#plt.show()#畫成交量 dfall=get_all_securities(types='stock', date='2021-01-18') print(dfall['display_name'].index) dfcyb= dfall[dfall['display_name'].index>='300000.XSHG'] #只要創業板股票 dfcyb2 = dfcyb[dfcyb['display_name'].index<='309999.XSHG'] #只要創業板股票 #print(dfcyb2.index) cyblist = np.array(dfcyb2.index) #print(cyblist) vol = pd.DataFrame() #用來緩存計算金額 for cybzqdm in cyblist:dfcyb = get_price(security=cybzqdm, start_date='2021-01-18 09:30:00', end_date='2021-01-18 15:00:00',frequency='minute', fields=['volume'])vol[cybzqdm[0:6]]=dfcyb['volume']#print(vol.head()) volsum = pd.DataFrame() #用來緩存計算金額 volsum['volume'] = vol.sum(axis=1) print(volsum.head()) print(np.round(volsum['volume'].values/1000000,2)) #單位換算成萬手,保留兩位小數ax2 = fig.add_subplot(212) ax2.bar(xx,np.round(volsum['volume'].values/1000000,2),color='red',label='left') ax2.set_ylabel('成交量(萬手)') plt.xlabel('交易時間(分鐘)') plt.grid() ax2.legend('成交量') #plt.subplots_adjust(left=0.01) plt.show()重點:數據的獲取和篩選
1、 DataFrame和array的相互轉換。
2、畫圖工具
3、 獲取股票行情
4、折算股票成交量
總結
以上是生活随笔為你收集整理的Python重现创业板指数行情的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日常动手之:用python画行情图
- 下一篇: 时间序列分析之:函数分解decompos