DataFrame案例--双均线策略


一、数据预处理

data = ts.get_k_data('000001',start='1900-01-01')# 平安银行
data

在这里插入图片描述

data.to_csv('./pingan.csv')
df = pd.read_csv('./pingan.csv')
df

在这里插入图片描述

df.drop(labels='Unnamed: 0',axis=1,inplace=True)
df

在这里插入图片描述

df['date'] = pd.to_datetime(df['date'])
df.set_index('date',inplace=True)
df

在这里插入图片描述

df.info()

在这里插入图片描述

  • 股票走势图
    在这里插入图片描述

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

什么是均线?

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

在这里插入图片描述

ma30 =  df['close'].rolling(30).mean()
ma30

在这里插入图片描述

  • rolling函数

rolling函数:可以被Series对象调用,也可以被DataFrame对象调用,这个函数主要是用来做移动计算的。
详解pandas中的rolling

import matplotlib.pyplot as plt
plt.plot(ma5[50:300],label='ma5',c='red')
plt.plot(ma30[50:300],label='ma30',c='blue')
plt.legend() # 使上述代码产生效果

plt.show()

在这里插入图片描述


三、分析输出所有金叉日期和死叉日期

股票分析技术中的金叉和死叉,可以简单解释为:

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

在这里插入图片描述
在这里插入图片描述

df

在这里插入图片描述

# 清除NaN数据
ma5 = ma5[30:]
ma30 = ma30[30:]
df = df[30:]
df

在这里插入图片描述

s1 = ma5 < ma30
s2 = ma5 >= ma30
  • s1
    在这里插入图片描述
  • s2
    在这里插入图片描述
s1&(s2.shift(1))

在这里插入图片描述

# 获得死叉行数据
death_date = df.loc[s1&(s2.shift(1))].index
death_date

在这里插入图片描述

# 获得金叉行数据
golden_date = df.loc[~(s1| (s2.shift(1)))].index
golden_date

在这里插入图片描述


四、数据分析

如果我从假如我从2010年1月1日开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率如何?

  • 分析
  • 买卖股票的单价使用开盘价
  • 买卖股票的时机
  • 最终手里会有剩余的股票没有卖出去
    • 会有。如果最后一天为金叉,则买入股票。估量剩余股票的价值计算到总收益。
      • 剩余股票的单价就是用最后一天的收盘价。
# 创建Series 
# sr1存储的value值为1 索引为金叉日期
# sr2存储的value值为0 索引为死叉日期
sr1 = Series(data=1,index=golden_date)
sr2 = Series(data=0,index=death_date)

# 将sr1和sr2的两个Series中的数据整合到一起
s = sr1.append(sr2) # 合并

# 对s中的索引进行排序
s.sort_index(inplace=True)
s
# 1:金叉时间 -- 买股票  0:死叉时间 -- 卖股票

在这里插入图片描述

s.index

在这里插入图片描述

# 2020 - 2021 之间的金叉和死叉时间
new_s = s['2010':'2021']
new_s
# new_s中有多少个数值为1则表示有多少个金叉,表示买入多少次股票

在这里插入图片描述

# 遍历new_s进行多次的股票的买和卖的操作

first_money = 100000 # 本金 不可变
money = first_money  # 可变钱数,买卖股票从money中进行加减操作
hold = 0 # 持有股票的数量

for i in range(len(new_s)):
    # 买股票
    if new_s[i] == 1: # 金叉,买股票
        # 股票单价
        # new_s.index[i]第一天对应的时间
        price = df.loc[new_s.index[i]]['open'] # 获取开盘价
        # hand 是股票的手数
        hand = money // (price*100)
        hold = hand*100  # 股票股数
        money -= hold * price  # 买股票花的钱从money中减去
    else:# 卖股票
        price = df.loc[new_s.index[i]]['open']
        money += hold * price
        hold = 0 # 清零
        
# 计算剩余股票的实际价值(如何知道是否存有剩余股票:直接看hold)
last_money = hold * df['open'][-1]

# 总收益
print('总收益:',last_money + money - first_money)

总收益: 426732.29999999993


Guess you like

Origin blog.csdn.net/HG0724/article/details/120913101