双均线策略制定,python实现

该文详细介绍了如何利用tusharePython库获取股票历史数据,存储到本地,处理数据包括删除和转换列,然后计算5日和30日均线。接着,文章讨论了如何识别金叉和死叉事件,并基于这些信息测试双均值交易策略,展示了一种金融量化的方法。
摘要由CSDN通过智能技术生成

目录

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

1.1 获取历史行情数据

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

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

1.3.1 删除指定列

1.3.2 修改某列的数据类型

 1.3.3 将某列作为行索引

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

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

四、双均值策略的测试


一、使用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元。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值