假如我从2010年1月1日开始,初始资金为100000元, 金叉尽量买入,死叉全部卖出,则到今天为止,用python计算收益 不使用talib模块 并画出收益曲线图和ma5和ma10曲线
时间: 2024-03-23 07:35:56 浏览: 82
使用python进行金融分析
好的,这是一个比较具体的问题,需要用到一些股票分析的基本知识和Python编程技能。以下是一个可能的解决方案,供参考:
1. 获取股票数据
首先,我们需要从网络上获取股票的历史数据,可以使用pandas-datareader库中的DataReader函数来获取。假设我们要获取的股票是上证指数(000001.SS),代码如下:
```python
import pandas_datareader.data as web
import datetime
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime.now()
df = web.DataReader("000001.SS", "yahoo", start, end)
```
2. 计算移动平均线
接下来,我们需要计算ma5和ma10的值。这里我们可以使用pandas中的rolling函数来计算移动平均线。代码如下:
```python
df["ma5"] = df["Close"].rolling(5).mean()
df["ma10"] = df["Close"].rolling(10).mean()
```
3. 计算买卖信号
根据金叉和死叉的定义,我们可以编写如下代码来计算买卖信号:
```python
df["signal"] = 0
df["short_ma"] = df["ma5"]
df["long_ma"] = df["ma10"]
df.loc[df["short_ma"] > df["long_ma"], "signal"] = 1
df.loc[df["short_ma"] < df["long_ma"], "signal"] = -1
```
这里我们将signal列初始化为0,表示无信号;short_ma和long_ma列分别表示短期和长期移动平均线。当短期移动平均线上穿长期移动平均线时,我们认为出现金叉,signal值为1;当短期移动平均线下穿长期移动平均线时,我们认为出现死叉,signal值为-1。
4. 计算收益
根据买卖信号,我们可以编写如下代码来计算收益:
```python
df["profit"] = 0
buy_price = 0
for i in range(len(df)):
if df["signal"][i] == 1 and buy_price == 0:
buy_price = df["Close"][i]
elif df["signal"][i] == -1 and buy_price != 0:
sell_price = df["Close"][i]
df["profit"][i] = sell_price / buy_price - 1
buy_price = 0
df["cum_profit"] = (1 + df["profit"]).cumprod() * 100000
```
这里我们使用了一个循环来计算每次买入和卖出的收益。当出现金叉时,我们记录买入价格;当出现死叉时,我们记录卖出价格,并根据买入价格和卖出价格计算收益。累积收益可以通过cumprod函数计算得到。
5. 绘制收益曲线图和ma5和ma10曲线
最后,我们可以使用matplotlib库来绘制收益曲线图和ma5和ma10曲线。代码如下:
```python
import matplotlib.pyplot as plt
plt.figure(figsize=(16, 8))
plt.plot(df.index, df["cum_profit"], label="cumulative profit")
plt.plot(df.index, df["ma5"], label="ma5")
plt.plot(df.index, df["ma10"], label="ma10")
plt.legend()
plt.show()
```
这里我们先创建一个16x8的画布,然后使用plot函数分别绘制累积收益、ma5和ma10曲线,并使用legend函数添加图例,最后使用show函数显示图像。
阅读全文