双均线:此处采用5日均线和30日均线
金叉:短均线上穿长均线 5日线上穿30日线,交叉处为金叉 5日线<30日线 由true--->false
死叉:短均线下穿长均线 5日线下穿30日线,交叉处为死叉 由false--->true
具体实现代码:
import tushare as ts #金融数据接口
import pandas as pd
from pandas import Series,DataFrame
data=ts.get_k_data(code='002460',start='2015',end='2019-06')
data.to_csv('./gfly.csv',)
df=pd.read_csv('./gfly.csv',index_col='date',parse_dates=['date']) #将日期列作为列的索引对象
df.drop(labels='Unnamed: 0',axis=1,inplace=True) #清除空白列
df
day_5=df['close'].rolling(5).mean() #收盘价的五日均价 rolling依次取值 mean 聚合求值
day_30=df['close'].rolling(30).mean() #30日均价
df['d5']=day_5
df['d30']=day_30
s1= df['d5']< df['d30'] # T->F 出现金叉 F->T 出现死差
s2= df['d5']> df['d30']
# s1 T T F T T T F F F T F T
# S2 F F T F F F T T T F T F 向右偏移一位
# T F T T T F T T T F T 此行中的F就是对应的S1发生金叉的日期
# F T F F F T F F F T F 取反后得到的T就是对应的金叉日期 过滤出T
gold=df.loc[~(s1 | s2.shift(1))].index #金叉对应的时间
death=df.loc[(s1 & s2.shift(1))].index #出现死叉日期
first_money=100000 #初始可用资金
money=first_money
hold=0 #初始持有股票
g1=pd.Series(1,index=gold) #金叉标志位 1
d1=pd.Series(0,index=death) #死叉标志位 0
gd=g1.append(d1).sort_index()
for i in range(0,len(gd)):
p=df['open'][gd.index[i]] #金叉当天的开盘价
if gd[i]==1: #金叉 会买入股票
hand=(money//(100*p)) #最多可以买几手
hold+=hand*100 #持有股票数量
money-=hand*100*p #剩余可用资金
else:
money+=hold*p #股票卖出
hold=0 #清零
price=df['open'][-1] #上个交易日的开盘价
now_money=hold*price+money #可用资金和持有股票价值
print(now_money)