對(duì)股票進(jìn)行分析

使用的庫

pandas對(duì)數(shù)據(jù)進(jìn)行提取清洗加工疼阔,持久化
baostock在線獲取股票數(shù)據(jù)
matplotlib進(jìn)行相關(guān)繪制
mplfinance繪制k線

一、量化交易概述

1半夷、量化交易(投資方法)

以先進(jìn)的數(shù)學(xué)模型替代人為的主觀判斷竿开,利用計(jì)算機(jī)技術(shù)從龐大的歷史數(shù)據(jù)中海選能帶來超額收益的多種“大概率”事件以制定策略,極大地減少了投資者情緒波動(dòng)的影響玻熙,避免在市場(chǎng)極度狂熱或悲觀的情況下作出非理性的投資決策否彩。

量化交易一般會(huì)經(jīng)過海量數(shù)據(jù)仿真測(cè)試和模擬操作等手段進(jìn)行檢驗(yàn),并依據(jù)一定的風(fēng)險(xiǎn)管理算法進(jìn)行倉位和資金配置嗦随,實(shí)現(xiàn)風(fēng)險(xiǎn)最小化和收益最大化列荔,但往往也會(huì)存在一定的潛在風(fēng)險(xiǎn)。

2枚尼、算法交易(自動(dòng)交易贴浙、黑盒交易或機(jī)器交易)

通過設(shè)計(jì)算法,利用計(jì)算機(jī)程序發(fā)出交易指令的方法署恍。在交易中崎溃,程序可以決定的范圍包括交易時(shí)間的選擇、交易的價(jià)格盯质,甚至包括最后需要成交的資產(chǎn)數(shù)量袁串。

3概而、量化策略

使用計(jì)算機(jī)作為工具,通過一套固定的邏輯來分析囱修、判斷和決策赎瑰。量化策略既可以自動(dòng)執(zhí)行,也可以人工執(zhí)行破镰。

一個(gè)完整的策略需要包含輸入餐曼、策略處理邏輯輸出鲜漩;策略處理邏輯需要考慮選股源譬、擇時(shí)占拍、倉位管理和止盈止損等因素奶赠。

4、量化選股

用量化的方法選擇確定的投資組合蒸绩,期望這樣的投資組合可以獲得超越大盤的投資收益鳞青。

常用的量化選股模型(可以點(diǎn)擊鏈接查看):多因子選股模型霸饲、行業(yè)輪動(dòng)選股为朋、風(fēng)格輪動(dòng)模型臂拓、資金流模型、動(dòng)量反轉(zhuǎn)模型习寸、一致預(yù)期模型胶惰、趨勢(shì)跟蹤選股等。

5霞溪、股票回測(cè)

將交易策略在歷史數(shù)據(jù)中進(jìn)行合理驗(yàn)證的過程孵滞。

股票回測(cè)的意義:策略篩選、策略優(yōu)化鸯匹、策略驗(yàn)證坊饶。

二、股票數(shù)據(jù)

部分股票數(shù)據(jù)如下


下圖是baostock提供的數(shù)據(jù)說明:
返回?cái)?shù)據(jù)說明

該支股票數(shù)據(jù)包含了開盤價(jià)殴蓬、最高價(jià)匿级、最低價(jià)、收盤價(jià)染厅、成交量痘绎、換手率、pe和pb等這些指標(biāo)肖粮。
一個(gè)股市的總市值孤页,就是按某一日的收盤價(jià)格計(jì)算出來的所有股票的市值之和。

三涩馆、股票數(shù)據(jù)分析

1行施、導(dǎo)入股票時(shí)間序列數(shù)據(jù)

#第一步:導(dǎo)入baostock庫允坚,并登錄
import baostock as bs
import pandas as pd
# 得到數(shù)據(jù)集后畫圖
import matplotlib.pyplot as plt
# 為了正常顯示漢字與-
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
lg = bs.login()
# 顯示登陸返回信息
print('login respond error_code:' + lg.error_code)
print('login respond  error_msg:' + lg.error_msg)

# 第二步:接口配置,獲取股票信息,返回結(jié)果集
rs = bs.query_history_k_data("000001.SH",
                             "date,code,open,high,low,close,preclose,volume,amount,adjustflag,"
                             "turn,tradestatus,pctChg,peTTM,pbMRQ,psTTM,pcfNcfTTM,isST",
                             start_date='2010-01-01', end_date='2019-12-31', frequency="d", adjustflag="3")
print('query_history_k_data respond error_code:' + rs.error_code)
print('query_history_k_data respond  error_msg:' + rs.error_msg)

# 第三步:打印結(jié)果為pandas的Dataframe
# 將股票結(jié)果集封裝到Dataframe

#### 打印結(jié)果集 ####
data_list = []
while (rs.error_code == '0') and rs.next():  # 獲取一條記錄悲龟,將記錄合并在一起
    # 獲取單只股票信息
    # da = rs.get_row_data()
    # print(da)
    data_list.append(rs.get_row_data())
result = pd.DataFrame(data=data_list, columns=rs.fields)

### 結(jié)果集可以輸出到csv文件 ####   
result.to_csv("E:\pycharm數(shù)據(jù)分析\股票分析\history_A_stock_k_data.csv", index=False)
# 將結(jié)果集賦值給df
df = result
# 打印相關(guān)信息
df.info()
# 查看前5條數(shù)據(jù)
df.head()
info

head

將Dataframe索引修改為時(shí)間索引

df.rename(index=pd.to_datetime(df['date']),inplace=True)
df

2屋讶、繪制股票成交量的時(shí)間序列圖

繪制股票在2011年到2019年的日成交量的時(shí)間序列圖。
以時(shí)間為橫坐標(biāo)须教,每日的成交量為縱坐標(biāo)皿渗,做折線圖,可以觀察股票成交量隨時(shí)間的變化情況轻腺。這里直接用DataFrame數(shù)據(jù)自帶的作圖工具(該工具能夠快速做圖乐疆,并自動(dòng)優(yōu)化圖形輸出形式)

# 得到數(shù)據(jù)集后畫圖
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 將成交量修改格式
y = df['volume'].astype(float)
# 將股票中成交量裝載dataframe
plot_data = pd.DataFrame(data=y)
# 繪圖,修改畫布大小
plot_data.plot(grid=True,color='red',label='600000.SH',figsize=(20,10),stacked = True)

# 繪圖文字設(shè)置
plt.title('股票成交量時(shí)間序列圖',fontsize='18')
plt.ylabel('volume', fontsize='14')
plt.xlabel('date', fontsize='14')
plt.legend(loc='best',fontsize='18')
plt.xticks(fontsize='12')
plt.yticks(fontsize='14')

3贬养、繪制股票收盤價(jià)和成交量的時(shí)間序列圖

繪制股票在2013年1月份—2016年12月份的日收盤價(jià)和日成交量的時(shí)間序列圖挤土,因?yàn)樗鼈兊臄?shù)值差異很大,所以采用兩套縱坐標(biāo)系來做圖误算。

import numpy as np
import matplotlib.pyplot as plt
# 提取數(shù)據(jù)
y = df[['close','volume']]
# 裝載加工
plot_data = pd.DataFrame(data=y.astype(float))
plot_data.rename(columns={'close':'收盤價(jià)','volume':'成交量'}, inplace=True)
# 繪制股票在2013年1月份—2016年12月份的日收盤價(jià)和日成交量的時(shí)間序列圖仰美,因?yàn)樗鼈兊臄?shù)值差異很大,所以采用兩套縱坐標(biāo)系來做圖儿礼。
plot_data = plot_data.loc['2013-1':'2016-12']


fig, ax1 = plt.subplots(figsize=(20, 10), sharex=True)

ax1.plot(plot_data.index, plot_data['收盤價(jià)'], 'b')
# x軸設(shè)置
ax1.set_xlabel('date', fontsize='15')

ax1.set_ylabel('收盤價(jià)', color='b', fontsize='15')
ax1.tick_params('y', colors='b')
ax1.legend(loc='upper left', prop={'size': 15})

# ***
ax2 = ax1.twinx()

ax2.plot(plot_data.index, plot_data['成交量'], 'r')
ax2.set_ylabel('成交量', color='r', fontsize='15')
ax2.tick_params('y', colors='r')
ax2.legend(loc='upper right', prop={'size': 15})

# 繪圖咖杂,修改畫布大小
# plt.plot(grid=True,color='red',label='600000.SH',figsize=(20,10),stacked = True)

# 繪圖文字設(shè)置
plt.title('股票成交量時(shí)間序列圖', fontsize='18')

3、繪制K線圖(蠟燭圖)

(1)K線圖理論

繪制方法:首先我們找到該日或某一周期的最高和最低價(jià)蚊夫,垂直地連成一條直線诉字;然后再找出當(dāng)日或某一周期的開市和收市價(jià),把這二個(gè)價(jià)位連接成一條狹長(zhǎng)的長(zhǎng)方柱體知纷。假如當(dāng)日或某一周期的收市價(jià)較開市價(jià)為高(即低開高收)壤圃,我們便以紅色來表示,或是在柱體上留白琅轧,這種柱體就稱之為"陽線"伍绳。如果當(dāng)日或某一周期的收市價(jià)較開市價(jià)為低(即高開低收),我們則以綠色表示乍桂,又或是在住柱上涂黑色冲杀,這柱體就是"陰線"了。

表示意義:能夠全面透徹地觀察到市場(chǎng)的真正變化模蜡。我們從K線圖中漠趁,既可看到股價(jià)(或大市)的趨勢(shì),也同時(shí)可以了解到每日市況的波動(dòng)情形忍疾。

(2)K線圖繪制

首先闯传,安裝 mpl_finance 模塊(pip install mpl_finance

使用mpl_finance 模塊中的**candlestick_ohlc() **函數(shù)繪制K線圖。

下面定義了pandas_candlestick_ohlc()函數(shù)來繪制適用于本文數(shù)據(jù)的K線圖卤妒,其中大部分代碼都是在設(shè)置坐標(biāo)軸的格式甥绿。

繪制股票在2013年3月份每日的開盤價(jià)字币,最高價(jià),最低價(jià)共缕,收盤價(jià)的K線圖洗出。

首先獲取月線數(shù)據(jù)

# 繪制k線 在baostock中取數(shù)據(jù) 以月為單位取k線數(shù)據(jù)
import baostock as bs
import pandas as pd
lg = bs.login()
rs = bs.query_history_k_data("sh.600000",
                             "date,code,open,high,low,close,volume,amount,adjustflag,"
                             "turn,pctChg",
                             start_date='2010-01-01', end_date='2019-12-31', frequency="M", adjustflag="3")
print('query_history_k_data respond error_code:' + rs.error_code)
print('query_history_k_data respond  error_msg:' + rs.error_msg)
# 將股票結(jié)果集封裝到Dataframe
#### 打印結(jié)果集 ####
data_list = []
while (rs.error_code == '0') and rs.next():  # 獲取一條記錄,將記錄合并在一起
    data_list.append(rs.get_row_data())
result_mouth = pd.DataFrame(data=data_list, columns=rs.fields)
result_mouth.to_csv("E:\pycharm數(shù)據(jù)分析\股票分析\history_A_stock_k_data_month.csv", index=False)

繪制股票在2017年1月份到2019年31日的開盤價(jià)图谷,最高價(jià)翩活,最低價(jià),收盤價(jià)的K線圖便贵。

import mplfinance as mpf
# 月線數(shù)據(jù)清洗
result_mouth.index = pd.to_datetime(result_mouth['date'])
df_mon = result_mouth.iloc[:, [0, 2, 3, 4, 5]]
df_mon = df_mon[['open', 'high', 'low', 'close']].astype(float)
# 繪制k線
df_mon = df_mon.loc['2017-1':'2019-12']
mpf.plot(df_mon, type='candle',style='yahoo')

紅色代表上漲菠镇,綠色代表下跌。


4承璃、股票指標(biāo)相關(guān)性分析

(1)相關(guān)關(guān)系分析


下面挑選了部分代表性的指標(biāo)利耍,并使用pandas.scatter_matrix()函數(shù),將各項(xiàng)指標(biāo)數(shù)據(jù)兩兩關(guān)聯(lián)做散點(diǎn)圖盔粹,對(duì)角線是每個(gè)指標(biāo)數(shù)據(jù)的直方圖隘梨。指標(biāo)包括:成交量、市值舷嗡、換手率轴猎、pe、pb咬崔。

# 計(jì)算市值marketvalue 并更新df
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
df = pd.read_csv('E:\pycharm數(shù)據(jù)分析\股票分析\history_A_stock_k_data.csv',index_col=0)
df = df.assign(marketvalue=df['close'].astype(float)*df['volume'].astype(float))

# 清洗出需要的數(shù)據(jù)
smdata = df[['volume','marketvalue','turn']]
smdata.rename(columns={'volume':'成交量','marketvalue':'市值','turn':'換手率'},inplace=True)
smdata = smdata.astype(float)
# 處理缺失值
smdata = smdata.dropna(how='any',axis=0)

scatter_matrix(smdata,figsize=(8,8),grid=True)
plt.show()

從圖中可以明顯發(fā)現(xiàn)成交量(volume)和換手率(turnover)有非常明顯的線性關(guān)系.
注意:相關(guān)表和相關(guān)圖可反映兩個(gè)變量之間的相互關(guān)系及其相關(guān)方向税稼,但無法確切地表明兩個(gè)變量之間相關(guān)的程度烦秩。

(2)相關(guān)系數(shù)(Correlation coefficient)分析

相關(guān)系數(shù)是用以反映變量之間相關(guān)關(guān)系密切程度的統(tǒng)計(jì)指標(biāo)垮斯。

我們可以使用numpy.corrcof()來直接計(jì)算各指標(biāo)數(shù)據(jù)間的相關(guān)系數(shù)。

np.corrcoef(smdata.T)

看數(shù)字還是不夠方便只祠,所以繼續(xù)將上述相關(guān)系數(shù)矩陣轉(zhuǎn)換成圖形兜蠕,使用matplotlib.pyplot.matshow() 將矩陣可視化。如下圖所示抛寝,其中用顏色來代表相關(guān)系數(shù)熊杨。

cov=np.corrcoef(np.corrcoef(smdata.T))
img=plt.matshow(cov)
plt.colorbar(img,ticks=[-1,0,1])
plt.show()

從圖中可以看出,成交量(volume)和轉(zhuǎn)手率(turnover)強(qiáng)烈正相關(guān)
相關(guān)性分析總結(jié):用矩陣圖表的方式分析多個(gè)指標(biāo)或觀察指標(biāo)間的相關(guān)系數(shù)矩陣可以迅速找到了強(qiáng)相關(guān)的指標(biāo)盗舰。

5晶府、移動(dòng)平均線

移動(dòng)平均線(Moving Average,MA)是用統(tǒng)計(jì)分析的方法钻趋,將一定時(shí)期內(nèi)的證券價(jià)格(指數(shù))加以平均川陆,并把不同時(shí)間的平均值連接起來,形成一根MA蛮位,用以觀察證券價(jià)格變動(dòng)趨勢(shì)的一種技術(shù)指標(biāo)较沪。

使用上述月線股票數(shù)據(jù)中每月的收盤價(jià)鳞绕,算出5月均價(jià)和10月均價(jià),并將均價(jià)的折線圖畫出

a =df_mon['close'].rolling(window=5,min_periods=1).mean()
b = df_mon['close'].rolling(window=10,min_periods=1).mean()
da = pd.DataFrame(data={'5month_mena':a,'10month_mena':b,'close':df_mon['close']})
da
da.plot()

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尸曼,一起剝皮案震驚了整個(gè)濱河市们何,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌控轿,老刑警劉巖冤竹,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異茬射,居然都是意外死亡贴见,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門躲株,熙熙樓的掌柜王于貴愁眉苦臉地迎上來片部,“玉大人,你說我怎么就攤上這事霜定〉涤疲” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵望浩,是天一觀的道長(zhǎng)辖所。 經(jīng)常有香客問我,道長(zhǎng)磨德,這世上最難降的妖魔是什么缘回? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮典挑,結(jié)果婚禮上酥宴,老公的妹妹穿的比我還像新娘。我一直安慰自己您觉,他們只是感情好拙寡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琳水,像睡著了一般肆糕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上在孝,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天诚啃,我揣著相機(jī)與錄音,去河邊找鬼私沮。 笑死始赎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播极阅,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胃碾,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了筋搏?” 一聲冷哼從身側(cè)響起仆百,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奔脐,沒想到半個(gè)月后俄周,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡髓迎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年峦朗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片排龄。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡波势,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橄维,到底是詐尸還是另有隱情尺铣,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布争舞,位于F島的核電站凛忿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏竞川。R本人自食惡果不足惜店溢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望委乌。 院中可真熱鬧床牧,春花似錦、人聲如沸福澡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽革砸。三九已至,卻和暖如春糯累,著一層夾襖步出監(jiān)牢的瞬間算利,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工泳姐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留效拭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像缎患,于是被迫代替她去往敵國(guó)和親慕的。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355