原创内容第816篇,专注量化投资、个人成长与财富自由。网站上(ailabx.com)有同学公开了年化73%策略,大家可以前往查看。今天咱们来导入duckdb,比csvloader做金融量化效率更高,尤其在是大规模数据的时候,比如,全量股票市场。我把2024年以前的数据作为一部分存量数据,然后2025年的数据增量更新,这样大家不必每次都下载一个大数据包。duckdb是可以跨多个文件夹直接按列读取数据的。
from datetime import datetime
import duckdb
import pandas as pd
class Duckdbloader:
def __init__(self, path, start_date='20100101',
end_date=datetime.now().strftime('%Y%m%d'), folder='/*'):
self.path = path
self.folder = folder
self.start_date = start_date
self.end_date = end_date
def load_data(self, symbols, columns):
columns.extend(['symbol', 'date'])
cols_str = ','.join(columns)
symbols_str = None
if symbols and len(symbols):
symbols = ["'{}'".format(s) for s in symbols]
symbols_str = ",".join(symbols)
query_str = """
select {} from '{}{}/*.csv'
where date >= '{}' and date <= '{}'
""".format(cols_str, self.path, self.folder, self.start_date, self.end_date)
if symbols_str:
query_str += ' and symbol IN ({})'.format(symbols_str)
df = duckdb.query(
query_str
).df()
df['date'] = df['date'].apply(lambda x: str(x))
df.set_index('date', inplace=True)
df.index = pd.to_datetime(df.index)
df.sort_index(inplace=True, ascending=True)
return df
def get_col_df(self,df, col):
if col
not in df.columns:
return None
df_col = df[[col,'symbol']].pivot_table(values=col, index=df.index, columns='symbol')
return df_col
if __name__ == '__main__':
from config import DATA_ETF_QUOTES
loader = Duckdbloader(path=DATA_ETF_QUOTES.resolve())
df = loader.load_data(['510500.SH', '159915.SZ'], ['close', 'adj_factor'])
df_col = loader.get_col_df(df,'close')
print(df_col)
当你一无所有时,仍然一往无前的勇气、执着和锲而不舍。能折磨你的,永远都是你我过于在意的东西,我不在意了,天奈我何,日落归山海,山海藏深意。没有人不遗憾,只有人不喊疼,后来晚风吹人醒,万事藏于心。广泛性的焦虑,其实是一种信号,源自潜意识对于现状不满,未被满足的需求的投射。这里的投射比较随机,激活了杏仁核,展开丰富的联想,捕捉一切的可能。但追逐和解决这些表面问题是意义有限的,因为无穷无尽,水中月,镜中花。潜意识找寻的,是年轻时的梦想,有舞台的中心,是繁华似锦。AI量化实验室 星球,已经运行三年多,1500+会员。
aitrader代码,因子表达式引擎、遗传算法(Deap)因子挖掘引擎等,支持vnpy,qlib,backtrader和bt引擎,内置多个年化30%+的策略,每周五迭代一次,代码和数据在星球全部开源。