Python抓取股票資料,如何用python程式設計賺取第一桶金?
Python開發的一個快速,高層次的螢幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的資料。Scrapy用途廣泛,可以用於資料探勘、監測和自動化測試。
Scrapy吸引人的地方在於它是一個框架,任何人都可以根據需求方便的修改。它也提供了多種型別爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支援。
Scratch,是抓取的意思,這個Python的爬蟲框架叫Scrapy,大概也是這個意思吧,就叫它:小刮刮吧。
Scrapy 使用了 Twisted非同步網路庫來處理網路通訊。整體架構大致如下
-
爬蟲(Spiders)
爬蟲是主要幹活的, 用於從特定的網頁中提取自己需要的資訊, 即所謂的實體(Item)。使用者也可以從中提取出連結,讓Scrapy繼續抓取下一個頁面
下面用python用Python來視覺化股票資料,比如繪製K線圖,並且探究各項指標的含義和關係最後使用移動平均線方法初探投資策略。
-
資料匯入
-
這裡將股票資料儲存在
stockData.txt
文字檔案中,我們使用pandas.read_table()
函式將檔案資料讀入成DataFrame格式。 -
其中引數
usecols=range(15)
限制只讀取前15列資料,parse_dates=[0]
表示將第一列資料解析成時間格式,index_col=0
其中引數usecols=range(15)
限制只讀取前15列資料,parse_dates=[0]
表示將第一列資料解析成時間格式,index_col=0
則將第一列資料指定為索引。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import pandas aspd import numpy asnp import matplotlib.pyplot asplt %matplotlibinline %configInlineBackend.figure_format='retina' %pylabinline pylab.rcParams['figure.figsize']=(10,6)#設定繪圖尺寸 #讀取資料 stock=pd.read_table('stockData.txt',usecols=range(15),parse_dates=[0],index_col=0) stock=stock[::-1]#逆序排列 stock.head() |
以上顯示了前5行資料,要得到資料的更多資訊,可以使用.info()
方法。它告訴我們該資料一共有20行,索引是時間格式,日期從2015年1月5日到2015年1月30日。總共有14列,並列出了每一列的名稱和資料格式,並且沒有缺失值。
1 |
stock.info() |
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<class'pandas.core.frame.DataFrame'> DatetimeIndex:20entries,2015-01-05to2015-01-30 Data columns(total14columns): open20non-null float64 high20non-null float64 close20non-null float64 low20non-null float64 volume20non-null float64 price_change20non-null float64 p_change20non-null float64 ma520non-null float64 ma1020non-null float64 ma2020non-null float64 v_ma520non-null float64 v_ma1020non-null float64 v_ma2020non-null float64 turnover20non-null float64 dtypes:float64(14) memory usage:2.3KB |
在觀察每一列的名稱時,我們發現’open’的列名前面似乎與其它列名不太一樣,為了更清楚地檢視,使用.columns
得到該資料所有的列名如下:
1 |
stock.columns |
1 2 3 4 |
Index([' open','high','close','low','volume','price_change', 'p_change','ma5','ma10','ma20','v_ma5','v_ma10','v_ma20', 'turnover'], dtype='object') |
於是發現’open’列名前存在多餘的空格,我們使用如下方法修正列名。
1 |
stock.rename(columns={' open':'open'},inplace=True) |
至此,我們完成了股票資料的匯入和清洗工作,接下來將使用視覺化的方法來觀察這些資料。
資料觀察
首先,我們觀察資料的列名,其含義對應如下:
open | high | colse | low | volume | price_change | p_change |
---|---|---|---|---|---|---|
開盤價 | 最高價 | 收盤價 | 最低價 | 成交量 | 價格變動 | 漲跌幅 |
ma5 | ma10 | ma20 | v_ma5 | v_ma10 | v_ma20 | turnover |
---|---|---|---|---|---|---|
5日均價 | 10日均價 | 20日均價 | 5日均量 | 10日均量 | 20日均量 | 換手率 |
這些指標總體可分為兩類:
價格相關指標
-
當日價格:開盤、收盤價,最高、最低價
-
價格變化:價格變動和漲跌幅
-
均價:5、10、20日均價
成交量相關指標
-
成交量
-
換手率:成交量/發行總股數×100%
-
成交量均量:5、10、20日均量
由於這些指標都是隨時間變化的,所以讓我們先來觀察它們的時間序列圖。
相對變化量
股票中關注的不是價格的絕對值,而是相對變化量。有多種方式可以衡量股價的相對值,最簡單的方法就是將股價除以初始時的價格。
1 2 |
stock['return']=stock['close']/stock.close.iloc[0] stock['return'].plot(grid=True) |
第二種方法是計算每天的漲跌幅,但計算方式有兩種:
這兩者可能導致不同的分析結果,樣例資料中的漲跌幅使用的是第一個公式,並乘上了100%。
給大家整理了Python很全面的資料和教程可以下載,加群943752371即可
1 |
stock['p_change'].plot(grid=True).axhline(y=0,color='black',lw=2) |
為了解決第二種方法中的兩難選擇,我們引入第三種方法,就是計算價格的對數之差,公式如下:
1 2 3 |
close_price=stock['close'] log_change=np.log(close_price)-np.log(close_price.shift(1)) log_change.plot(grid=True).axhline(y=0,color='black',lw=2) |
K線圖
相傳K線圖起源於日本德川幕府時代,當時的商人用此圖來記錄米市的行情和價格波動,後來K線圖被引入到股票市場。每天的四項指標資料用如下蠟燭形狀的圖形來記錄,不同的顏色代表漲跌情況。
圖片來源:http://wiki.mbalib.com/wiki/K線理論
Matplotlib.finance模組提供了繪製K線圖的函式candlestick_ohlc()
,但如果要繪製比較美觀的K線圖還是要下點功夫的。下面定義了pandas_candlestick_ohlc()
函式來繪製適用於本文資料的K線圖,其中大部分程式碼都是在設定座標軸的格式。
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
frommatplotlib.finance importcandlestick_ohlc frommatplotlib.dates importDateFormatter,WeekdayLocator,DayLocator,MONDAY defpandas_candlestick_ohlc(stock_data,otherseries=None): # 設定繪圖引數,主要是座標軸 mondays=WeekdayLocator(MONDAY) alldays=DayLocator() dayFormatter=DateFormatter('%d') fig,ax=plt.subplots() fig.subplots_adjust(bottom=0.2) ifstock_data.index[-1]-stock_data.index[0]<pd.Timedelta('730 days'): weekFormatter=DateFormatter('%b %d') ax.xaxis.set_major_locator(mondays) ax.xaxis.set_minor_locator(alldays) else: weekFormatter=DateFormatter('%b %d, %Y') ax.xaxis.set_major_formatter(weekFormatter) ax.grid(True) # 建立K線圖 stock_array=np.array(stock_data.reset_index()[['date','open','high','low','close']]) stock_array[:,0]=date2num(stock_array[:,0]) candlestick_ohlc(ax,stock_array,colorup="red",colordown="green",width=0.4) # 可同時繪製其他折線圖 ifotherseries isnotNone: foreach inotherseries: plt.plot(stock_data[each],label=each) plt.legend() ax.xaxis_date() ax.autoscale_view() plt.setp(plt.gca().get_xticklabels(),rotation=45,horizontalalignment='right') plt.show() |
1 |
pandas_candlestick_ohlc(stock) |
這裡紅色代表上漲,綠色代表下跌。
相關關係
在觀察了價格的走勢之後,我們來看看各指標之間的關係。下面挑選了部分代表性的指標,並使用pandas.scatter_matrix()
函式,將各項指標資料兩兩關聯做散點圖,對角線是每個指標資料的直方圖。
1 2 |
small=stock[['close','price_change','ma20','volume','v_ma20','turnover']] _=pd.scatter_matrix(small) |
圖中可以明顯發現成交量(volume)和換手率(turnover)有非常明顯的線性關係,其實換手率的定義就是:成交量除以發行總股數,再乘以100%。所以下面的分析中我們將換手率指標去除,這裡使用了相關性關係來實現資料降維。
上面的散點圖看著有些眼花繚亂,我們可以使用numpy.corrcof()
來直接計算各指標資料間的相關係數。
1 2 3 |
small=stock[['close','price_change','ma20','volume','v_ma20']] cov=np.corrcoef(small.T) cov |
1 2 3 4 5 |
array([[1.,0.30308764,0.10785519,0.91078009,-0.37602193], [0.30308764,1.,-0.45849273,0.3721832,-0.25950305], [0.10785519,-0.45849273,1.,-0.06002202,0.51793654], [0.91078009,0.3721832,-0.06002202,1.,-0.37617624], [-0.37602193,-0.25950305,0.51793654,-0.37617624,1.]]) |
如果覺得看數字還是不夠方便,我們繼續將上述相關性矩陣轉換成圖形,如下圖所示,其中用顏色來代表相關係數。我們發現位於(0,3)位置的相關係數非常大,檢視數值達到0.91。這兩個強烈正相關的指標是收盤價和成交量。
1 2 3 |
img=plt.matshow(cov,cmap=plt.cm.winter) plt.colorbar(img,ticks=[-1,0,1]) plt.show() |
以上我們用矩陣圖表的方式在多個指標中迅速找到了強相關的指標。接著做出收盤價和成交量的折線圖,因為它們的數值差異很大,所以我們採用兩套縱座標體系來做圖。
1 |
stock[['close','volume']].plot(secondary_y='volume',grid=True) |
觀察這兩個指標的走勢,在大部分時候股價上漲,成交量也上漲,反之亦然。但個別情況下則不成立,可能是成交量受到前期的慣性影響,或者還有其他因素。
區塊鏈】中國區塊鏈研究全球領先 有待龍頭技術企業崛起
近日,IPRdaily中文網與incoPat創新指數研究中心聯合釋出“2017全球區塊鏈企業專利排行榜(前100名)”顯示,中國在區塊鏈研究方面全球領先。
“區塊鏈技術要大規模發展,在底層技術上還要進一步發展,就像移動網際網路一樣,它就有IOS和安卓兩套強大的基礎系統。雖然區塊鏈的基礎技術研究投入很多,但目前許多研發團隊都是各自為戰,還未有真正的龍頭技術企業崛起。”
未來發展或是區域性突破
基於政策鼓勵,區塊鏈行業如今迎來了快速發展的風口,各類區塊鏈公司如雨後春筍般紛紛借力生長。同時,區塊鏈概念股開始集體大漲。暴風集團、美圖、迅雷等上市公司趁機搭上區塊鏈的風口,其中大多數公司連業務還未落地,股價就已“起飛”。
不久前,真格基金掌舵者徐小平在其內部微信群中表示,“區塊鏈革命已經到來,這是一場順之者昌、逆之者亡的偉大技術革命。要主動擁抱區塊鏈技術,不要臨淵羨魚,也不要隔岸觀火,要衝到這個行業裡面去,趕緊研究趕緊行動。”
不過,在眾多業內人士看來,目前區塊鏈技術的發展仍然處於初期階段,它的去中心化特點涉及對傳統商業邏輯的顛覆,並非朝夕之間就能實現。餘林民向記者表示,“我覺得,區塊鏈要像網際網路一樣改變人類的生活,需要比較長的時間。未來區塊鏈應用最可能的發展,還是先在區域性獲得突破。”
2月6日,一份名為《2017全球區塊鏈企業專利排行榜》,讓國內BAT的區塊鏈勢能浮出水面。前100名中,中國入榜的企業佔比49%,其次才是美國,佔比33%;其中國內阿里巴巴以49件的總量排名第一,騰訊科技為11件。
這份報告,讓阿里在區塊鏈上的佔位一時風頭無兩。阿里巴巴集團學術委員會主席曾鳴此前談及阿里巴巴的區塊鏈之路時稱,早在2015年螞蟻金服內部便形成一個區塊鏈興趣小組,2016年開始在公益專案上做嘗試。截至目前,阿里的區塊鏈圍繞著其電商和新零售業務的優勢,佈局已經涉及公益、商品溯源、租房場景等領域。