双均线策略制定,python实现

目录

一、使用tushare包获取某股票的历史行情数据

1.1 获取历史行情数据

1.2 将互联网上获取的股票数据存储到本地

1.3 对读取出来的数据进行相关处理

1.3.1 删除指定列

1.3.2 修改某列的数据类型

 1.3.3 将某列作为行索引

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

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

四、双均值策略的测试


一、使用tushare包获取某股票的历史行情数据

1.1 获取历史行情数据

双均线策略制定,python实现_第1张图片

双均线策略制定,python实现_第2张图片

1.2 将互联网上获取的股票数据存储到本地

双均线策略制定,python实现_第3张图片

1.3 对读取出来的数据进行相关处理

1.3.1 删除指定列

双均线策略制定,python实现_第4张图片

drop()函数里,axis=0表示行,1表示列

1.3.2 修改某列的数据类型

双均线策略制定,python实现_第5张图片

双均线策略制定,python实现_第6张图片

 1.3.3 将某列作为行索引

双均线策略制定,python实现_第7张图片

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

 双均线策略制定,python实现_第8张图片

二、计算该股票历史数据的5日均线和30日均线双均线策略制定,python实现_第9张图片

双均线策略制定,python实现_第10张图片

双均线策略制定,python实现_第11张图片

 切片一下,更清晰地看出两者的对比

# 二、双均线策略制定
# 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()

双均线策略制定,python实现_第12张图片

 双均线策略制定,python实现_第13张图片

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

双均线策略制定,python实现_第14张图片

双均线策略制定,python实现_第15张图片

双均线策略制定,python实现_第16张图片

第一第三个交点为金叉(短线上穿长线),第二个为死叉(短线下穿长线)

获取死叉日期

双均线策略制定,python实现_第17张图片

 获取金叉日期

双均线策略制定,python实现_第18张图片

# 三、分析输出所有金叉日期和死叉日期
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)

双均线策略制定,python实现_第19张图片

 除了用布尔值法外,还有用循环比较的方法,见金融量化-金叉和死叉

另一个老师的方法(视频P78)

双均线策略制定,python实现_第20张图片

四、双均值策略的测试

双均线策略制定,python实现_第21张图片

双均线策略制定,python实现_第22张图片

双均线策略制定,python实现_第23张图片 双均线策略制定,python实现_第24张图片

在聚宽平台做这个策略

双均线策略制定,python实现_第25张图片

双均线策略制定,python实现_第26张图片

回测结果 

双均线策略制定,python实现_第27张图片

# 四、双均值策略的测试
# 设定一个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)

 双均线策略制定,python实现_第28张图片

策略测试结果:采取该双均线策略,从2010年1月1日,到2020年10月20日,投入100000元,可获得利润161938元。

你可能感兴趣的:(python,matplotlib,numpy,pandas,金融)