目录
一、使用tushare包获取某股票的历史行情数据
1.1 获取历史行情数据
1.2 将互联网上获取的股票数据存储到本地
1.3 对读取出来的数据进行相关处理
1.3.1 删除指定列
drop()函数里,axis=0表示行,1表示列
1.3.2 修改某列的数据类型
1.3.3 将某列作为行索引
import tushare as ts
import pandas as pd
# from pandas import DataFrame,Series
# import numpy as np
# 1.获取某只股票的历史行情数据并进行相关处理
def get_data():
ts.set_token('d3dd39ffaffd456ec466f4e505c34b7bc4de77a9535da37574b78904')
pro = ts.pro_api()
df = pro.daily(ts_code='600519.SH', start_date='20000101') # 获取某只股票的历史行情数据
df.to_csv('./maotai.csv') # 将互联网上获取的股票数据存储到本地
df = pd.read_csv('./maotai.csv') # 将本地存储的数据读入到df
df.drop(labels=['Unnamed: 0','ts_code'],axis=1,inplace=True) # 删除指定列
df['trade_date'] = df['trade_date'].astype('str') # 将数据类型由int转为str
df['trade_date'] = pd.to_datetime(df['trade_date']) # 再转为时间序列类型datetime
df.set_index('trade_date',inplace=True) # 将trade_date列作为行索引
print(df.head()) # head(int)取出前int行,int默认为5
二、计算该股票历史数据的5日均线和30日均线
切片一下,更清晰地看出两者的对比
# 二、双均线策略制定
# 1.使用tushare包获取某股票的历史行情数据
df = pd.read_csv('./maotai.csv') # 将本地存储的数据读入到df
df.drop(labels=['Unnamed: 0','ts_code'],axis=1,inplace=True) # 删除指定列
df['trade_date'] = df['trade_date'].astype('str') # 将数据类型由int转为str
df['trade_date'] = pd.to_datetime(df['trade_date']) # 再转为时间序列类型datetime
df.set_index('trade_date',inplace=True) # 将trade_date列作为行索引
# 2.计算该股票历史数据的5日均线和30日均线
ma5 = df['close'].rolling(5).mean()
ma60 = df['close'].rolling(30).mean()
import matplotlib.pyplot as plt
plt.plot(ma5)
plt.plot(ma30)
plt.show()
三、分析输出所有金叉日期和死叉日期
第一第三个交点为金叉(短线上穿长线),第二个为死叉(短线下穿长线)
获取死叉日期
获取金叉日期
# 三、分析输出所有金叉日期和死叉日期
ma5 = ma5[30:]
ma30 = ma30[30:]
df = df[30:]
s1 = ma5 < ma30
s2 = ma5 > ma30
death_cross = s1 & s2.shift(1) # 判定死叉的条件
death_date = df.loc[death_cross].index # 死叉对应的日期
print("死叉日期为:",death_date)
golden_cross = ~(s1 | s2.shift(1)) # 判定金叉的条件
golden_date = df.loc[golden_cross].index # 金叉对应的日期
print("金叉日期为:",golden_date)
除了用布尔值法外,还有用循环比较的方法,见金融量化-金叉和死叉
另一个老师的方法(视频P78)
四、双均值策略的测试
在聚宽平台做这个策略
回测结果
# 四、双均值策略的测试
# 设定一个Series存储金叉日期和死叉日期
s1 = Series(data=1,index=golden_date) # 1作为金叉的标识
s2 = Series(data=0,index=death_date) # 0作为死叉的标识
# s = s1.append(s2) # FutureWarning: The series.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
s = pd.concat([s1,s2])
s = s.sort_index() # 按时间重新排序
s = s['2010':'2020']
# print(s)
first_money = 100000 # 本金
money = first_money # 当前账户余额
hold = 0 # 持有股票的数量(股数:100股=1手)
for i in range(0,len(s)):
if s[i] == 1: # 若为金叉
date = s.index[i] # 金叉的日期
p = df.loc[date]['open'] # 获得当天的开盘价
hand = money // (p * 100) # 向下取整,获得最大购买数(单位:手)
hold += (hand * 100) # 购买股票
money -= (hand * 100 * p) # 花费的钱
else: # 即为死叉
date = s.index[i] # 死叉的日期
p = df.loc[date]['open'] # 获得当天的开盘价
money += (hold * p) # 卖出持有的全部股票
hold = 0 # 持有数清零
# print(i,hold,money)
# 若最后仍持有股票,计算其价值
hold_value = hold * df['close'][0] # 以最后一天的收盘价作为单价
# 计算总利润
earn = money + hold_value - first_money
print(earn)
策略测试结果:采取该双均线策略,从2010年1月1日,到2020年10月20日,投入100000元,可获得利润161938元。