使用的庫
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ù)說明:
該支股票數(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()
將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()