【Python量化】手把手教你用python做股票分析入門

2022-01-02 大數據分析和人工智慧

內容來自:微信公眾號:python金融量化  已獲得授權
關注可了解更多的金融與Python乾貨。

目前,獲取股票數據的渠道有很多,而且基本上是免費的,比如,行情軟體有同花順、東方財富等,門戶網站有新浪財經、騰訊財經、和訊網等。Python也有不少免費的開源api可以獲取交易行情數據,如pandas自帶的庫,tushare和baostock等。由於pandas庫不再支持yahoo資料庫後變得很不好用,而baostock最早記錄的數據是2006年,因此本文主要講講如何使用tushare獲取股票交易數據和可視化分析,tushare基本上記錄了股票自上市之日起所有的日交易數據,是目前分析國內A股(支持其他非股票行情數據,如期貨)比較好用的開源接口。獲取股票數據
使用tushare包的get_k_data()函數來獲取股票交易數據,具體可以通過命令help(ts.get_k_data)了解函數和參數含義。

#先引入後面可能用到的包(package)
import pandas as pd  
import numpy as np
import matplotlib.pyplot as plt
#正常顯示畫圖時出現的中文
from pylab import mpl
#這裡使用微軟雅黑字體
mpl.rcParams['font.sans-serif']=['SimHei']
#畫圖時顯示負號
mpl.rcParams['axes.unicode_minus']=False
import seaborn as sns  #畫圖用的
import tushare as ts
#Jupyter Notebook特有的magic命令
#直接在行內顯示圖形
%matplotlib inline    

sh=ts.get_k_data(code='sh',ktype='D',
  autype='qfq', start='1990-12-20')
#code:股票代碼,個股主要使用代碼,如『600000』
#ktype:'D':日數據;『m』:月數據,『Y』:年數據
#autype:復權選擇,默認『qfq』前復權
#start:起始時間
#end:默認當前時間
#查看下數據前5行
sh.head(5)

能看到的第一列是索引,對於pandas的數據結構,最後將索引設置為時間序列,方便後面可視化分析。

#將數據列表中的第0列'date'設置為索引
sh.index=pd.to_datetime(sh.date) 
#畫出上證指數收盤價的走勢
sh['close'].plot(figsize=(12,6))
plt.title('上證指數1990-2018年走勢圖')
plt.xlabel('日期')
plt.show()

上面的指數走勢圖還是可以清晰看出,股指分別在2007年和2015年有兩波大牛市,然後又從高峰跌入谷底,目前處於下跌通道。真是辛辛苦苦28年,一夜回到解放前o(╥﹏╥)o

描述性統計

#pandas的describe()函數提供了數據的描述性統計
#count:數據樣本,mean:均值,std:標準差
sh.describe().round(2)

結果如下表所示:

       從上述結果可以看出,上證指數從1990年12月20日至2018年11月7日(最後交易日是當前運行時間),一共有6645個樣本,均值為1937.52點,標準差為1079.51點(波動還是比較大的),最大值是6092.06點。

#再查看下每日成交量 
#2006年市場容量小,交易量比較小,我們從2007年開始看
sh.loc["2007-01-01":]["volume"].plot(figsize=(12,6))
plt.title('上證指數2007-2018年日成交量圖')
plt.xlabel('日期')
plt.show()

上圖的成交量反映了一個有趣的現象,2014-2015年的大牛市很可能是天量的交易推動起來的,因為這期間實體經濟並不景氣,央行多次降息降準,貨幣寬鬆,資金流入股市,銀行理財等影子銀行在這期間瘋狂擴張,場外加槓桿和配資主導了這一場牛市。感興趣的朋友可以結合貨幣供給、實體經濟指標、影子銀行等數據一起分析,進行交叉驗證。

均線分析

#這裡的平均線是通過自定義函數,手動設置20,52,252日均線
#移動平均線:
ma_day = [20,52,252]

for ma in ma_day:
    column_name = "%s日均線" %(str(ma))
    sh[column_name] =sh["close"].rolling(ma).mean()
#sh.tail(3)

#畫出2010年以來收盤價和均線圖
sh.loc['2010-10-8':][["close",
"20日均線","52日均線","252日均線"]].plot(figsize=(12,6))
plt.title('2010-2018上證指數走勢圖')
plt.xlabel('日期')
plt.show()


日收益率可視化

#2005年之前的數據噪音太大,主要分析2005年之後的
sh["日收益率"] = sh["close"].pct_change()
sh["日收益率"].loc['2005-01-01':].plot(figsize=(12,4))
plt.xlabel('日期')
plt.ylabel('收益率')
plt.title('2005-2018年上證指數日收益率')
plt.show()


###這裡我們改變一下線條的類型
#(linestyle)以及加一些標記(marker)
sh["日收益率"].loc['2014-01-01':].plot(figsize=
(12,4),linestyle="--",marker="o",color="g")
plt.title('2014-2018年日收益率圖')
plt.xlabel('日期')
plt.show()


分析多隻股票(指數)

#分析下常見的幾個股票指數
stocks={'上證指數':'sh','深證指數':'sz','滬深300':'hs300',
        '上證50':'sz50','中小板指':'zxb','創業板':'cyb'}
stock_index=pd.DataFrame()
for stock in stocks.values():
    stock_index[stock]=ts.get_k_data(stock,ktype='D', 
autype='qfq', start='2005-01-01')['close']
#stock_index.head()

#計算這些股票指數每日漲跌幅
tech_rets = stock_index.pct_change()[1:]
#tech_rets.head()

#收益率描述性統計
tech_rets.describe()
#結果不在此報告

#均值其實都大於0
tech_rets.mean()*100 #轉換為%

對上述股票指數之間的相關性進行可視化分析:

#jointplot這個函數可以畫出兩個指數的」相關性係數「,或者說皮爾森相關係數
sns.jointplot('sh','sz',data=tech_rets)


#成對的比較不同數據集之間的相關性,#而對角線則會顯示該數據集的直方圖

sns.pairplot(tech_rets.iloc[:,3:].dropna())


returns_fig = sns.PairGrid(tech_rets.iloc[:,3:].dropna())
###右上角畫散點圖
returns_fig.map_upper(plt.scatter,color="purple") 
###左下角畫核密度圖 
returns_fig.map_lower(sns.kdeplot,cmap="cool_d") 
###對角線的直方圖 
returns_fig.map_diag(plt.hist,bins=30)

收益率與風險

使用均值和標準分別刻畫股票(指數)的收益率和波動率,對比分析不同股票(指數)的收益-風險情況。

#構建一個計算股票收益率和標準差的函數
#默認起始時間為'2005-01-01'
def return_risk(stocks,startdate='2005-01-01'):
    close=pd.DataFrame()
    for stock in stocks.values():
        close[stock]=ts.get_k_data(stock,ktype='D', 
     autype='qfq', start=startdate)['close']
    tech_rets = close.pct_change()[1:]
    rets = tech_rets.dropna()
    ret_mean=rets.mean()*100
    ret_std=rets.std()*100
    return ret_mean,ret_std

#畫圖函數
def plot_return_risk():
    ret,vol=return_risk(stocks)
    color=np.array([ 0.18, 0.96, 0.75, 0.3, 0.9,0.5])
    plt.scatter(ret, vol, marker = 'o', 
    c=color,s = 500,cmap=plt.get_cmap('Spectral'))
    plt.xlabel("日收益率均值%")     
    plt.ylabel("標準差%")
    for label,x,y in zip(stocks.keys(),ret,vol):
        plt.annotate(label,xy = (x,y),xytext = (20,20),
            textcoords = "offset points",
             ha = "right",va = "bottom",
            bbox = dict(boxstyle = 'round,pad=0.5',
            fc = 'yellow', alpha = 0.5),
                arrowprops = dict(arrowstyle = "->",
                    connectionstyle = "arc3,rad=0"))

stocks={'上證指數':'sh','深證指數':'sz','滬深300':'hs300',
        '上證50':'sz50','中小板指數':'zxb','創業板指數':'cyb'}
plot_return_risk()

stocks={'中國平安':'601318','格力電器':'000651',
        '招商銀行':'600036','恒生電子':'600570',
        '中信證券':'600030','貴州茅臺':'600519'}
startdate='2018-01-01'
plot_return_risk()


蒙特卡洛模擬分析蒙特卡洛模擬是一種統計學方法,用來模擬數據的演變趨勢。蒙特卡洛模擬是在二戰期間,當時在原子彈研製的項目中,為了模擬裂變物質的中子隨機擴散現象,由美國數學家馮·諾伊曼和烏拉姆等發明的一種統計方法。之所以起名叫蒙特卡洛模擬,是因為蒙特卡洛在是歐洲袖珍國家摩納哥一個城市,這個城市在當時是非常著名的一個賭城。因為賭博的本質是算概率,而蒙特卡洛模擬正是以概率為基礎的一種方法,所以用賭城的名字為這種方法命名。蒙特卡洛模擬每次輸入都隨機選擇輸入值,通過大量的模擬,最終得出一個累計概率分布圖。

df=ts.get_k_data('sh',ktype='D', autype='qfq', 
                start='2005-01-01')
df.index=pd.to_datetime(df.date)
tech_rets = df.close.pct_change()[1:]
rets = tech_rets.dropna()
#rets.head()

#下面的結果說明,我們95%的置信,一天我們不會損失超過0.0264...
rets.quantile(0.05)

-0.026496813699825043

構建蒙特卡洛模擬函數:

def monte_carlo(start_price,days,mu,sigma):
    dt=1/days
    price = np.zeros(days)
    price[0] = start_price
    shock = np.zeros(days)
    drift = np.zeros(days)

    for x in range(1,days):
        shock[x] = np.random.normal(loc=mu * dt,
                scale=sigma * np.sqrt(dt))
        drift[x] = mu * dt
        price[x] = price[x-1] + (price[x-1] *
                (drift[x] + shock[x]))
    return price

#模擬次數
runs = 10000
start_price = 2641.34 #今日收盤價
days = 252
mu=rets.mean()
sigma=rets.std()
simulations = np.zeros(runs)

for run in range(runs):
    simulations[run] = monte_carlo(start_price,
      days,mu,sigma)[days-1]
q = np.percentile(simulations,1)
plt.figure(figsize=(8,6))
plt.hist(simulations,bins=50,color='grey')
plt.figtext(0.6,0.8,s="初始價格: %.2f" % start_price)
plt.figtext(0.6,0.7,"預期價格均值: %.2f" %simulations.mean())
plt.figtext(0.15,0.6,"q(0.99: %.2f)" %q)
plt.axvline(x=q,linewidth=6,color="r")
plt.title("經過 %s 天后上證指數模擬價格分布圖" %days,weight="bold")

Text(0.5,1,'經過 252 天后上證指數模擬價格分布圖')


實際上蒙特卡洛模擬在期權定價裡面還是很有用的。我們借用期權定價裡對未來股票走勢的假定來進行蒙特卡洛模擬。

import numpy as np
from time import time
np.random.seed(2018)
t0=time()
S0=2641.34
T=1.0; 
r=0.05; 
sigma=rets.std()
M=50;
dt=T/M; 
I=250000
S=np.zeros((M+1,I))
S[0]=S0
for t in range(1,M+1):
    z=np.random.standard_normal(I)
    S[t]=S[t-1]*np.exp((r-0.5*sigma**2)*dt+
          sigma*np.sqrt(dt)*z)
s_m=np.sum(S[-1])/I
tnp1=time()-t0
print('經過250000次模擬,得出1年以後上證指數的
      預期平均收盤價為:%.2f'%s_m)

經過250000次模擬,得出1年以後上證指數的預期平均收盤價為:2776.85

%matplotlib inline
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
plt.plot(S[:,:10])
plt.grid(True)
plt.title('上證指數蒙特卡洛模擬其中10條模擬路徑圖')
plt.xlabel('時間')
plt.ylabel('指數')
plt.show()


plt.figure(figsize=(10,6))
plt.hist(S[-1], bins=120)
plt.grid(True)
plt.xlabel('指數水平')
plt.ylabel('頻率')
plt.title('上證指數蒙特卡洛模擬')

Text(0.5,1,'上證指數蒙特卡洛模擬')


本文主要介紹了如何使用Python獲取股票數據,並進行簡單的統計分析和可視化,綜合運用了Python金融量化分析的Pandas、NumPy和Matplotlib等包。目前,A股處於至暗時刻,或許是學習和歷練的最好時機,涅槃重生的過程總是艱難的,但振翅飛翔的一刻值得你等待。


數據君開通了粉絲交流微信,歡迎添加交流

相關焦點

  • 大學生如何入門Python量化金融?
    至於Python的學習,網上資源就很多了,在這裡推薦幾個Python教程:https://python.quantecon.org/ 該教程不僅介紹了Python,而且介紹了NumPy、Pandas、Matplotlib、Scipy等數據分析常用第三方庫。
  • 「零基礎包學會」 手把手教你學python一:如何快速找到學習資源?
    基於以上的原因,本公眾號將開始轉載以及原創手把手教你學python系列,一開始的文章可能會有些無趣,學習一些基本知識,越到後面越深入,一步步的學會新時代利器!!轉發到群聊或者朋友圈即可獲得精選課件+培訓教程,不用998,只要動動手指關注轉發,關注與爾巖說,明天錢隨便花!!
  • 量化交易工程師,帶你學習量化交易入門!量化交易環境Python安裝
    所以,我們何不放下偏見與固執,了解一下在投資領域中這個你所不了解的區域。作為一個量化交易工程師,我可以負責任的告訴你,量化交易是能夠實現穩定盈利的,知道你肯專研,摸索出一套適合自己的量化交易策略。如果你感興趣,可以關注我,跟著我,帶你一起學習量化交易知識。量化交易工程師jeevan,先帶領大家打開量化交易的大門!
  • python量化投資(一):量化投資的基本流程
    筆者一開始用的是matlab,但最終選擇了pythonpython:庫很多,只有你找不到的,沒有你想不到,和量化這塊結合比較緊密的有:Numpy&Scipy:科學計算庫,矩陣計算Pandas:金融數據分析神器,原AQR資本員工寫的一個庫,處理時間序列的標配pandas_datareader:國外股票宏觀數據接口Matplotlib
  • 大學生金融小白自學Python做量化投資需要注意哪些?
    python做量化投資需要注意些什麼?資料庫推薦:SQLite如果所做的策略需要存儲很多數據,那麼就需要一個資料庫配合使用。Python自帶sqlite3庫,可以在python中方便的操作SQLite資料庫。
  • 5分鐘入門一個強大的Python股票分析工具
    Python 中的Talib是強大的股票指標分析工具。但是還有更強的,誰家分析工具更強,某某家最強,不,接下來就送你一個更簡單,更好用的股票指標庫,完全和pandas強強結合的分析庫,路過看過絕對不能錯過啊。
  • 【手把手教你】玩轉Python量化金融工具之NumPy
    前言「手把手教你」系列將為Python初學者一一介紹Python在量化金融中運用最廣泛的幾個庫(Library): NumPy(數組、線性代數)、SciPy(統計)、pandas(時間序列、數據分析)、matplotlib(可視化分析)。建議安裝Anaconda軟體(自帶上述常見庫),並使用Jupyter Notebook交互學習。
  • 在職金融小白自學python做量化投資能行嘛?
    python做量化投資能行嘛?不過對於入門選手來說,這兩個接口都是綽綽有餘啦。個人用的比較多的是TusharePro,導入數據直接是DataFrame格式,非常方便。技術分析:TA-LibTA-Lib,全稱「Technical Analysis Library」, 即技術分析庫,涵蓋了150多種股票、期貨交易軟體中常用的技術分析指標,如MACD、RSI、KDJ、動量指標、布林帶等等。
  • 量化投資入門之工具篇
    為了方便大家系統的學習,我們特意將量化投資入門相關內容進行了整理歸類。之前我們為大家整理了入門需要學習的知識,學了那麼多久該實踐了,今天就來理理量化投資過程中可能用到的工具/平臺,希望對大家有所幫助。我們在剛量化入門的時候都會遇到一些實際的問題,比如說就是我突然有了個想法,但是我要用什麼實現呢,要怎麼實現呢,數據哪裡來呢,回測怎麼做呢等等。
  • 利用python操作Excel教程
    不論您是從事哪個行業,數據分析都是必不可少的技能。
  • 十六本python入門學習書籍推薦,python入門新手必看
    隨著人工智慧時代的到來,python程式語言一步登天衝到編程排行榜第一名,因此更多朋友想轉行學習python程式語言的朋友,可以一起看一下:python入門新手必看的十六本python入門學習書籍1、python基礎教程司維所著圖書:本書包括Python程序設計的方方面面,首先從Python
  • 學python?不是一個python入門教程就行,學之前你必須知道這些
    >就是做大數據分析的,數據量級起碼是千萬級別的,做的是大數據分析網絡爬蟲:其實屬於數據分析的部分,就是獲取數據源的方式。經常試試需要講某些指標量化成數據據。機器學習:這也是python最有魅力的地方,善於做圖形分析,算法建模等等。所以python在人工智慧,機器學習的領域有著讀到的優勢。
  • python入門
    --Yves Hilpisch 《Python for Finance》發現近期學習python的人越來越多了,最近也有人問我有沒有啥課程或者書推薦的。我自己還是側重數據計算和在金融中的應用,系統管理、web開發等沒做過。我當年也是新手入門,自己搜索嘗試,買了很多的書,也在網上下載了很多資料。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    22機器學習 23深度學習 24數據結構和算法 25python網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰2 32深度學習必備原理與實戰3
  • 從零開始學量化(一):量化如何入門
    由於我用的比較多的是python,所以這裡以python為例進行說明。做量化用到的數據一般包括二級市場的各種數據、宏觀經濟的各種數據以及一些特殊需求的網頁數據,因此需要有通過python獲取數據的能力。
  • 教你用Python入門年薪百萬的數據AI行業
    現在這個科技日新月異的變革時代,做大數據和機器學習項目相關的內容,可以獲取更大的個人價值,比如年薪百萬。以下就是介紹一系列python技能能在其中發揮巨大價值的領域,以及如何快速切入該領域,從入門到實踐,體現自己最大價值,年薪百萬。
  • 量化交易之《Python數據分析》
    API,所以運算速度格外快3 與python標準的列表相比,Numpy數組使用的切片和索引方法更加高效。Pony ORM用純python編寫的ORM,能自動進行查詢優化,提供了一個圖形用戶界面的資料庫模式編輯器,支持自動事務處理,自動緩存,組合關鍵字。
  • 人生苦短,我用Python,那麼問題來了,普通人要學python嗎?
    話說麼哥在金融和IT行當混跡了多年,python一直是被我隨手拿來當個小工具用用,有時候偷懶用python弄個excel自動化整理工具,有時候拿來上各種網站爬蟲搜集點信息,有時候也會拿來寫點量化小工具。那麼到底什麼是python?
  • [分享]Python金融小白自學之路
    至於Python的學習,網上資源就很多了,在這裡推薦幾個Python教程:https://python.quantecon.org/ 該教程不僅介紹了Python,而且介紹了NumPy、Pandas、Matplotlib、Scipy等數據分析常用第三方庫。不過是全英文的,如果英文比較弱的同學可能看起來比較吃力。
  • 量化投資-為什麼選擇Python?
    霸主統治、數以億計的運行設備、龐大的生態圈、大型企業項目必用程式語言。而Python在量化投資領域的地位,猶如Java在IT行業的地位一般。為什麼量化投資要選擇Python?進入AI人工智慧時代,靠其功能強大、高效靈活、對數據分析提供良好的支持,成為人工智慧,數據分析領域不可或缺的程式語言。現如今,Python被應用於包括web在內的系統應用開發,同時也當作膠水語言跟其它開發語言互通融合,但更多的被應用於數據統計分析等數學領域的計算需求。為什麼數據分析方面如此喜愛Python?