首页 > 其他分享 >金融量化项目案例 -- 双均线策略制定

金融量化项目案例 -- 双均线策略制定

时间:2023-10-01 11:11:07浏览次数:35  
标签:death date 案例 -- money df 股票 金叉 量化

博客地址:https://www.cnblogs.com/zylyehuo/

开发环境

  • anaconda
    • 集成环境:集成好了数据分析和机器学习中所需要的全部环境
    • 安装目录不可以有中文和特殊符号
  • jupyter
    • anaconda提供的一个基于浏览器的可视化开发工具

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

!pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tushare
import tushare as ts
import pandas as pd
from pandas import DataFrame,Series
import numpy as np
df = pd.read_csv('./maotai.csv').drop(labels='Unnamed: 0',axis=1)
df

# 将date列转为时间序列且将其作为源数据的行索引
df['date'] = pd.to_datetime(df['date'])
df.set_index('date',inplace=True)
df.head()

计算该股票历史数据的5日均线和60日均线

  • 什么是均线?
    • 对于每一个交易日,都可以计算出前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()
ma30 = df['close'].rolling(30).mean()
ma5
date
2001-08-27         NaN
2001-08-28         NaN
2001-08-29         NaN
2001-08-30         NaN
2001-08-31    -162.504
                ...   
2023-09-22    1825.506
2023-09-25    1826.142
2023-09-26    1823.954
2023-09-27    1821.954
2023-09-28    1821.986
Name: close, Length: 5289, dtype: float64

可视化历史数据的收盘价和两条均线

import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(ma5[50:180])
plt.plot(ma30[50:180])

[<matplotlib.lines.Line2D at 0x1f3c9adc610>]

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

  • 股票分析技术中的金叉和死叉,可以简单解释为:
    • 分析指标中的两根线,一根为短时间内的指标线,另一根为较长时间的指标线。
    • 如果短时间的指标线方向拐头向上,并且穿过了较长时间的指标线,这种状态叫“金叉”;
    • 如果短时间的指标线方向拐头向下,并且穿过了较长时间的指标线,这种状态叫“死叉”;
    • 一般情况下,出现金叉后,操作趋向买入;死叉则趋向卖出。当然,金叉和死叉只是分析指标之一,要和其他很多指标配合使用,才能增加操作的准确性。
ma5 = ma5[30:]
ma30 = ma30[30:]
s1 = ma5 < ma30
s2 = ma5 > ma30
df = df[30:]
death_ex = s1 & s2.shift(1) #判定死叉的条件
df.loc[death_ex] #死叉对应的行数据
death_date = df.loc[death_ex].index
golden_ex = ~(s1 | s2.shift(1))#判定金叉的条件
golden_date = df.loc[golden_ex].index #金叉的时间

需求

​============================================
如果我从假如我从2010年1月1日开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率如何?
============================================
  • 分析:
    • 买卖股票的单价使用开盘价
    • 买卖股票的时机
    • 最终手里会有剩余的股票没有卖出去
      • 会有。如果最后一天为金叉,则买入股票。估量剩余股票的价值计算到总收益。
        • 剩余股票的单价就是用最后一天的收盘价。
s1 = Series(data=1,index=golden_date)  # 1作为金叉的标识
s2 = Series(data=0,index=death_date)  # 0作为死叉的标识

s = s1.append(s2)
s = s.sort_index()  # 存储的是金叉和死叉对应的时间
s = s['2010':'2020']  # 存储的是金叉和死叉对应的时间
first_money = 100000  # 本金,不变
money = first_money  # 可变的,买股票话的钱和卖股票收入的钱都从该变量中进行操作
hold = 0  # 持有股票的数量(股数:100股=1手)

for i in range(0,len(s)):  # i表示的s这个Series中的隐式索引
    # i = 0(死叉:卖) = 1(金叉:买)
    if s[i] == 1:  # 金叉的时间
        # 基于100000的本金尽可能多的去买入股票
        # 获取股票的单价(金叉时间对应的行数据中的开盘价)
        time = s.index[i]  # 金叉的时间
        p = df.loc[time]['open']  # 股票的单价
        hand_count = money // (p*100)  # 使用100000最多买入多少手股票
        hold = hand_count * 100         
        money -= (hold * p)  # 将买股票话的钱从money中减去
    else:
        # 将买入的股票卖出去        
        # 找出卖出股票的单价
        death_time = s.index[i]
        p_death = df.loc[death_time]['open']  # 卖股票的单价
        money += (p_death * hold)  # 卖出的股票收入加入到money
        hold = 0

# 如何判定最后一天为金叉还是死叉
last_money = hold * df['close'][-1] #剩余股票的价值

# 总收益
money + last_money - first_money
-22684925.799999997

标签:death,date,案例,--,money,df,股票,金叉,量化
From: https://www.cnblogs.com/zylyehuo/p/17738621.html

相关文章

  • 消息的消费组配置、堆积总结
    一、AzureEventHub1.1、消费客户端负载均衡引用包:Azure.Messaging.EventHubs;EventHubConsumerClient简单消费;不能持久化保存所有权\检查点,做负载均衡;需要自定义实现EventProcessor<TPartition>,如通过Redis实现所有权获取\设置、检查点获取\设置。参考文档:https://devblogs.mi......
  • MSF恶意程序利用【实战】
    ★关于道德伦理的忠告★关于一些网络安全实战内容,我还是不厌其烦的写上这些忠告,请见谅。以下内容摘自《Metasploit渗透测试指南》作为一名渗透测试者,我们可以击败安全防御机制,但这是仅仅是我们工作的一部分。当你进行渗透攻击时,请记住如下的忠告:不要进行恶意的攻击;不要......
  • 搜索优化
    一、什么是剪枝     首先应当明确的是,“剪枝”的含义是什么。我们知道,搜索的进程可以看作是从树根出发,遍历一棵倒置的树——搜索树的过程。而所谓剪枝,顾名思义,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。我们在编写搜......
  • TypeError: unsupported operand type(s) for |: 'type' and 'NoneType' [duplicate]
      str|Nonesyntaxisonlysupportedin3.10orlater.UsefromtypingimportOptionalname:Optional[str]=NoneForcaseswheretherighthandsideisn'tNoneortherearemorethantwotypes,youcanuseUnionfromtypingimportUnionfoo:U......
  • 无限的技能
    要求:如果心中有目标,就能立即将新学到的技能付诸应用,课程开始正是草拟目标的大好时机。将想法记录下来是学习的好习惯,这样每当需要开始新项目时(大创,竞赛,毕业设计等)都可参考它们。如果你有无穷多种编程技能,密码技术,硬件设计技术,你打算开发什么样的密码系统或密码应用呢?现在......
  • 学习笔记4
    教材7、8章知识点文件操作级别:硬件级别操作系统内核中的文件系统函数系统调用I/O库函数用户命令sh脚本文件I/O操作:打开文件:使用open系统调用打开文件,并返回文件描述符。关闭文件:使用close系统调用关闭文件描述符。读取文件:使用read系统调用从文件中读取数据。......
  • E - Product Development
    E-ProductDevelopment一眼看上去,选与不选,很像01背包问题,很显然当k=1时就是01背包那我们可以想到设置dp[i],表示目标为i时所要花费的最小代价,直接套用01背包模板但是题目写道要满足多个k值,也就是多个背包问题,那该怎么办但是我们可以看到,p<=5,小于10进制每一位的9那么我们可......
  • 学习笔记4
    知识点归纳文件I/O操作是指对文件的输入和输出操作。文件输入操作可以读取一个文件的内容,以便后续的处理。常见的文件输入操作包括读取文本文件的内容、读取二进制文件的内容等。文件输出操作可以将处理结果写入到一个文件中。这可以包括将数据写入文本文件、将数据以二进制形......
  • 第四周学习笔记
    1.文件操作硬件级别fdisk:将硬盘、U盘或SDC盘分区。mkfs:格式化磁盘分区,为系统做好准备。fsck:检查和维修系统。碎片整理:压缩文件系统中的文件。操作系统中的文件系统函数#前缀k表示内核函数kmount(),kumount() (mount/umountfilesystems)kmkdir(),krmdir() (make/remo......
  • SSM(Spring+SpringMVC+MyBatis)框架集成
    引言进行SSM(Spring+SpringMVC+MyBatis)集成的主要原因是为了提高开发效率和代码可维护性。SSM是一套非常流行的JavaWeb开发框架,它集成了Spring框架、SpringMVC框架和MyBatis框架,各自发挥优势,形成了一个完整的开发框架。首先,使用Spring框架可以实现组件的解耦和依赖注入,通过配置......