使用python和tushare,取任意一天,如果当日上涨家数小于1700家,当日为基准的前3个月内最高点比最低点超过100%的,起始资金1000万,每次最多买5只,从今天开始回测三年,打印出结果和收益曲线
时间: 2024-03-23 17:39:38 浏览: 27
好的,我已经理解您的问题。以下是我提供的代码:
```python
import tushare as ts
import datetime
# 设置token
ts.set_token('YOUR_TOKEN')
# 初始化pro接口
pro = ts.pro_api()
# 获取三年前的日期
start_date = (datetime.datetime.now() - datetime.timedelta(days=3*365)).strftime('%Y%m%d')
# 获取所有股票代码
stock_codes = pro.stock_basic(exchange='', list_status='L', fields='ts_code')['ts_code'].tolist()
# 初始化资金和股票持仓
init_cash = 10000000
hold_stocks = {}
# 获取指定日期的上涨个数和股票涨跌幅
def get_daily_data(date):
daily_data = pro.daily(trade_date=date)
daily_data = daily_data[daily_data['ts_code'].isin(stock_codes)]
daily_data['pct_change'] = daily_data['close'] / daily_data['pre_close'] - 1
up_stocks = daily_data[daily_data['pct_change'] > 0]['ts_code'].tolist()
up_count = len(up_stocks)
return up_count, daily_data.set_index('ts_code')['pct_change']
# 获取最近三个月的最高价和最低价
def get_high_low_data(date):
start_date = (datetime.datetime.strptime(date, '%Y%m%d') - datetime.timedelta(days=90)).strftime('%Y%m%d')
end_date = date
data = pro.daily(ts_code='', start_date=start_date, end_date=end_date)
data = data[data['ts_code'].isin(hold_stocks.keys())]
data = data.groupby('ts_code')['high', 'low'].agg({'high': 'max', 'low': 'min'})
data['pct_change'] = data['high'] / data['low'] - 1
return data
# 买入股票
def buy_stocks(date, cash, up_stocks):
buy_count = min(len(up_stocks), 5)
buy_cash = cash / buy_count
for stock in up_stocks[:buy_count]:
hold_stocks[stock] = buy_cash
# 卖出股票
def sell_stocks(date, daily_data):
for stock, hold_cash in hold_stocks.items():
if stock not in daily_data.index or daily_data.loc[stock, 'pct_change'] < -0.10:
cash = hold_cash + hold_cash * daily_data.get(stock, 0)
init_cash += cash
del hold_stocks[stock]
# 回测代码
def backtest(start_date):
cash = init_cash
dates = pro.trade_cal(start_date=start_date, end_date='', is_open='1')['cal_date'].tolist()
for date in dates:
up_count, daily_data = get_daily_data(date)
if up_count < 1700:
high_low_data = get_high_low_data(date)
high_low_data = high_low_data[high_low_data['pct_change'] > 1]
if not high_low_data.empty:
buy_stocks(date, cash, high_low_data.index.tolist())
cash = cash - len(hold_stocks) * (cash / 5)
else:
sell_stocks(date, daily_data)
cash = init_cash + sum(hold_stocks.values())
final_cash = init_cash + sum(hold_stocks.values())
return final_cash
# 打印结果
result = backtest(start_date)
print('最终收益:', result)
```
请注意,由于tushare接口的限制,对于三年内的历史数据,我们需要从今天开始逐个日期向前回测。因此,在上面的代码中,我使用了`tushare`的`trade_cal`接口获取所有交易日历,并逐一进行回测。这可能需要一些时间来完成。如果您需要更快的回测速度,建议使用其他数据源并进行优化。