对股票的双均线策略

双均线:此处采用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)        

 

posted @ 2019-06-10 15:26  青红*皂了个白  阅读(910)  评论(0编辑  收藏  举报