量化交易之双均线策略分析(Python)

博客围绕Python实例展开,主要目标是完成一些策略。包括获取数据并计算5日均线和60日均线,绘制历史数据收盘价与两条均线,计算金叉和死叉日期等,涉及机器学习相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

了解一些概念:

 

本期要完成的一些策略目标:

 Python实例分析:

1:获取数据,并计算5日均线和60日均线

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tushare as ts

df = pd.read_csv("C:\\Users\\Administrator\\Desktop\\数据挖掘项目\\金融数据量化交易\\601318.csv",
                 index_col="date", parse_dates=["date"])[['open', 'close', 'high', 'low']]
df['ma5'] = np.nan
df['ma30'] = np.nan
#for i in range(4, len(df)):
 #   df.loc[df.index[i], 'ma5'] = df['close'][i-4:i+1].mean()  # 求5日均线

#for i in range(29, len(df)):
 #   df.loc[df.index[i], 'ma30'] = df['close'][i-29:i+1].mean()  # 求30日均线

df['ma5'] = df['open'].rolling(5).mean()  # 求5日均线
df['ma30'] = df['open'].rolling(30).mean()  # 求30日均线

print(df)

 2:绘制历史数据的收盘价和两条均线

#df = df[:2000]
df[['close', 'ma5', 'ma30']].plot()  # 绘图
plt.show()

 

 3:计算所有的金叉和死叉日期

# 计算所有金叉日期和死叉日期
# df = df.dropna()
# golden_cross = []
# death_cross = []
# for i in range(1, len(df)):
#     if df['ma5'][i] > df['ma30'][i] and df['ma5'][i-1] < df['ma30'][i-1]:
#         golden_cross.append(df.index[i])
#
#     if df['ma5'][i] < df['ma30'][i] and df['ma5'][i-1] > df['ma30'][i-1]:
#         death_cross.append(df.index[i])
#
# print(golden_cross)
# print(death_cross)

sr1 = df['ma5'] < df['ma30']  # # 比较的结果是返回的是布尔值 sr1来接受
sr2 = df['ma5'] > df['ma30']
death_cross = df[sr1 & sr2.shift(1)].index  # 死叉日 &:两个为真才为真
print(death_cross)
golden_cross = df[~(sr1 | sr2.shift(1))].index  # 金叉日 &:两个为假才为假  比较运算符
print(golden_cross)

 4:完成以下策略:

 

 

first_money = 100000
money = first_money  # 本金
hold = 0  # 持有多少股
sr1 = pd.Series(1, index=golden_cross)
print(sr1)
sr2 = pd.Series(0, index=death_cross)
sr = sr1.append(sr2).sort_index()  # 合并且索引重新排序

for i in range(0, len(sr)):
    p = df['open'][sr.index[i]]  # p为金叉日或死叉日的开盘价格
    if sr.iloc[i] == 1:
        # 金叉
        buy = (money // (100*p))  # 买多少手,一手一百股
        hold += buy*100
        money -= buy*100*p
    else:  # 死叉
        money += hold*p
        hold = 0

p = df['open'][-1]  # 最后一天的开盘价
now_money = hold*p + money

print(now_money-first_money)  # 599997.9

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值