跳转到根目录:知行合一:投资篇
已完成:
1、投资&技术
1.1.1 投资-编程基础-numpy
1.1.2 投资-编程基础-pandas
1.2 金融数据处理
1.3 金融数据可视化
2、投资方法论
2.1.1 预期年化收益率
2.1.2 一个关于y=ax+b的故事
2.1.3-数据标准化
2.1.4-相关性分析
2.2.1.1-一个关于定投的故(姿)事(势)
2.2.1.3-移动平均线
3、投资实证
[3.1 2023这一年] 被鸽
todo…
文章目录
1. 定义
移动平均线,Moving Average,简称MA,MA是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成一根MA,用以观察证券价格变动趋势的一种技术指标。
2. 目标
- 绘制一个k线图,也就是蜡烛图
- 计算5日均线值、10日均线值
- 在k线图上,绘制5日线和10日线图
- 在5日线上,绘制与10日线的交叉点(上穿、下穿时)
3. 加载数据
这次主要是绘图和数据处理,所以数据就使用现成的csv来做(之前的文章,有专门的数据获取方法,参考:《1.2-金融数据处理》)
import pandas as pd
import ssl # # URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)>
ssl._create_default_https_context = ssl._create_unverified_context
#导入pyecharts
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
df = pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/SH510300.csv", parse_dates=['date'])
df.set_index('date', inplace=True)
解释1:
pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/SH510300.csv", parse_dates=['date'])
是读取一个网络csv文件的内容,并且将其date列转换成日期类型。ssl._create_default_https_context = ssl._create_unverified_context
是解决https访问的时候的报错。
解释2:
df.set_index('date', inplace=True)
是将date列设为索引,并且将其从数据列中移除。移除的意思是,在遍历时,就无法通过df.loc[x, "date"]
这样取到date列的值了。
4. 计算5日线值
这个就比较简单了,直接通过pandas的rolling函数就行
import math
import pandas as pd
import ssl # URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)>
ssl._create_default_https_context = ssl._create_unverified_context
# 导入pyecharts
from pyecharts.charts import *
from pyecharts import options as opts
# 加载数据
df = pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/SH510300.csv", parse_dates=['date'])
df.set_index('date', inplace=True)
# 计算5日线值、10日线值
df['ma5'] = df.close.rolling(5).mean()
df['ma10'] = df.close.rolling(20).mean()
5. 确定买卖点
什么时候买?什么时候卖?
当5日线上穿10日线时,是买点,当5日线下穿10日线时,是卖点。这个很好理解,代码实现在上面的基础上,继续操作:
# 导入数据分析和量化常用库
import math
import pandas as pd
import ssl # URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)>
ssl._create_default_https_context = ssl._create_unverified_context
# 导入pyecharts
from pyecharts.charts import *
from pyecharts import options as opts
# 加载数据
df = pd.read_csv("https://gitee.com/kelvin11/public-resources/raw/master/SH510300.csv", parse_dates=['date'])
df.set_index('date', inplace=True)
# 计算5日线值、10日线值
df['ma5'] = df.close.rolling(5).mean()
df['ma10'] = df.close.rolling(20).mean()
# df['ma20']=df.close.rolling(20).mean()
# df['macd'],df['macdsignal'],df['macdhist']=ta.MACD(df.close,fastperiod=12,slowperiod=26,signalperiod=9)
already_buy = False
# 遍历确定买卖点
for x in df.index:
if df.loc[x, "ma5"] > df.loc[x, "ma10"] and not already_buy:
df.loc[x, "买卖"] = '买'
already_buy = True
if df.loc[x, "ma5"] < df.loc[x, "ma10"] and already_buy:
df.loc[x, "买卖"] = '卖'
already_buy = False
6. 测算收益
如果我们严格按照上穿买入,下穿卖出,不考虑浮盈浮亏的情况下,这个策略,盈利性如何?
我们按照大约10000元作为交易金额,因为每次买入卖出最小的1手是100股,要做向上取整。
这里就只贴测算收益部分的代码:
# 测算收益
money = 10000.0 # 1个w左右的买卖金额
shares = 0 # 买入的股数
buy_price =</