第三篇 用Pandas計(jì)算股票指標(biāo)

關(guān)鍵詞

Pandas Sqlite3

GitHub

calculate_stock_spec

思路

當(dāng)前只計(jì)算某只股票最多一年的指標(biāo)啦桌,常見的5天伪冰,10天掀鹅,20天和一年的指標(biāo)任岸。
從數(shù)據(jù)庫中拿到某只股票一年的K線數(shù)據(jù),振幅指標(biāo)只需要自己的數(shù)據(jù)疚顷,貝塔系數(shù)需要對比大盤的數(shù)據(jù)跋核,上海交易所的股票就用上證指數(shù)計(jì)算除抛,深圳交易所的股票就用深成指來計(jì)算薯酝。

讀數(shù)據(jù)庫

從數(shù)據(jù)庫中讀取某只股票的K線數(shù)據(jù)半沽,上一篇有說到 pandas.to_sql() 方法存數(shù)據(jù)不太好用,但是pandas.read_sql()方法可以比較方便的讀取數(shù)據(jù)吴菠,而且返回?cái)?shù)據(jù)結(jié)構(gòu)就是DataFrame者填,便于我們計(jì)算。

  • 讀取上證指數(shù)
from sqlalchemy import create_engine
import pandas as pd
import datetime

db = create_engine('sqlite:///mystock.db')
sql_cmd = "SELECT * FROM stock_day_k where code='sh.000001' order by date desc limit 0,251"
datash = pd.read_sql(sql=sql_cmd, con=db)

這里我們用251天的原因是一年的交易天數(shù)大概是251天做葵。用date倒序取251行就大概是一年的K線數(shù)據(jù)占哟。

  • 讀取股票K線

讀取單只股票K線數(shù)據(jù)和讀取上證指數(shù)是一樣的,只是有些股票可能會存在停盤的情況酿矢,所以判斷如果十個(gè)交易日都是非交易狀態(tài)榨乎,這個(gè)股票就先不計(jì)算了。
想拿到交易狀態(tài)瘫筐,數(shù)據(jù)中有一列列名是 'tradestatus'蜜暑,用dataframe['columnname']就可以拿到一整列數(shù)據(jù)。

sql_cmd = "SELECT * FROM stock_day_k where code='" + ticker+"' order by date desc limit 0,251"
daily = pd.read_sql(sql=sql_cmd, con=db)
if tradestatus == 0:
    count = 0
    canSkip = False
    for tradestatus2 in daily['tradestatus']:
        if tradestatus2 == 1:
            break
        count += 1
        if count ==10:
            canSkip = True
            break

    if canSkip:
        continue 
  • 數(shù)據(jù)處理

從數(shù)據(jù)庫中拿到的數(shù)據(jù)严肪,是根據(jù)日期倒序排列的史煎,這里需要升序排序,并把索引重置驳糯。

daily = daily.sort_values(by='date', ascending=True)
daily = daily.reset_index(drop = True)

給數(shù)據(jù)加一列篇梭,計(jì)算所有日期和第一天的相對價(jià)格,close就是某日的收盤價(jià)格酝枢。

daily['relaprice'] = daily['close']/daily['close'][0]
  • 計(jì)算貝塔系數(shù)

找了一些計(jì)算貝塔系數(shù)的方法恬偷,Scipy里scipy.stats.linregress函數(shù)可以直接計(jì)算。 取一段時(shí)間內(nèi)大盤的相對數(shù)據(jù)和某只股票的相對數(shù)據(jù)來計(jì)算帘睦,考慮到有些股票可能沒有比較新袍患,時(shí)間不夠一年或者一個(gè)月,如果想計(jì)算的日期數(shù)比股票的數(shù)據(jù)還多的話竣付,最后取時(shí)間區(qū)間為股票的時(shí)間诡延。
用 array[-N:] 來獲取數(shù)組的最后N個(gè)數(shù)據(jù)。

#relaticker = daily['relaprice']
#relash = datash['relaprice']
from scipy import stats
def cal_alpha_beta(relash, relaticker, dayNumber=0):
    if dayNumber > relaticker.shape[0]:
        return np.nan,np.nan,np.nan
    if dayNumber == 0:
        dayNumber = relaticker.shape[0]
    beta,alpha,r_value,p_value,std_err=stats.linregress(relash[-dayNumber:], relaticker[-dayNumber:])
    return alpha,beta,r_value**2
  • 計(jì)算相關(guān)系數(shù)

相關(guān)系數(shù)是另一個(gè)股票與大盤的對比指標(biāo)古胆。Pandas有提供現(xiàn)成的方法pandas.DataFrame.pct_change肆良,需要將股票數(shù)據(jù)和大盤數(shù)據(jù)組合在一起

# 用sh.000001和sh.000002為例,將第二個(gè)數(shù)據(jù)的close列連接到sh.000001數(shù)據(jù)
price = DataFrame({'date': datash['date'], 'sh.000001':datash['close']})
pp = DataFrame({'sh.000002':daily['close']})
#拼接
price2 = pd.concat([price, pp], axis=1)
#按照date升序排列
price2 = price2.sort_values(by='date', ascending=True)
#把date列去掉逸绎,因?yàn)橛?jì)算的時(shí)候不需要這一列了
price2 = price2.drop(['date'], axis=1)
#去除索引
price2 = price2.reset_index(drop = True)
corr, cov = cal_correlation(price2, pp.shape[0])

def cal_correlation(price, length, dayNumber=0):
    if dayNumber >length:
        return np.nan,np.nan
    if dayNumber == 0:
        dayNumber = length
    #獲取后N個(gè)數(shù)據(jù)
    pricelastN = price.tail(dayNumber)
    returns = pricelastN.pct_change()
    corr=returns.corr()
    cov=returns.cov()
    return corr.iloc[1][0],cov.iloc[1][0]
  • 計(jì)算振幅

振幅這個(gè)比較簡單惹恃,計(jì)算起來也比較簡單

#dayK 就是股票的K線數(shù)據(jù)
def cal_amplitude(dayK,dayNumber=0):
    if dayNumber > dayK.shape[0]:
        return np.nan
    if dayNumber == 0:
        dayNumber = dayK.shape[0]
    dailylastN = dayK.tail(dayNumber)
    maxhigh = dailylastN['high'].max()
    minlow = dailylastN['low'].min()
    amplitude = (maxhigh - minlow)/dailylastN['preclose'].iloc[0]
    return amplitude
  • 其他指標(biāo)

后續(xù)再想想。棺牧。巫糙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市颊乘,隨后出現(xiàn)的幾起案子参淹,更是在濱河造成了極大的恐慌,老刑警劉巖乏悄,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件承二,死亡現(xiàn)場離奇詭異,居然都是意外死亡纲爸,警方通過查閱死者的電腦和手機(jī)亥鸠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來识啦,“玉大人负蚊,你說我怎么就攤上這事⊥窍” “怎么了家妆?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冕茅。 經(jīng)常有香客問我伤极,道長蛹找,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任哨坪,我火速辦了婚禮庸疾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘当编。我一直安慰自己届慈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布忿偷。 她就那樣靜靜地躺著金顿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲤桥。 梳的紋絲不亂的頭發(fā)上揍拆,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音茶凳,去河邊找鬼礁凡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛慧妄,可吹牛的內(nèi)容都是我干的顷牌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼塞淹,長吁一口氣:“原來是場噩夢啊……” “哼窟蓝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饱普,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤运挫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后套耕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谁帕,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年冯袍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匈挖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡康愤,死狀恐怖儡循,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情征冷,我是刑警寧澤择膝,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站检激,受9級特大地震影響肴捉,放射性物質(zhì)發(fā)生泄漏腹侣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一齿穗、第九天 我趴在偏房一處隱蔽的房頂上張望傲隶。 院中可真熱鬧,春花似錦缤灵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芝薇,卻和暖如春胚嘲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洛二。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工馋劈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晾嘶。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓妓雾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親垒迂。 傳聞我的和親對象是個(gè)殘疾皇子械姻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容