設為首頁加入收藏

微信關注
官方微信號:qingfeng7777777a
加關注獲取每日精選資訊
股票入門歡迎您加入
廣告服務聯系我們網站地圖

如何利用Python開發一套股票分析軟件

2019-06-24 20:34:57 看盤

股票數據分析對象為滬深300,通過對數據的爬取以及分析,使數據可視化,這些為該分析軟件要滿足的功能。

確定目標,然后 JUST DO IT !

第一步:獲取數據

滬深300歷史交易數據的 URL 地址如下:

  • http://quotes.money.163.com/trade/lsjysj_zhishu_399300.html?year=2018&season=3

【1】分析網址獲得 HTML

在查詢歷史記錄時,我們可以觀察出網址中 ‘399300’ 、‘2018’與‘3’的數字含義,分別代表‘股票代碼’、 ‘年份’ 和 ‘季度’,由此我們就可以寫一個函數,把 股票代碼 以及 年份 、 季度 作為參數,進入到不同股票的歷史交易記錄中 

(下面代碼我們默認股票代碼為 399300,代碼中year和season為參數,返回頁面的 HTML,存放在 list 中。要獲得多年的數據,可寫一個 for 循環來循環爬取網頁內容,這里就不做過多展示了。)

    def __init__(self, year, season):

        self.year = year

        self.season  = season

        self.soup = None

    def SpiderData(self):

        url = 'http://quotes.money.163.com/trade/lsjysj_zhishu_399300.html?year='

        list = []

        headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/2010010 Firefox/62.0'}

        temp = url + str(self.year) + '&season=' + str(self.season)

        req = ur.Request(url=temp, headers=headers)

        html = ur.urlopen(req).read()

        self.soup = BeautifulSoup(html, 'lxml')

        self.Spider(list)

        return list

滬深300歷史交易記錄網頁如下:

【2】 從HTML中拿到我們需要的數據

通過審查元素,我們可以使用 BeautifulSoup 來 find_all 我們所需要的內容。

BeautifulSoup 中文官網如下:

  • https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

代碼如下:

    def Spider(self,list):

        tag = self.soup.find('table', {'class': "table_bg001 border_box limit_sale"})

        data = tag.find_all('td')

        for i in data:

            list.append(i.text)

注:此處連接上文代碼,在一個class中。我們爬取的內容包括 日期收盤價格開盤價格 以及 交易數額等,包括網頁上列表所展示的所有列名下的數據。

至此,我們就完成了數據的爬取,我們需要把數據存在數據庫中(作者使用的 MySql 數據庫,關于數據庫的操作就不再啰嗦,篇幅有限,大家見諒,如有疑問,請通過留言等方式聯系作者。)

第二步:分析處理數據

【1】數據分析包括兩塊:

  • 第一是計算滬深300交易數據的分位數;
  • 第二是數據的讀取與更新

分位數 -- 有序 (由小到大) list 中某一數值所在位置的百分比,具體求解方法參見維基百科相應部分:

  • https://zh.wikipedia.org/wiki/Percentile

【2】有了算法,我們就開始處理數據。我們要從數據庫中獲得我們需要的數據,而我們在計算分位數時面對的是平均數(收盤價、開盤價以及最高價、最低價的平均數),故應該先計算出平均數,然后算出分位數。

注:股票周期為兩年,我們計算某天的分位數要看這天的平均數所占之前兩年每天平均數這一 list 的位置(有點拗口,不過就是這個意思,見諒)。

代碼如下:

    def GetFra(self):

       for i in self.date:

           sql = "SELECT Average_One FROM stock WHERE Date BETWEEN DATE_SUB('" + str(

               i[0]) + "' ,INTERVAL " + str(self.period) + " YEAR) AND '" + str(i[0]) + "'ORDER BY Average_One ASC;"

           days = self.cursor.execute(sql)

           list = self.cursor.fetchall()

           sql1 = "SELECT Average_one FROM stock WHERE Date = '"+str(i[0])+"';"

           self.cursor.execute(sql1)

           temp = self.cursor.fetchone()

           sql2 = "UPDATE stock SET Fractile_Now=" + str(

               (list.index(temp)) * 100 // days) + " WHERE Date='" + str(i[0]) + "';"

           self.cursor.execute(sql2)

           self.db.commit()

           self.listone.append(numpy.percentile(list, 25))

    def Average(self):

        sql = "UPDATE stock SET Average_One=(Open_price+Top_price+Floor_price+Close_price)*0.25;"

        sql1 = "UPDATE stock SET Average_Two=Trade_amount/Trade_vol;"

        self.cursor.execute(sql)

        self.cursor.execute(sql1)

        self.db.commit()

Python 給我們提供了計算分位數的簡便方法,一個是 list 的各種操作,通過它的index方法可以計算當前分為數;另一個就是numpy ,numpy.percentile可以迅速對 list 或者元組排序,然后得到分位數,是不是很方便。

通過代碼大家可以看到我們把數據直接插入到 MySql 數據庫中,為我們后續數據的可視化作準備。

具體結果如圖:

作者使用的 navicat 來展示數據庫內容,navicat 是針對 mysql 的一個很好的可視化工具,推薦英文版給大家,下載鏈接如下:

  • https://www.navicat.com/en/products

【3】在數據的可視化之前,我們還要解決數據的讀取與更新問題,數據的讀取很好弄,cursor.fetall會返回一個元組,我們通過 sql 語句就可以解決數據的讀取問題;而更新操作就沒有那么容易,網頁上股票數據除了節假日都會更新,我們需要每天定時爬取數據以及處理數據,作者通過使用的 ubuntu 的crontab 定時運行 python 腳本文件,具體實施大家可以找度娘,因為不同電腦環境配置不同,出現的問題也比較復雜,作者能力有限,就不提供具體方法了。

第三步:數據的可視化

【1】數據的可視化還是比較容易的,因為我們的數據庫中已經處理好了數據,無論是每天的平均價格還是分位數都在數據庫中,我們只需要提取數據,然后作圖就好了。

【2】在作圖上,作者使用的是pyecharts,不過要pyecharts做出來的圖需要在瀏覽器上打開,當然,還有pyecharts不會這么水,在搭建了Nodejs后,使用pyecharts-snapshot插件就可以在指定位置生成圖片了。具體pyecharts教程參考鏈接:

  • http://pyecharts.org/#/zh-cn/prepare

注:在安裝snapshot時可能遇到npm安裝錯誤的問題,可以使用cnpm來解決問題,百度時記得把cnpm加上,可以輕松一些。

【3】可視化就介紹這些,下面看代碼:

    def Trade(self):

        db = pymysql.connect('localhost', 'root', '******', '****')

        cursor = db.cursor()

        sql_75 = "SELECT Fractile_75 FROM stock WHERE Date BETWEEN  DATE_SUB('" +str(self.time) + "' ,INTERVAL 2 YEAR)  AND '" + str(self.time) + "' ORDER BY DATE ASC;"

        sql_40 = "SELECT Fractile_40 FROM stock WHERE Date BETWEEN  DATE_SUB('" +str(self.time) + "' ,INTERVAL 2 YEAR)  AND '" + str(self.time) + "' ORDER BY DATE ASC;"

        sql_average = "SELECT Average_one FROM stock WHERE Date BETWEEN  DATE_SUB('" +str(self.time) + "' ,INTERVAL 2 YEAR)  AND '" + str(self.time) + "' ORDER BY DATE ASC;"

        sql1 = "SELECT Date FROM stock WHERE Date BETWEEN  DATE_SUB('" +str(self.time) + "' ,INTERVAL 2 YEAR)  AND '" + str(self.time) + "' ORDER BY DATE ASC;"

        cursor.execute(sql_75)

        data_75 = cursor.fetchall()  

        cursor.execute(sql_40)

        data_40 = cursor.fetchall()

        cursor.execute(sql_average)

        data_average = cursor.fetchall()

        top = max(data_average)[0]- 300

        floor = min(data_average)[0]- 300

        cursor.execute(sql1)

        date = cursor.fetchall()

        temp = []

        for i in date:

            temp.append(i[0])

        line1 = Line("滬深300歷史交易曲線", self.text ,title_text_size=12 ,subtitle_text_size=10 )

        line1.use_theme("dark")   #設置背景

        line1.add("平均價", temp, data_average, ys_aximin=math.floor(floor/100)*100, ys_aximax=math.ceil(top/100)*100)

        line1.add("分位數40", temp, data_40 ,yaxis_min=math.floor(floor/100)*100, ys_aximax=math.ceil(top/100)*100)

        line1.add("分位數75", temp, data_75,yaxis_min=math.floor(floor/100)*100 ,ys_aximax=math.ceil(top/100)*100)

        line1.render(path='Trade.png')   #此處可以指定文件位置   

作者在獲取不同分位數的 SQL 語言看起來比較蠢,但是pyecharts作圖中需要元組或者 list,而文中代碼可以滿足需要,并且簡單(可以理解為作者沒有好方法,只能這么做)。

下面上圖:

關于股票分析到此基本上就結束了,大家在看此文章時會覺得描述不充分,的確,在寫這篇文章時,作者省略了很多,不過都是一些比較簡單操作,大家在看文中提供的代碼時,基本可以想到省略的內容。

[!--temp.sitename--]聲明:資訊來源于互聯網,屬作者個人觀點,僅供投資者參考,并不構成投資建議。投資者據此操作,風險自擔。

世界杯体彩怎么买