python数据分析04--双均线策略、金叉与死叉的理解

需求:双均线策略制定¶
1.使用tushare包获取某股票的历史行情数据

2.计算该股票历史数据的5日均线和30日均线

什么是均线?
对于每一个交易日,都可以计算出前N天的移动平均值,然后把这些移动平均值连起来,成为一条线,就叫做N日移动平均线。移动平均线常用线有5天、10天、30天、60天、120天和240天的指标。
5天和10天的是短线操作的参照指标,称做日均线指标;
30天和60天的是中期均线指标,称做季均线指标;
120天和240天的是长期均线指标,称做年均线指标。
均线计算方法:MA=(C1+C2+C3+...+Cn)/N C:某日收盘价 N:移动平均周期(天数)

3.分析输出所有金叉日期和死叉日期
股票分析技术中的金叉和死叉,可以简单解释为:
分析指标中的两根线,一根为短时间内的指标线,另一根为较长时间的指标线。
如果短时间的指标线方向拐头向上,并且穿过了较长时间的指标线,这种状态叫“金叉”;
如果短时间的指标线方向拐头向下,并且穿过了较长时间的指标线,这种状态叫“死叉”;
一般情况下,出现金叉后,操作趋向买入;死叉则趋向卖出。当然,金叉和死叉只是分析指标之一,要和其他很多指标配合使用,才能增加操作的准确性。

4.如果我从假如我从201011日开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率如何?
分析:
	买卖股票的单价使用开盘价
	买卖股票的时机
	最终手里会有剩余的股票没有卖出去
	会有。如果最后一天为金叉,则买入股票。估量剩余股票的价值计算到总收益。
	剩余股票的单价就是用最后一天的收盘价。
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt

df = ts.get_k_data('000001',start='1990-01-01')
df.head()
df.info()

# 将date作为行索引,使用to_datetime()
df['date'] = pd.to_datetime(df['date'])
# 发现date那行的Dtype由object变为了datetime64
df.info()
# 更改date为行索引
df.set_index('date',inplace=True)
df.head()

# 将字符串改为整型
df['code'] = df['code'].astype('int')
# code已变
df.info()

# 目前数据已经处理好
# 计算该股票历史数据的5日均线和30日均线
ma5 = df['close'].rolling(5).mean()
ma30 = df['close'].rolling(30).mean()
# 为什么前四项为空,因为只有从第五个开始,才有五日均值,正如前29个为空。
# ma5

# 将ma5与ma30的值加入到表中
df['ma5'] = ma5
df['ma30'] = ma30
df.head()

# 将空值对应的行数据删掉,ma30的前29行,基本没影响,可以用切片.
# 此时data为新数据,但是df还是有空的。
data = df[30:]

# 把ma5和ma30的线画出来,取其中100个点
plt.plot(data['ma5'][100:200],label='ma5')
plt.plot(data['ma30'][100:200],label='ma30')
plt.legend()
# ma5和ma30的交叉点就是金叉或者死叉
# 短期均线和长期均线谁更敏感一点?短期均线
# 如果短时间的指标线方向拐头向上,并且穿过了较长时间的指标线,这种状态叫“金叉”;简单来说就是,短期上穿长期
# 如果短时间的指标线方向拐头向下,并且穿过了较长时间的指标线,这种状态叫“死叉”;简单来说就是,短期下穿长期

# 找到data中的金叉和死叉日期,肯定有很多,.shift(1),右移一位
s1 = ma5 > ma30
s2 = ma5 < ma30
s3 = s2.shift(1)

death_cross_time = data.loc[s1&s3].index
golden_cross_time = data.loc[~(s1|s3)].index

# 获取前两个金叉和死叉
# death_cross_time[[1,2]],golden_cross_time[[1,2]]

# 接下来就是实现金叉买,死叉卖

new_df = data['2010':'2020']
new_df

# 获取2010-2020年的金叉和死叉
s1 = ma5 < ma30
s2 = ma5 > ma30
s3 = s2.shift(1)
death_cross_time = new_df.loc[s1&s3].index
golden_cross_time = new_df.loc[~(s1|s3)].index

death_cross_time

first_money = 100000 # 本金
cost_money = 100000  # 流动资金
# 将金叉和死叉的时间全部整合到一个Series中
# 金叉用1表示,死叉用0表示
s1 = pd.Series(data=1,index=golden_cross_time)
s2 = pd.Series(data=0,index=death_cross_time)
# Series级联操作
s = s1.append(s2)

# s按照索引排序,1就买,0就卖
s = s.sort_index()
s

hold = 0 # 持有股票数量
for i in range(len(s)):
    if s[i] == 1:
        date = s.index[i] # 拿到金叉时间,买入
        price = new_df.loc[date]['open'] # 买股票单价,用开盘价
        hand_count = cost_money // (100*price) # 最多买入多少手
        hold = hand_count*100 # 持有股票数量
        cost_money -= hold * price
    else: # 卖股票
        death_time = s.index[i]
        sell_price = new_df.loc[death_time]['open']
        cost_money += (sell_price*hold)
        hold = 0
        
# 考虑是否有股票剩余,看最后一天
last_price = new_df['open'][-1] # 剩余股票的单价
last_money = hold * last_price
print('总收益:',cost_money+last_money-first_money)

总收益: 426296.2999999997

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值