This commit is contained in:
2025-12-20 12:04:03 +02:00
parent 6f3aa9b1ec
commit f4a36b249c
3 changed files with 166 additions and 44 deletions
Generated
+115 -1
View File
@@ -34,10 +34,78 @@
"type": "github"
}
},
"pyproject-build-systems": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"pyproject-nix": [
"pyproject-nix"
],
"uv2nix": "uv2nix"
},
"locked": {
"lastModified": 1776659114,
"narHash": "sha256-qapCOQmR++yZSY43dzrp3wCrkOTLpod+ONtJWBk6iKU=",
"owner": "pyproject-nix",
"repo": "build-system-pkgs",
"rev": "ffaa2161dd5d63e0e94591f86b54fc239660fb2e",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "build-system-pkgs",
"type": "github"
}
},
"pyproject-nix": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1776715674,
"narHash": "sha256-Gs1VnEkCkkRZxJQAC/Dhz0Jbfi22mFXChbtNg9w/Ybg=",
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"rev": "69f57f27e52a87c54e28138a75ec741cd46663c9",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"type": "github"
}
},
"pyproject-nix_2": {
"inputs": {
"nixpkgs": [
"uv2nix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1776715674,
"narHash": "sha256-Gs1VnEkCkkRZxJQAC/Dhz0Jbfi22mFXChbtNg9w/Ybg=",
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"rev": "69f57f27e52a87c54e28138a75ec741cd46663c9",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
"nixpkgs": "nixpkgs",
"pyproject-build-systems": "pyproject-build-systems",
"pyproject-nix": "pyproject-nix",
"uv2nix": "uv2nix_2"
}
},
"systems": {
@@ -54,6 +122,52 @@
"repo": "default",
"type": "github"
}
},
"uv2nix": {
"inputs": {
"nixpkgs": [
"pyproject-build-systems",
"nixpkgs"
],
"pyproject-nix": [
"pyproject-build-systems",
"pyproject-nix"
]
},
"locked": {
"lastModified": 1776317509,
"narHash": "sha256-nSriomT9IJvyVY/mzyFz4Un6DHSjCfrVitcIfV+VHnY=",
"owner": "pyproject-nix",
"repo": "uv2nix",
"rev": "56cfeb9813150e1f900f13e4d6fe46e2845f82d5",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "uv2nix",
"type": "github"
}
},
"uv2nix_2": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"pyproject-nix": "pyproject-nix_2"
},
"locked": {
"lastModified": 1777895960,
"narHash": "sha256-KebDsQd+A7pm++Tp0744EjULttHvz1wbKqNKkMA/088=",
"owner": "pyproject-nix",
"repo": "uv2nix",
"rev": "5ad90d48b80ecc920ca2247d53f46beba302e186",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "uv2nix",
"type": "github"
}
}
},
"root": "root",
+45 -43
View File
@@ -1,65 +1,67 @@
{
description = "Event-driven backtesting engine";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
uv2nix.url = "github:pyproject-nix/uv2nix";
uv2nix.inputs.nixpkgs.follows = "nixpkgs";
pyproject-nix.url = "github:pyproject-nix/pyproject.nix";
pyproject-nix.inputs.nixpkgs.follows = "nixpkgs";
pyproject-build-systems.url = "github:pyproject-nix/build-system-pkgs";
pyproject-build-systems.inputs.pyproject-nix.follows = "pyproject-nix";
pyproject-build-systems.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = {
self,
nixpkgs,
flake-utils,
uv2nix,
pyproject-nix,
pyproject-build-systems,
}:
flake-utils.lib.eachDefaultSystem (system: let
pkgs = nixpkgs.legacyPackages.${system};
lib = nixpkgs.lib;
python = pkgs.python312;
pythonEnv = python.withPackages (ps:
with ps; [
numpy
pandas
matplotlib
yfinance
# dev
ruff
streamlit
plotly
]);
in {
devShells.default = pkgs.mkShell {
packages = [
pythonEnv
pkgs.uv
pkgs.just
pkgs.ruff
];
workspace = uv2nix.lib.workspace.loadWorkspace {workspaceRoot = ./.;};
overlay = workspace.mkPyprojectOverlay {sourcePreference = "wheel";};
pythonSet = (pkgs.callPackage pyproject-nix.build.packages {inherit python;}).overrideScope (
lib.composeManyExtensions [
pyproject-build-systems.overlays.default
overlay
]
);
venv = pythonSet.mkVirtualEnv "backtest-env" workspace.deps.default;
in {
packages.default = pkgs.stdenv.mkDerivation {
pname = "backtest";
version = "0.1.0";
src = ./.;
installPhase = ''
mkdir -p $out/bin $out/lib
cp -r . $out/lib/
cat > $out/bin/backtest << EOF
#!/bin/sh
export PATH="${venv}/bin:\$PATH"
cd $out/lib
exec ${venv}/bin/streamlit run $out/lib/app.py \
--browser.gatherUsageStats=false \
--server.fileWatcherType=none \
"\$@"
EOF
chmod +x $out/bin/backtest
'';
};
devShells.default = pkgs.mkShell {
packages = [pkgs.uv pkgs.just pkgs.ruff venv];
shellHook = ''
echo "backtest dev shell — python $(python --version)"
echo "backtest dev shell"
'';
};
packages.default = pkgs.stdenv.mkDerivation {
pname = "backtest";
version = "0.1.0";
src = ./.;
nativeBuildInputs = [ pkgs.makeWrapper ];
buildInputs = [ pythonEnv ];
installPhase = ''
mkdir -p $out/bin $out/lib
cp -r . $out/lib/
cat > $out/bin/backtest << EOF
#!/bin/sh
export PATH="${pythonEnv}/bin:\$PATH"
cd $out/lib
exec ${pythonEnv}/bin/streamlit run $out/lib/app.py \
--browser.gatherUsageStats=false \
--server.fileWatcherType=none \
"\$@"
EOF
chmod +x $out/bin/backtest
'';
};
});
}
+6
View File
@@ -12,3 +12,9 @@ dependencies = [
"streamlit>=1.56.0",
"yfinance>=1.2.1",
]
[tool.uv.extra-build-dependencies]
multitasking = ["setuptools"]
[tool.setuptools]
packages = []