套利计算器的 SQL 语法帮助

问题描述 投票:0回答:1

所以我对 SQL 有点陌生,我正在尝试获取从脚本导入的数据,以便以套利机器人可读的方式进行操作。

这是我到目前为止所拥有的:

Image of database called

run_date/time 是我加载数据的时间,gameid 是代表 NBA 比赛的唯一键,home/away_team 是比赛球队,sportsbook 和 home/away_ml 代表当时该书的赔率,pcts 代表书认为球队获胜的隐含概率。

现在我正在尝试使用这些数据创建一个新表来检查套利,而套利是指 home_pct 和away_pct 的两个隐含概率为 < 1

这是表格:

    CREATE TABLE CombinedPercentages2 (
        run_date datetime,
        run_time time,
        gameid varchar(40),
        home_team varchar(30),
        away_team varchar(30),
        sportsbook_Home varchar(30),
        sportsbook_Away varchar(30),
        home_ml int,
        away_ml int,
        home_pct float,
        away_pct float,
        total_pct float,
        arbitrage_pct float
    );

所以这个数据应该是这样的:仅供参考,每一行的 run_date/run_time/gameid/home_team/away_team 应该是相同的,所以我不写这个。

row 1 should just come out the same as original row 1 but row 2 =
row 2: sportsbook_home = Fanduel sportsbook_away = Pointsbet US home_ml = -10000 away_ml = 4500 home_pct = 0.990 away_pct = 0.0217 total_pct =  (home_pct+away_pct) or .99 +.0217, arbitrage_pct = 1-total_pct
row 3:  sportsbook_home = Fanduel sportsbook_away = mybookie.ag home_ml = -10000    away_ml = 1025  home_pct = 0.990 away_pct = 0.088 total_pct = (home_pct+away_pct) or .99 +.088, arbitrage_pct = 1-total_pct
row 4: sportsbook_home = pointbet US sportsbook_away = Fanduel home_ml = -25000 away_ml = 1700  home_pct = 0.996 away_pct = 0.0555 total_pct = (home_pct+away_pct) or .996 +.0555, arbitrage_pct = 1-total_pct
and so on...

基本上,我试图迭代每个单独的gameid,然后在新的一行中获取每个体育博彩的组合概率与主场体育博彩赔率、客场体育博彩赔率和总/套利百分比。

这应该返回 16 行的 gameid ab73fb40da041c5affd9c554bba24a45 它还应该为 gameid 034de1c59f66e2b5c04929fe7816d90b 返回 81 行 等等..

如果不是Python,可以用sql来完成吗?

任何帮助表示感谢!

我尝试过这个,但它导入了太多的值,而且它们不准确:

    INSERT INTO CombinedPercentages2 (run_date, run_time, gameid, home_team, away_team,                   sportsbook_Home, sportsbook_Away, home_ml, away_ml, home_pct, away_pct, total_pct,arbitrage_pct)
    SELECT
        ng.run_date,
        ng.run_time,
        ng.gameid,
        ng.home_team,
        ng.away_team,
        ng1.sportsbook AS sportsbook_Home,
        ng2.sportsbook AS sportsbook_Away,
        ng1.home_ml,
        ng2.away_ml,
        ng1.home_pct,
        ng2.away_pct,
        (ng1.home_pct + ng2.away_pct) AS total_pct,
        1 - (ng1.home_pct + ng2.away_pct) AS arbitrage_pct
    FROM
        NBAgameoddsML ng
    INNER JOIN
        NBAgameoddsML ng1 ON ng.gameid = ng1.gameid AND ng.sportsbook != ng1.sportsbook
    INNER JOIN
        NBAgameoddsML ng2 ON ng.gameid = ng2.gameid AND ng.sportsbook != ng2.sportsbook
    WHERE
        ng1.home_team = ng.home_team
        AND ng2.away_team = ng.away_team
        AND ng.run_time = '20:20:00.0000000'
    GROUP BY
        ng.run_date,
        ng.run_time,
        ng.gameid,
        ng.home_team,
        ng.away_team,
        ng1.sportsbook,
        ng2.sportsbook,
        ng1.home_ml,
        ng2.away_ml,
        ng1.home_pct,
        ng2.away_pct;



python sql group-by inner-join sql-insert
1个回答
0
投票

我认为可能需要左外连接,因为这在适当的情况下充当交叉连接。

1. Potential pandas solution
import pandas as pd
import numpy as np

# create a dataframe that looks similar to the question
l1 = [["g1", "h1", "a1", "sb1", "hml11", "aml11", "hpct11", "apct11"]]
l1 += [["g1", "h1", "a1", "sb2", "hml12", "aml12", "hpct12", "apct12"]]
l1 += [["g1", "h1", "a1", "sb3", "hml13", "aml13", "hpct13", "apct13"]]
l1 += [["g1", "h1", "a1", "sb4", "hml14", "aml14", "hpct14", "apct14"]]
l1 += [["g2", "h2", "a2", "sb1", "hml21", "aml21", "hpct21", "apct21"]]
l1 += [["g2", "h2", "a2", "sb2", "hml22", "aml22", "hpct22", "apct22"]]

df = pd.DataFrame(l1, columns = ["gameid", "home_team", "away_team", "sportsbook", "home_ml", "away_ml", "home_pct", "away_pct"])

# create home and away dataframes then merge
df1 = df[["gameid", "home_team", "home_ml", "home_pct"]]
df2 = df[["gameid", "away_team", "away_ml", "away_pct"]]
df3 = df1.merge(df2, left_on = ["gameid"], right_on = ["gameid"], how = "left")
# add back in when numbers are available
# df3["total_pct"] = df3["home_pct"] + df3["away_pct"]
# df3["arbitrage_pct"] = 1 - df3["total_pct"]
df3

2. SQL solution

    select ng1.*, ng2.away_team, ng2.sportsbook_Away, ng2.away_ml, ng2.away_pct 
    (ng1.home_pct + ng2.away_pct) AS total_pct, 
    1 - (ng1.home_pct + ng2.away_pct) AS arbitrage_pct
    
    from
    (select 
        run_date,
        run_time,
        gameid,
        home_team,
        sportsbook AS sportsbook_Home,
        home_ml
        home_pct
    ) ng1
    left join 
    (select 
        run_date,
        run_time,
        gameid,
        away_team,
        sportsbook AS sportsbook_Away,
        away_ml
        away_pct
    ) ng2
    left join on ng1.gameid = ng2.gameid
© www.soinside.com 2019 - 2024. All rights reserved.