首先我们的目的是让ChatGPT辅助我们写出一个回测框架,要明白我们的输入是什么,我们看一下股票软件的信息(历史成交)
包含几个必要的字段,这一层是需要我们提前准备的
这是任意一个策略或者组合策略必然会再账户上反应的一个客观事实,那么要生成一个回测框架,必然要输入这么一个内容。
其中
date:代表的是日期
minutes:代表的是开盘至今的分钟数
price:代表成交的价格
action:代表买卖的标识
----------------要让GPT帮我们写---------------
这是需要对GPT输入的一段你的要求,注意这里的要求,你可以简单一点,因为你是小白,你也不知道他能给你干啥。所以,只要把你最原始相想干的事情告诉他。
我希望他可以只买三个股票。
他也有理解不到位的时候,因为我给他的示例,只有包含了买入,所以他不能理解我要求他做的,没有关系,他要是还是不理解,你可以直接给他完整的示例
这么做的好处是什么,你不需要再跟他阐述你的输入是什么,而是让他来理解你,你需要他做什么!
import pandas as pd
class Backtester:
def __init__(self, csv_file, initial_cash=100000, max_stocks=3, position_size=0.1):
self.df = pd.read_csv(csv_file)
self.df['date'] = pd.to_datetime(self.df['date'], format='%Y%m%d')
self.df = self.df.sort_values(['date', 'minutes'])
self.initial_cash = initial_cash
self.cash = initial_cash
self.max_stocks = max_stocks
self.position_size = position_size
self.portfolio = {}
self.portfolio_value = []
self.last_bought = {}
self.transaction_records = []
def calculate_portfolio_value(self):
return self.cash + sum([quantity * price for stock, (quantity, price) in self.portfolio.items()])
def run(self):
for i, row in self.df.iterrows():
stock_code = row['stock_code']
action = row['action'] # 买卖标识,假设'buy'代表买入,'sell'代表卖出
price = row['price']
date = row['date']
if action == 'buy':
if len(self.portfolio) < self.max_stocks: # 如果当前持仓股票少于max_stocks只
if stock_code not in self.portfolio:
quantity = self.position_size * self.initial_cash / price # 计算可以购买的股票数量
if self.cash >= quantity * price: # 检查是否有足够的现金购买
self.portfolio[stock_code] = (quantity, price) # 买入股票
self.cash -= quantity * price
self.last_bought[stock_code] = date # 记录买入日期
self.transaction_records.append((date, 'buy', stock_code, price, quantity)) # 记录交易
elif action == 'sell':
if stock_code in self.portfolio and self.last_bought[stock_code] != date: # 同一天不能卖出
quantity, _ = self.portfolio[stock_code]
self.cash += quantity * price # 卖出股票并将卖出的现金加回
del self.portfolio[stock_code]
self.transaction_records.append((date, 'sell', stock_code, price, quantity)) # 记录交易
self.portfolio_value.append(self.calculate_portfolio_value())
return self.portfolio, self.portfolio_value, self.transaction_records
# 使用示例
backtester = Backtester('your_file.csv', initial_cash=100000, max_stocks=3, position_size=0.1)
portfolio, portfolio_value, transaction_records = backtester.run()
print('Current Portfolio:')
print(portfolio)
print('Historical Portfolio Value:')
print(portfolio_value)
print('Transaction Records:')
for record in transaction_records:
print(record)
-------------验证一下---------
可以将代码复制进mindgo跑一下,我们来验证一下代码是否按照我们要求执行了。
我故意造了两条数据,卖出在买入之前,最终程序自动输出了当日的持仓。
这个程序还有很多要完善的地方,比如,A股只允许买整数股,我们可以不断通过交互使它可以完整的满足我们的要求。
这个时候另一个问题也出现了,因为股价过大,导致买入股数为0,所以还需要对回测框架进行修正
GPT就是这么简单能把我们的回测框架搭好,并输出交易曲线。
前面,我们借助算法,把策略的生成做了一次抽象
现在,我们基于输出的信号表,又把回测框架做了一次定义
剩下的,我们只需要把我们分享的竞价策略,进行一次数据处理,就能开始使用这个回测框架来看具体策略的效果了。
希望这个系列的分享对大家学习量化投资有帮助。
更新时间:每周1-5,早上8点,节假日不更
联系客服