1. 程式人生 > >阿里天池競賽 A股上市公司營收預測 使用LSTM模型做時序預測

阿里天池競賽 A股上市公司營收預測 使用LSTM模型做時序預測

參賽結束了,最後結果一百多名,先把清洗好的資料和預測演算法檔案記錄下來。

使用的完全程式碼和資料

程式碼註釋如下

# -*- encoding:utf-8 -*-
import pandas as pd
import numpy as np
import sys
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from keras.models import Sequential
from sklearn.preprocessing import MinMaxScaler

# 視窗長度
LEN_SEQ = 2
np.random.seed(0)

def load_one(data, x):
    global LEN_SEQ
    #ticker = data.query("TICKER_SYMBOL=="+str(x)) # 個股
    #ticker = data.query("TICKER_SYMBOL==1 or TICKER_SYMBOL==5")
    ticker =data.loc[data['TICKER_SYMBOL']==x]
    #ticker = data.query("[email protected]")
    print('query the data')
    #print(ticker)
    arr = ticker.ix[:,[1,2,3,4]] # 矩陣
   # print(arr)
    # 做時序差分
    train, label = [], []
    b_size = 4
    for i in range(LEN_SEQ,0,-1):
        train.append(arr.shift(i))
        label += [('var%d(t-%d)' % (j+1,i)) for j in range(b_size)]
    for i in range(LEN_SEQ):
        train.append(arr.shift(-i))
        if i ==0:
            label += [('var%d(t)' %(j+1)) for j in range(b_size)]
        else:
            label += [('var%d(t+%d)'%(j+1,i)) for j in range(b_size)]
    Train = pd.concat(train,axis=1)
    Train.dropna(inplace=True)
    #Train.columns = label
    return Train

def build_model():
    model = Sequential()
    model.add(LSTM(20,input_shape=(1,15)))
    model.add(Dense(1))
    model.compile(loss='mae',optimizer='adam')
    return model
    

def predict_point_by_point(model, data):
    values = data.values
    train_X,train_y = values[:,:-1],values[:,-1]
    #test_X,test_y = values[:,:-1],data[:,-1]
    train_X = train_X.reshape((train_X.shape[0],1,train_X.shape[1]))
    #test_X = test_X.reshape(test_X,shape[0],LEN_SEQ,test_X.shape[1])
    LSTM = model.fit(train_X,train_y,epochs=20,batch_size=3)
    return model

#在金融的這份資料裡,沒有2018年q2的資料,也就是t+1的cogs,operateprofit,nincome都沒有,無法去預測目標,也就是revenue的值。所以我們需要先對每個單列做出預測,這裡我們仍然用lstm對2018q2的這三列預測,再加上向前的三次記錄,共十五列來做預測

def create_trainX_trainy(data, look_back=1):
    trainX, trainy = [], []
    for i in range(len(data)-look_back-1):
        a = data[i:(i+look_back)]
        trainX.append(a)
        trainy.append(data[i + look_back])
    return np.array(trainX), np.array(trainy)


def predict_useone_column(column):
    trainX,trainy = create_trainX_trainy(column)
    trainX = np.reshape(trainX,(trainX.shape[0],1,trainX.shape[1]))

    model = Sequential()
    model.add(LSTM(20,input_shape=(1,1)))
    model.add(Dense(1))
    model.compile(loss='mae',optimizer='adam')
        

    
    model.fit(trainX,trainy,epochs=20,batch_size=1)
    return model

def main():
    dic = {}
    data = pd.read_csv("./datanew.csv", header=0)
    data.drop('END_DATE',1,inplace=True)
    #print(data.head(),data.columns)
    
    data.fillna(0.00001,inplace=True)
    

    #print(temp.isnull().count())
    #temp.fillna(0.000001,inplace=True)
    # 做minmax
    #scaler = MinMaxScaler(feature_range=(0,1))
    #data_scaled = pd.DataFrame(scaler.fit_transform(temp),columns=['TICKER_SYMBOL','REVENUE','COGS','OPERATE_PROFIT','N_INCOME'])
    
    tickers = data['TICKER_SYMBOL'].unique()
    #train, label, b_size = [], [], []


    #按股訓練,先出q2的前三列
    for i in tickers: # 按股迴圈
        print(i)
        train = load_one(data,i)
        if train.index.values ==[]:
            continue
        #print(train)
        
        
        
        #for j in [train.ix[:,12],train.ix[:,13],train.ix[:,14]]:
         #   predict_useone_column(model,column)
          #  train.ix[]
        #print(train.values.shape)
       # print(train.head())
        # 做模型
       # print(i)
        model = build_model()
        # 做預測
        #dic[str(i)] = "預測數值"
        #LSTM = predict_point_by_point(model,train)
        #print(data.loc[data['TICKER_SYMBOL']==i]['COGS'].values)
        cogs_model=predict_useone_column((data.loc[data['TICKER_SYMBOL']==i])['COGS'].values)
        operate_model=predict_useone_column((data.loc[data['TICKER_SYMBOL']==i])['OPERATE_PROFIT'].values)
        nincome_model=predict_useone_column((data.loc[data['TICKER_SYMBOL']==i])['N_INCOME'].values)
        
        
        
        pre2018q2 = np.array(list(train.iloc[-1,3:15].values))
        cogs = cogs_model.predict(np.reshape(np.array(pre2018q2[9]),(1,1,1)))
        operate = operate_model.predict(np.reshape(np.array(pre2018q2[10]),(1,1,1)))
        nincome = nincome_model.predict(np.reshape(np.array(pre2018q2[11]),(1,1,1)))
        pre2018q2 = np.append(pre2018q2,[cogs,operate,nincome])
        #print(pre2018q2)
        pre2018q2 = np.reshape(pre2018q2,(1,1,15))
    
        
        model_after_train = predict_point_by_point(model,train)
        pre_revenue = model_after_train.predict(pre2018q2)[0][0]
        #print(pre_revenue,len(pre_revenue))
        dic[str(i)] = pre_revenue
        #train = pd.DataFrame()
        
    result = pd.DataFrame(columns=['ticker_symbol','predict_revenue'])
    result['ticker_symbol'] = dic.keys()
    result['predict_revenue'] = dic.values()
    result.to_csv('./predict.csv')
    
if __name__ == "__main__":
    sys.exit(main())

相關推薦

阿里天池競賽 A上市公司預測 使用LSTM模型時序預測

參賽結束了,最後結果一百多名,先把清洗好的資料和預測演算法檔案記錄下來。 使用的完全程式碼和資料 程式碼註釋如下 # -*- encoding:utf-8 -*- import pandas as pd import numpy as np import sys f

FDDC2018金融演算法挑戰賽01-A上市公司季度預測

我所用到的資料 1、income_gb_2代表的是我從天池原有的income_statement中的general business匯出的,balance_gb_2和cash_gb_2  首亦然。 2、 Macro為巨集觀資料,Market為市場資料 匯入相關包,

競賽資訊|A上市公司公告資訊抽取

                                                                     (本內容轉載自公眾號“科技與Python”) A股上市公司公告資訊抽取 大賽背景 在金融領域,每24小時都會產生大約2.5億位元組的資

python抓取動態資料 A上市公司基本資訊

1.背景 之前寫的抓取A股所有上市公司資訊的小程式在上交所網站改版後,需要同步修改 pyton2.7.9 2.分析過程 以抓取宇通客車【600066】資訊為例 紅框中的內容是需要抓取的資訊,檢視網頁原始碼 可以看到公司資訊並沒有直接寫到html中,使用chrome “

爬取網易財經全部A上市公司年報

首先要找到所有A股上市公司的股票程式碼,將東方財富網列表中所有的股票的程式碼(6位數字號)取下來 <a target="_blank" href="http://quote.eastmoney.com/sh500001.html">基金金泰(500001

聯商網:2018上半年零售上市公司排行榜

據聯商網統計資料顯示,2018年上半年,我國127家零售業上市公司共實現營收10957.54億元,淨利潤729億元。 備註: 1、圖表為不完全統計,榜單按企業營收排名,資料來源為該上市公司財報。 2、貨幣單位為人民幣,美元、港幣按匯率轉換成人民幣。 3、標

A成“香餑餑”!李彥宏、丁磊、王小川表態回A上市為哪般?

A股 這幾天有關上市的消息突然多了起來,除了小米或將在A+H股兩地上市備受關註之外,李彥宏、丁磊、王小川等互聯網大佬在政協大會舉行期間,也紛紛表露了對回到A股上市的個人看法。之所以現在A股成為互聯網企業眼中的“香餑餑”,在於A股變革在即,有可能讓這些互聯網企業享受到更多福利和利益。 此前,包括百度、網易、阿裏

利用Python視覺化來檢視中國環保上市公司!排名第一的居然是?

  1. 提取所有股票程式碼   1import tushare as ts 2# 獲取所有股票列表 3data = ts.get_stock_basics() 4print(data.head()) 5# 返回資料如下,所有列值可以參考:ht

獲取美上市公司股票資料

最近半年算是徹底被樑博坑了,被帶入美股,開始一頓操作猛如虎,毫無經驗的我,被按在低谷使勁的摩擦,閒下來想想,有沒有辦法規範炒股的操作呢?因為我很多次都是誤操作才導致虧錢。慢慢接觸了量化交易,通過訓練歷史資料,修正策略模型,有可能在正股中盈利;我虧的是在期權上,期權的風險遠高於正股,期權一晚上的漲幅可

阿里天池競賽分享

        最近參加阿里天池的“網路影象的文字檢測”挑戰賽,終於結束,最終排名第181,總共是1424只隊伍參加。第一次參加機器學習挑戰賽,成績不是很理想,今天把一些體悟寫一下,希望對後來參加的人有用。一、賽題簡介在網際網路世界中,圖片是傳遞資訊的重要媒介。特別是電子商務

10行程式碼爬取全國所有A/港股/新三板上市公司資訊

作者 高階農民工 已獲原作者授權,如需轉載,請聯絡原作者。 摘要:我們平常在瀏覽網頁中會遇到一些表格型的資料資訊,除了表格本身體現的內容以外,可能還想透過表格背後再挖掘些有意思或者有價值的資訊。這時,可用python爬蟲來實現。本文采用pandas庫中的read_h

【附上解釋】爬取A所有上市公司的資訊並存儲到資料庫或者是csv檔案中

輸入到mysql版 輸出會有警告,但是不影響。 附上了詳細的解釋~ import pandas as pd import requests import random from bs4 import BeautifulSoup import pymysql f

阿里天池大資料競賽——口碑商家客流量預測 A

阿里天池大資料競賽——口碑商家客流量預測的競賽已經結束了,作為一個剛參加這種專案競賽的純小白來說,走了不少的彎路,在資料處理的過程上花費了大量的時間和功夫,最後得到的效果也不好,不過從這個過程還是學習到

54家國內主要百貨上市公司上半年排行榜

2018年零售行業最為關注的熱點問題就是消費升級和消費降級,“負重前行”的百貨行業也依然是零售行業關注的重點,2018年上半年,百貨行業的整體運營情況又是如何呢? 國內54家百貨上市公司的2018年上半年財報,根據財報,上半年54家上市公司合計實現營業收入2492.91億元,合計歸

小米推遲上市A大跌,背後有什麼共同原因?

矽谷Live / 實地探訪 / 熱點探祕 / 深度探討本文由華商韜略原創 首發於微信公眾號:華商

天池競賽系列】阿里移動推薦演算法思路解析

賽題地址:http://tianchi.aliyun.com/competition/information.htm?raceId=1 登入即可下載資料 從4月到7月,學習了很多也收穫了很多 題目就不多說了,一句話表達就是根據過去一個月的行為預測14年12月19

阿里天池大資料競賽

《阿里移動推薦演算法》 2014年是阿里巴巴集團移動電商業務快速發展的一年,例如2014雙11大促中移動端成交佔比達到42.6%。相比PC時代,移動端網路的訪問是隨時隨地的,具有更豐富的場景資料,比如使用者的位置資訊、使用者訪問的時間規律等。本次大賽以阿里巴巴移動電商平

證監會回應“IPO放寬”傳言:嚴把上市公司入口關

全國金融工作會議將直接融資放到重要位置後,有觀點認為IPO或進一步放寬。對此,證監會新聞發言人常德鵬在21日例行發布會上表示,證監會將嚴把上市公司入口關,加大整頓資本市場秩序力度,繼續嚴厲打擊欺詐發行。 常德鵬表示,證監會將認真貫徹落實習近平總書記在全國金融工作會議中關於“要把發展直接融資放

python3爬取上市公司基本數據

http fin form lis 爬蟲 sts 獲取網頁 bs4 ise 目前,我國滬深A股上市公司的數量為3524家[2018/05/31],如果能夠從某個財經網站上批量獲取這些公司的基本信息,將對研究工作起到一定幫助。進行這項工作之前,先讓我們梳理一下我們的數據及其來

選出某上市公司過去分紅情況

ram -o lse 是我 spa AR lB water 如何 股票分紅都是真金白銀,簡單來說,上市公司分配股利的方式主要有轉增股本和派發現金股利,其中現金股利比較好理解,就是上市公司直接派發給股民的現金紅利;轉增股本卻來自於資本公積,不受公司年度可分