一、知識儲備
Hello,各位小夥伴們,本篇博文給大家帶來的是利用雙均線政策,對中國平安601318股票進行炒股,所能獲得的大概收益。為了你能正确了解本文的知識,需要你提前做以下準備。。。
python基礎:本次政策分析是用python做的,是以需要你有python的基礎知識儲備。
python資料分析:本次用到的是pandas、matplotlib
均線概念:這是一個金融知識,在這簡單給大家講一下。假如我要計算一個5日均線,那我就是用今天在内往前推四天的收盤價做一個算術平均作為5日均線。30日、60日均線同理。
金叉:衍生于均線,是指短期均線上穿長期均線,說明股價上漲,這是一個買入信号
死叉:衍生于均線,是指短期均線下穿長期均線,說明股價下跌,這是一個賣出信号
二、開始操作
1.首先我們需要擷取這個股票的曆史資料
import tushare as ts
df=ts.get_k_data('601318',start='1988-01-01')
df.to_csv('601318.csv')
這邊需要給大家介紹一下這個tushare包,這是一個半免費的金融資料平台,有部分資料是免費給我們使用的,具體的你們上https://waditu.com/document/2?doc_id=118這個平台去查閱。
好的,那我們到這一步為止,就擷取了“中國平安601318”股票的曆史資料。因為每次擷取資料都會花一點時間,是以我們把資料存儲到本地。你也可以使用線上資料保證資料的實時性。
2.接着我們導入panda和matplotlib包,然後讀取本地資料,并計算5日均線和月均線
import pandas as pd
from matplotlib import pyplot as plt
df=pd.read_csv('601318.csv',index_col='date',parse_dates=['date'])[['open','close']]
這邊隻讀取我們需要的開盤價open,收盤價close,并将對應的日期作為我們的索引。
接下來是要計算均線,我們可以用循環去計算。
# 計算5日均線和30日均線
df['ma5']=np.nan #建立5日均線列
df['ma30']=np.nan # 建立30日均線列
# 用for循環做均線計算
for i in range(4,len(df)):# 計算5日均線,因為前4日不夠5天,是以下标從4開始,也就是第五天開始
df.loc[df.index[i],'ma5']=df['close'][i-4:i+1].mean()
for i in range(29,len(df)):# 計算30日均線
df.loc[df.index[i],'ma30']=df['close'][i-29:i+1].mean()
用循環計算均線是一種辦法,但是我們還可以用pandas包提供的一種方法去計算,更加友善。
df['ma5']=df['close'].rolling(5).mean() # 計算每5行的平均值
df['ma30']=df['close'].rolling(30).mean() # 計算每30行的平均值
rolling(num)函數很好的幫我們解決了取一定行數的問題,再取一個平均即可。
因為有29天月均線是沒有值的,是以我們删除那29天,因為沒有意義,然後我們可以畫一下收盤價、5日均線、月均線的折線圖,觀察一下。
df=df.dropna()
df[['close','ma5','ma30']].plot()
plt.show()

從這個圖中可以看出,2008-2009年,股票一路走跌,結合當年汶川地震,原因大家應該都知道了。
3.計算金叉、死叉日期
好的,那麼接下來我們需要計算一下金叉和死叉的日期,我們這邊選擇從2010年開始截取資料做政策。
同樣,這邊用循環來計算。
df=df['2010-01-01':]
# 計算金叉、死叉日期
# 建立一個金叉、死叉空清單
golden_cross=[]
death_cross=[]
# 用循環計算金叉、死叉日期
for i in range(1,len(df)):
if df['ma5'][i]>=df['ma30'][i] and df['ma5'][i-1]<df['ma30'][i-1]:
golden_cross.append(df.index[i])
if df['ma5'][i]<=df['ma30'][i] and df['ma5'][i-1]>df['ma30'][i-1]:
death_cross.append(df.index[i])
金叉:如果前一天的日均線小于月均線,後一天的日均線大于月均線,則說明兩天之間存在了一個焦點,這樣我們選取後一天作為金叉日期。因為實際生活中你不可能提前知道第二天會出現金叉,如果你能預先知道,那你炒股的收益一定會更高😏
死叉:上面的概念反過來就是了,相信你一定能搞懂😄
OK,那麼同樣的套路,學會了循環計算金叉和死叉後,還有個計算的方式跟大家說一下。
sr1=df['ma5']<df['ma30'] # 擷取5日均線<30日均線的布爾序列
sr2=df['ma5']>=df['ma30'] # 擷取5日均線>=30日均線的布爾序列
death_cross=df[sr1 & sr2.shift(1)].index
golden_cross=df[~(sr1 | sr2.shift(1))].index
這個了解起來可能比較難,是以先讓我給你解釋一下。
- 首先,我們先制定(5日均線<30日均線)這樣一個布爾條件,然後假設在某個10日時間内,它的布爾序列是這樣的TTTTFFFFTT.
OK,那麼我們可以得出前面4天都是日均線<月均線,在第5天的時候出現>=的情況,那麼說明金叉日期出現了。
OK,那麼同樣在第九天的時候,出現了死叉日期。
- 然後,我們制定(5日均線>=30日均線)這樣一個布爾條件,然後同樣在上面的10日時間内,它的布爾序列正好相反FFFFTTTTFF
OK,那麼得出的金叉和死叉日期和上面是一緻的。
- 最後,我們将兩個序列拿到一起做對比
T T T T F F F F T T
F F F F T T T T F F
注意,這邊我将下面那個序列往後偏移了一位,看下圖中我們知道了金叉日期和死叉日趨
好的,相信你這下就明白了上面的代碼是做什麼的了。
4.計算收益
好的,接下來就到了實操的環節。假定我們手上有十萬啟動資金,每次都能買入100股,并從2010年開始使用雙均線政策去炒股,讓我們看看十年時間,“中國平安601318”這支股票能為我們帶來多少收益?或讓我們虧損多少呢?廢話不多說,上代碼。
# 計算收益,每一手買100股
original_money=100000 # 擁有的初始資金十萬
money = original_money # 炒股過程中的資金變化(疊代變量)
hold=0 #持有多少股
golden_series=pd.Series(1,index=golden_cross) # 建立金叉日期序列
death_series=pd.Series(0,index=death_cross) # 建立死叉日期序列
signal=golden_series.append(death_series).sort_index() # 建立買入賣出信号日期序列
for i in range(0,len(signal)):
oprice = df['open'][signal.index[i]] # 擷取當天的開盤價
cprice = df['close'][signal.index[i]] # 擷取當天的收盤價
if signal.iloc[i]==1:
# 取到金叉日期,買入
buy=(money//(100*oprice)) # 計算買了多少手
hold+=buy*100 #計算手裡加了多少股票
money-=buy*100*oprice #計算剩餘多少資金
else:
# 取到死叉日期,賣出
money+=hold*cprice # 計算剩餘資金
hold=0 # 抛出所有股票
final_price=df['close'][-1] # 可能手中還有剩餘股票,是以擷取最後一天的收盤價
now_money=hold*final_price+money
print('預計收入:%.2f'%(now_money-original_money))
上面的過程映射到實際生活的買賣中稍有出入,如果長期執行此政策的話,誤差可以忽略不記。
截至2020-12-29日為止,預計收入為184496.20元。也就是說,平均每年能賺1.8W。
.
好了,本篇博文到這邊就結束了,如果你想入手整理好的代碼和資料,可以通路https://www.kesci.com/mw/project/5feadb15840381003bfbb44d
投資有風險,入市須謹慎!!!本文隻帶大家了解一下,不作為選股買股參考peace!!!