DataFrame案例--双均线策略
Posted 胜天半月子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于DataFrame案例--双均线策略的主要内容,如果未能解决你的问题,请参考以下文章