使用python和tushare,得到每日上涨家数,当上涨家数小于1700家,买入前3个月内最高点比最低点超过100%的,起始资金1000万,每次最多买5只,从今天开始回测三年,打印出结果和收益曲线
时间: 2024-03-23 11:39:12 浏览: 17
好的,我明白了。为了回答这个问题,我需要先确认您已经安装好了Python和tushare库。
以下是您所需要的代码:
```python
import tushare as ts
import pandas as pd
# 设置tushare token
ts.set_token('YOUR_TOKEN')
# 初始化pro接口
pro = ts.pro_api()
# 获取股票代码
def get_stock_codes():
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code')
return data['ts_code'].tolist()
# 获取最近三个月的股票价格数据
def get_price_data(ts_code):
today = pd.Timestamp.today()
three_months_ago = today - pd.Timedelta(days=90)
data = pro.daily(ts_code=ts_code, start_date=three_months_ago.strftime('%Y%m%d'), end_date=today.strftime('%Y%m%d'))
return data
# 计算股票的涨跌情况
def calculate_change(data):
close = data['close']
pre_close = data['pre_close']
change = close - pre_close
return (change > 0).sum()
# 获取涨跌情况并筛选股票
def get_filtered_stocks():
stock_codes = get_stock_codes()
filtered_stocks = []
for code in stock_codes:
data = get_price_data(code)
if len(data) == 0:
continue
high = data['high'].max()
low = data['low'].min()
if high / low > 2:
change = calculate_change(data)
if change < 1700:
filtered_stocks.append(code)
return filtered_stocks
# 计算买入股票的数量和价格
def calculate_buying(stock_codes, funds):
buying_stocks = []
for code in stock_codes:
data = get_price_data(code)
if len(data) == 0:
continue
close = data.iloc[-1]['close']
volume = funds // (close * 100 * 100)
volume = max(min(volume, 500), 0)
buying_stocks.append((code, volume, close))
return buying_stocks
# 回测函数
def backtest(start_funds, years):
funds = start_funds
portfolio = []
for year in range(years):
print('Year:', year+1)
filtered_stocks = get_filtered_stocks()
buying_stocks = calculate_buying(filtered_stocks, funds)
if len(buying_stocks) == 0:
print('No stocks to buy')
continue
print('Buying stocks:', buying_stocks)
for stock in buying_stocks:
funds -= stock[1] * stock[2] * 100 * 100
portfolio.append((stock[0], stock[1], stock[2]))
if len(portfolio) > 5:
sell = portfolio.pop(0)
funds += sell[1] * stock[2] * 100 * 100
print('Selling stock:', sell)
print('Portfolio:', portfolio)
print('Funds:', funds)
return portfolio, funds
# 运行回测
portfolio, funds = backtest(10000000, 3)
print('Final portfolio:', portfolio)
print('Final funds:', funds)
```
请注意,您需要将代码中的YOUR_TOKEN替换成您自己的tushare token。
代码中的get_stock_codes函数获取所有A股的股票代码列表,然后使用get_price_data函数获取每个股票最近三个月的价格数据。接下来,我们使用calculate_change函数计算每个股票的涨跌情况,并使用get_filtered_stocks函数筛选出符合条件的股票。
接下来,我们使用calculate_buying函数计算每个股票的买入数量和价格。注意,我们每次最多只能买入5只股票。
最后,我们使用backtest函数回测策略。在每一年中,我们首先获取符合条件的股票,然后计算每个股票的买入数量和价格。接下来,我们买入股票并更新我们的投资组合。如果我们的投资组合中已经有5只股票了,我们就需要卖掉其中一只股票,获得资金。最后,我们打印出投资组合和剩余资金。
请注意,代码中只是一个简单的示例,您需要根据自己的需求进行修改和优化。
如果您想打印出收益曲线,可以使用以下代码:
```python
import matplotlib.pyplot as plt
def calculate_portfolio_value(portfolio, funds, data):
value = funds
for stock in portfolio:
code = stock[0]
volume = stock[1]
close = stock[2]
value += volume * close * 100 * 100
return value
def plot_portfolio_value(portfolio, funds):
value_history = []
for year in range(3):
filtered_stocks = get_filtered_stocks()
buying_stocks = calculate_buying(filtered_stocks, funds)
for stock in buying_stocks:
portfolio.append(stock)
if len(portfolio) > 5:
portfolio.pop(0)
funds = calculate_portfolio_value(portfolio, funds, [])
value_history.append(funds)
plt.plot(value_history)
plt.show()
plot_portfolio_value(portfolio, 10000000)
```
这段代码会使用calculate_portfolio_value函数计算投资组合的价值,并使用plot_portfolio_value函数绘制出投资组合的价值随时间的变化。注意,这里的数据是随机生成的,与实际情况可能有所不同。