feat: Added Kalshi
Also some fixes, and I think some functionality to get randomly selected forecasts
This commit is contained in:
parent
216be068a9
commit
6833849fa6
107272
metaforecasts.json
Normal file
107272
metaforecasts.json
Normal file
File diff suppressed because one or more lines are too long
|
@ -12,6 +12,7 @@ import {foretold} from "./platforms/foretold-fetch.js"
|
||||||
import {goodjudgment} from "./platforms/goodjudgment-fetch.js"
|
import {goodjudgment} from "./platforms/goodjudgment-fetch.js"
|
||||||
import {goodjudgmentopen} from "./platforms/goodjudmentopen-fetch.js"
|
import {goodjudgmentopen} from "./platforms/goodjudmentopen-fetch.js"
|
||||||
import {hypermind} from "./platforms/hypermind-fetch.js"
|
import {hypermind} from "./platforms/hypermind-fetch.js"
|
||||||
|
import {kalshi} from "./platforms/kalshi-fetch.js"
|
||||||
import {ladbrokes} from "./platforms/ladbrokes-fetch.js"
|
import {ladbrokes} from "./platforms/ladbrokes-fetch.js"
|
||||||
import {metaculus} from "./platforms/metaculus-fetch.js"
|
import {metaculus} from "./platforms/metaculus-fetch.js"
|
||||||
import {omen} from "./platforms/omen-fetch.js"
|
import {omen} from "./platforms/omen-fetch.js"
|
||||||
|
@ -26,7 +27,7 @@ import {rebuildNetlifySiteWithNewData} from "./utils/rebuildNetliftySiteWithNewD
|
||||||
import {doEverything, tryCatchTryAgain} from "./utils/doEverything.js"
|
import {doEverything, tryCatchTryAgain} from "./utils/doEverything.js"
|
||||||
|
|
||||||
/* Support functions */
|
/* Support functions */
|
||||||
let functions = [astralcodexten, coupcast, csetforetell, elicit, /* estimize, */ fantasyscotus, foretold, goodjudgment, goodjudgmentopen, hypermind, ladbrokes, metaculus, omen, polymarket, predictit, rootclaim, smarkets, williamhill, mergeEverything, updateHistory, rebuildNetlifySiteWithNewData, doEverything]
|
let functions = [astralcodexten, coupcast, csetforetell, elicit, /* estimize, */ fantasyscotus, foretold, goodjudgment, goodjudgmentopen, hypermind, kalshi, ladbrokes, metaculus, omen, polymarket, predictit, rootclaim, smarkets, williamhill, mergeEverything, updateHistory, rebuildNetlifySiteWithNewData, doEverything]
|
||||||
let functionNames = functions.map(fun => fun.name)
|
let functionNames = functions.map(fun => fun.name)
|
||||||
|
|
||||||
let whattodoMessage = functionNames
|
let whattodoMessage = functionNames
|
||||||
|
|
70
src/platforms/kalshi-fetch.js
Normal file
70
src/platforms/kalshi-fetch.js
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
/* Imports */
|
||||||
|
import fs from 'fs'
|
||||||
|
import axios from "axios"
|
||||||
|
import { calculateStars } from "../utils/stars.js"
|
||||||
|
import {upsert} from "../utils/mongo-wrapper.js"
|
||||||
|
|
||||||
|
/* Definitions */
|
||||||
|
let jsonEndpoint = "https://trading-api.kalshi.com/v1/cached/markets/"//"https://subgraph-matic.poly.market/subgraphs/name/TokenUnion/polymarket"//"https://subgraph-backup.poly.market/subgraphs/name/TokenUnion/polymarket"//'https://subgraph-matic.poly.market/subgraphs/name/TokenUnion/polymarket3'
|
||||||
|
|
||||||
|
/* Support functions
|
||||||
|
async function fetchAllContractInfo(){ // for info which the polymarket graphql API
|
||||||
|
let data = fs.readFileSync("./data/polymarket-contract-list.json")
|
||||||
|
let response = JSON.parse(data)
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
async function fetchAllMarkets() { // for info which the polymarket graphql API
|
||||||
|
let response = await axios.get('https://trading-api.kalshi.com/v1/cached/markets/').then(response => response.data.markets)
|
||||||
|
// console.log(response)
|
||||||
|
return response
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async function processMarkets(markets) {
|
||||||
|
let results = await markets.map(market => {
|
||||||
|
let probability = market.last_price/100
|
||||||
|
let options = [
|
||||||
|
{
|
||||||
|
"name": "Yes",
|
||||||
|
"probability": probability,
|
||||||
|
"type": "PROBABILITY"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "No",
|
||||||
|
"probability": 1 - probability,
|
||||||
|
"type": "PROBABILITY"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
let result = ({
|
||||||
|
"title": market.title,
|
||||||
|
"url": `https://kalshi.com`,
|
||||||
|
"platform": "Kalshi",
|
||||||
|
"description": `${market.settle_details}. The resolution source is: ${market.ranged_group_name} (${market.settle_source_url})`,
|
||||||
|
"options": options,
|
||||||
|
"timestamp": new Date().toISOString(),
|
||||||
|
"qualityindicators": {
|
||||||
|
"stars": calculateStars("Kalshi", ({volume: market.volume, interest: market.open_interest})),
|
||||||
|
"yes_bid": market.yes_bid,
|
||||||
|
"yes_ask": market.yes_ask,
|
||||||
|
"spread": Math.abs(market.yes_bid-market.yes_ask),
|
||||||
|
"volume": market.volume,
|
||||||
|
"open_interest": market.open_interest
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return result
|
||||||
|
})
|
||||||
|
return results //resultsProcessed
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Body */
|
||||||
|
export async function kalshi() {
|
||||||
|
let markets = await fetchAllMarkets()
|
||||||
|
let results = await processMarkets(markets) // somehow needed
|
||||||
|
// console.log(results)
|
||||||
|
// let string = JSON.stringify(results, null, 2)
|
||||||
|
// fs.writeFileSync('polymarket-questions.json', string);
|
||||||
|
await upsert(results, "kalshi-questions")
|
||||||
|
console.log("Done")
|
||||||
|
}
|
||||||
|
// kalshi()
|
|
@ -8,6 +8,7 @@ import {foretold} from "../platforms/foretold-fetch.js"
|
||||||
import {goodjudgment} from "../platforms/goodjudgment-fetch.js"
|
import {goodjudgment} from "../platforms/goodjudgment-fetch.js"
|
||||||
import {goodjudgmentopen} from "../platforms/goodjudmentopen-fetch.js"
|
import {goodjudgmentopen} from "../platforms/goodjudmentopen-fetch.js"
|
||||||
import {hypermind} from "../platforms/hypermind-fetch.js"
|
import {hypermind} from "../platforms/hypermind-fetch.js"
|
||||||
|
import {kalshi} from "../platforms/kalshi-fetch.js"
|
||||||
import {ladbrokes} from "../platforms/ladbrokes-fetch.js"
|
import {ladbrokes} from "../platforms/ladbrokes-fetch.js"
|
||||||
import {metaculus} from "../platforms/metaculus-fetch.js"
|
import {metaculus} from "../platforms/metaculus-fetch.js"
|
||||||
import {omen} from "../platforms/omen-fetch.js"
|
import {omen} from "../platforms/omen-fetch.js"
|
||||||
|
@ -37,7 +38,7 @@ export async function tryCatchTryAgain (fun) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
export async function doEverything(){
|
export async function doEverything(){
|
||||||
let functions = [coupcast, csetforetell, elicit, /* estimize, */ fantasyscotus, foretold, /* goodjudgment, */ goodjudgmentopen, hypermind, ladbrokes, metaculus, omen, polymarket, predictit, rootclaim, smarkets, williamhill, mergeEverything, updateHistory, rebuildNetlifySiteWithNewData]
|
let functions = [coupcast, csetforetell, elicit, /* estimize, */ fantasyscotus, foretold, /* goodjudgment, */ goodjudgmentopen, hypermind, ladbrokes, kalshi, metaculus, omen, polymarket, predictit, rootclaim, smarkets, williamhill, mergeEverything, updateHistory, rebuildNetlifySiteWithNewData]
|
||||||
// Removed Good Judgment from the fetcher, doing it using cron instead because cloudflare blocks the utility on heroku.
|
// Removed Good Judgment from the fetcher, doing it using cron instead because cloudflare blocks the utility on heroku.
|
||||||
|
|
||||||
console.log("")
|
console.log("")
|
||||||
|
|
2125
src/utils/evals/metaforecasts.tsv
Normal file
2125
src/utils/evals/metaforecasts.tsv
Normal file
File diff suppressed because it is too large
Load Diff
2125
src/utils/evals/metaforecastsShuffled.tsv
Normal file
2125
src/utils/evals/metaforecastsShuffled.tsv
Normal file
File diff suppressed because it is too large
Load Diff
2
src/utils/evals/notes.sh
Normal file
2
src/utils/evals/notes.sh
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# shuf metaforecasts.tsv > metaforecastsShuffled2.tsv
|
|
@ -1,7 +1,7 @@
|
||||||
import { mongoRead, upsert } from "./mongo-wrapper.js"
|
import { mongoRead, upsert } from "./mongo-wrapper.js"
|
||||||
|
|
||||||
/* Merge everything */
|
/* Merge everything */
|
||||||
let sets = ["astralcodexten","coupcast", "csetforetell", "elicit", "estimize", "fantasyscotus", "foretold", "givewellopenphil", "goodjudgment","goodjudmentopen", "hypermind", "ladbrokes", "metaculus", "omen", "polymarket", "predictit", "rootclaim", "smarkets", "williamhill", "xrisk"]
|
let sets = ["astralcodexten","coupcast", "csetforetell", "elicit", "estimize", "fantasyscotus", "foretold", "givewellopenphil", "goodjudgment","goodjudmentopen", "hypermind", "kalshi", "ladbrokes", "metaculus", "omen", "polymarket", "predictit", "rootclaim", "smarkets", "williamhill", "xrisk"]
|
||||||
let suffix = "-questions"
|
let suffix = "-questions"
|
||||||
|
|
||||||
export async function mergeEverything(){
|
export async function mergeEverything(){
|
||||||
|
|
|
@ -39,7 +39,6 @@ function roughSizeOfObject( object ) {
|
||||||
export async function upsert (contents, documentName, collectionName="metaforecastCollection", databaseName="metaforecastDatabase"){
|
export async function upsert (contents, documentName, collectionName="metaforecastCollection", databaseName="metaforecastDatabase"){
|
||||||
const url = process.env.MONGODB_URL || getCookie("mongodb");
|
const url = process.env.MONGODB_URL || getCookie("mongodb");
|
||||||
const client = new MongoClient(url);
|
const client = new MongoClient(url);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await client.connect();
|
await client.connect();
|
||||||
console.log("Connected correctly to server");
|
console.log("Connected correctly to server");
|
||||||
|
@ -63,7 +62,6 @@ export async function upsert (contents, documentName, collectionName="metaforeca
|
||||||
|
|
||||||
// Find one document
|
// Find one document
|
||||||
const myDocument = await collection.findOne(filter);
|
const myDocument = await collection.findOne(filter);
|
||||||
|
|
||||||
// Print to the console
|
// Print to the console
|
||||||
console.log(`Updating document ${documentName} in collection ${collectionName} in database ${databaseName} with approximate size ${roughSizeOfObject(contents)} MB`)
|
console.log(`Updating document ${documentName} in collection ${collectionName} in database ${databaseName} with approximate size ${roughSizeOfObject(contents)} MB`)
|
||||||
console.log("Sample: ")
|
console.log("Sample: ")
|
||||||
|
@ -184,5 +182,5 @@ export async function mongoGetAllElements(databaseName = "metaforecastDatabase",
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
//mongoGetAllElements()
|
// mongoGetAllElements()
|
||||||
//mongoGetAllElements("metaforecastDatabase", "metaforecastHistory")
|
//mongoGetAllElements("metaforecastDatabase", "metaforecastHistory")
|
29
src/utils/pullForecastsToCSVForRating.js
Normal file
29
src/utils/pullForecastsToCSVForRating.js
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/* Imports */
|
||||||
|
import fs from "fs"
|
||||||
|
import { mongoReadWithReadCredentials } from "./mongo-wrapper.js"
|
||||||
|
|
||||||
|
/* Definitions */
|
||||||
|
|
||||||
|
/* Utilities */
|
||||||
|
|
||||||
|
/* Support functions */
|
||||||
|
|
||||||
|
/* Body */
|
||||||
|
|
||||||
|
let main = async () => {
|
||||||
|
let highQualityPlatforms = ['CSET-foretell', 'Foretold', 'Good Judgment Open', 'Metaculus', 'PredictIt', 'Rootclaim']
|
||||||
|
let json = await mongoReadWithReadCredentials("metaforecasts")
|
||||||
|
console.log(json.length)
|
||||||
|
//let uniquePlatforms = [...new Set(json.map(forecast => forecast.platform))]
|
||||||
|
//console.log(uniquePlatforms)
|
||||||
|
|
||||||
|
let forecastsFromGoodPlatforms = json.filter(forecast => highQualityPlatforms.includes(forecast.platform))
|
||||||
|
let tsv = "index\ttitle\turl\tstars\n"+forecastsFromGoodPlatforms
|
||||||
|
.map((forecast, index) => `${index}\t${forecast.title}\t${forecast.url}\t0`)
|
||||||
|
.join("\n")
|
||||||
|
//console.log(tsv)
|
||||||
|
|
||||||
|
// let string = JSON.stringify(json, null, 2)
|
||||||
|
fs.writeFileSync('evals/metaforecasts.tsv', tsv);
|
||||||
|
}
|
||||||
|
main()
|
12
src/utils/pullSuperforecastsManually.js
Normal file
12
src/utils/pullSuperforecastsManually.js
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
/* Imports */
|
||||||
|
import {goodjudgment} from "../platforms/goodjudgment-fetch.js"
|
||||||
|
|
||||||
|
/* Definitions */
|
||||||
|
|
||||||
|
/* Utilities */
|
||||||
|
|
||||||
|
/* Support functions */
|
||||||
|
|
||||||
|
/* Body */
|
||||||
|
goodjudgment()
|
||||||
|
|
4
src/utils/pullSuperforecastsManually.sh
Executable file
4
src/utils/pullSuperforecastsManually.sh
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/bash
|
||||||
|
cd /home/nuno/Documents/core/software/fresh/js/metaforecasts/metaforecasts-mongo
|
||||||
|
/usr/bin/node ./src/utils/pullSuperforecastsManually.js
|
||||||
|
echo "done" > done.txt
|
|
@ -115,6 +115,22 @@ function calculateStarsHypermind(data) {
|
||||||
return starsInteger
|
return starsInteger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function calculateStarsKalshi(data) {
|
||||||
|
let nuno = data => data.interest > 1000 && data.volume > 1000 ? 4 : 3
|
||||||
|
let eli = (data) => data.interest > 10000 ? 5 : 4
|
||||||
|
let misha = (data) => 4
|
||||||
|
let starsDecimal = average([nuno(data), eli(data), misha(data)])
|
||||||
|
// Substract 1 star if probability is above 90% or below 10%
|
||||||
|
if(data.option &&
|
||||||
|
(data.option.probability < 0.1 || data.option.probability > 0.9)
|
||||||
|
){
|
||||||
|
starsDecimal = starsDecimal - 1
|
||||||
|
}
|
||||||
|
|
||||||
|
let starsInteger = Math.round(starsDecimal)
|
||||||
|
return starsInteger
|
||||||
|
}
|
||||||
|
|
||||||
function calculateStarsLadbrokes(data) {
|
function calculateStarsLadbrokes(data) {
|
||||||
let nuno = data => 2
|
let nuno = data => 2
|
||||||
let eli = (data) => null
|
let eli = (data) => null
|
||||||
|
@ -227,7 +243,10 @@ export function calculateStars(platform, data) {
|
||||||
case "Hypermind":
|
case "Hypermind":
|
||||||
stars = calculateStarsHypermind(data)
|
stars = calculateStarsHypermind(data)
|
||||||
break;
|
break;
|
||||||
case "Hypermind":
|
case "Kalshi":
|
||||||
|
stars = calculateStarsKalshi(data)
|
||||||
|
break;
|
||||||
|
case "Ladbrokes":
|
||||||
stars = calculateStarsLadbrokes(data)
|
stars = calculateStarsLadbrokes(data)
|
||||||
break;
|
break;
|
||||||
case "Metaculus":
|
case "Metaculus":
|
||||||
|
|
Loading…
Reference in New Issue
Block a user